赞
踩
目录
1.数据库:DataBase 简称 DB。按照一定格式存储数据的一些文件的组合。
(顾名思义:存储数据的仓库,实际上就是一堆文件。这些文件中存储了
具有特定格式的数据。)
2.数据库管理系统:DataBaseManagement,简称DBMS 数据库管理系统是专门用来管理数 据库中数据的,数据库管理系统可以 对数据库当中的数据进行增删改查。
(常见的数据库管理系统: MySQL、Oracle、MS SqlServer、DB2、sybase等....)
3.SQL结构化查询语言
程序员需要学习SQL语句,程序员通过编写SQL语句,然后DBMS负责执行SQL语句,最终来完成数据库中数据的增删改查操作。 SQL是一套标准,程序员主要学习的就是SQL语句,这个SQL在mysql中可以使用,同时在Oracle中也可以使用,在DB2中也可以使用。
三者之间的关系:DBMS--执行--> SQL --操作--> DB
安装MySQL数据库管理系统。
第一步:先安装,选择“经典版”
第二步:需要进行MySQL数据库实例配置。
注意:一路下一步就行了!!!!!
需要注意的事项?常识
端口号:
端口号port是任何一个软件/应用都会有的,端口号是应用的唯一代表。
端口号通常和IP地址在一块,IP地址用来定位计算机的,端口号port
是用来定位计算机上某个服务的/某个应用的!
在同一台计算机上,端口号不能重复。具有唯一性。mysql数据库启动的时候,这个服务占有的默认端口号是3306
记住。
字符编码方式?
设置mysql数据库的字符编码方式为 UTF8(set names gbk;)
一定要注意:先选中第3个单选按钮,然后再选择utf8字符集。
服务名称?
默认是:MySQL
不用改。
选择配置环境变量path:
如果没有选择怎么办?你可以手动配置
path=其它路径;C:\Program Files (x86)\MySQL\MySQL Server 5.5\bin
mysql超级管理员用户名不能改,一定是:root
你需要设置mysql数据库超级管理员的密码。
我们设置为123456 (好记一点)设置密码的同时,可以激活root账户远程访问。
激活:表示root账号可以在外地登录。
不激活:表示root账号只能在本机上使用。
我这里选择激活了!
第一步:双击安装包进行卸载删除。
第二步:删除目录:
把C:\ProgramData下面的MySQL目录干掉。(这里边都是数据库)
把C:\Program Files (x86)下面的MySQL目录干掉。
这样就卸载结束了!
计算机-->右键-->管理-->服务和应用程序-->服务-->找mysql服务
MySQL的服务,默认是“启动”的状态,只有启动了mysql才能用。
默认情况下是“自动”启动,自动启动表示下一次重启操作系统的时候
自动启动该服务。
可以在服务上点击右键:
启动
重启服务
停止服务
...
还可以改变服务的默认配置:
服务上点击右键,属性,然后可以选择启动方式:
自动(延迟启动)
自动
手动
禁用了解
在windows操作系统当中,怎么使用命令来启动和关闭mysql服务呢?
语法:
net stop 服务名称;
net start 服务名称;其它服务的启停都可以采用以上的命令。
1.电脑 win+r 输入cmd 进入黑窗口
退出mysql :exit
1.查看mysql中有哪些数据库? show databases;默认自带了4个数据库
2.使用数据库: use text; ---text数据库名称
3.创建数据库: create database text;---text数据库名称
4.查看某个数据库下有哪些表? show tables;
5.查看数据库版本号: select version();
6.查看当前使用的是哪个数据库? select database();
7.查看表table中的所有数据 select * from 表名;
8.不看表中的数据,只看表结构:desc 表名;
注意:mysql是不见“;” 不执行 “;” 表示结束!
\c 用来终止一条命令的输入
任何一张表都有行和列:
行(row):被称为数据/记录。
列(column):被称为字段。 姓名字段、性别字段、年龄字段。
1. DQL:
数据查询语言(凡是带有select关键字的都是查询语句) select...
2. DML:
数据操作语言(凡是对表当中的数据进行增删改的都是DML)
insert delete update
insert 增
delete 删
update 改
这个主要是操作表中的数据data。
3. DDL:
数据定义语言
凡是带有create、drop、alter的都是DDL。
DDL主要操作的是表的结构。不是表中的数据。
create:新建,等同于增
drop:删除
alter:修改
这个增删改和DML不同,这个主要是对表结构进行操作。
4.TCL:
是事务控制语言
包括:
事务提交:commit;
事务回滚:rollback;
5.DCL:
是数据控制语言。
例如:授权grant、撤销权限revoke....
SQL语句有很多,最好进行分门别类,这样更容易记忆。
mysql> source D:\course\MySQL\document\power.sql
注意:路径中不要有中文!!!!
6.1:
查询一个字段: select 字段名 from 表名
select和from都是关键字。
字段名和表名都是标识符。
强调:
对于SQL语句来说,是通用的,
所有的SQL语句以“;”结尾。
另外SQL语句不区分大小写,都行。
6.2:
查询两个字段,或者多个字段 使用 “,” 隔开 select deptno,dname from dept;
6.3:查询所有字段: select * from dept;
dept 表名 deptno,dname字段名
查看所有数据
这种方式的缺点:
1、效率低
2、可读性差。
在实际开发中不建议,可以自己玩没问题。
你可以在DOS命令窗口中想快速的看一看全表数据可以采用这种方式。
6.4: 给查询的列起别名:
select deptno,dname as deptname from dept;
使用as关键字起别名。 select deptno,dname deptname from dept; (也可以省略as)
注意:只是将显示的查询结果列名显示为deptname,原表列名还是叫:dname
记住:select语句是永远都不会进行修改操作的。(因为只负责查询)
起别名的时候遇到空格
mysql> select deptno,dname dept name from dept;
DBMS看到这样的语句,进行SQL语句的编译,不符合语法,编译报错
select deptno,dname 'dept name' from dept; //加单引号
select deptno,dname "dept name" from dept; //加双引号
注意:在所有的数据库当中,字符串统一使用单引号括起来,
单引号是标准,双引号在oracle数据库中用不了。但是在mysql
中可以使用。再次强调:数据库中的字符串都是采用单引号括起来。这是标准的。
双引号不标准。
6.5:计算员工 年工资
select ename,sal*12 from emp;
1. select ename,sal*12 from emp;//字段可以使用数学表达式!
2.select ename,sal*12 as yearsal from emp; //起别名
3.select ename,sal*12 as '年薪' from emp; //别名是中文,用单引号括起来。
不是将表中所有数据都查出来。是查询出来符合条件的。
语法格式:
select 字段1,字段2,字段3.... from 表名 where 条件;
例如:select empno,ename from emp where sal = 800;
select empno,sal from emp where ename = 'SMITH'; //字符串使用单引号
都有哪些条件?
1.= 等于 <>或!= 不等于 < 小于 <= 小于等于 > 大于 >= 大于等于
select empno,ename from emp where sal != 800;
select empno,ename from emp where sal <> 800; // 小于号和大于号组成的不等号
2.
between … and …. 两个值之间, 等同于 >= and <=
注意:
使用between and的时候,必须遵循左小右大。
between and是闭区间,包括两端的值。
3. is null 为 null(is not null 不为空)
注意:在数据库当中null不能使用等号进行衡量。需要使用is null因为数据库中的null代表什么也没有,它不是一个值,所以不能使用等号衡量。
4.and 并且 or或者
4.1查询工作岗位是MANAGER并且工资大于2500的员工信息? and 并且
4.2查询工作岗位是MANAGER和SALESMAN的员工? or 或者
and和or同时出现的话,有优先级问题吗?
查询工资大于2500,并且部门编号为10或20部门的员工?
select
*
from
emp
where
sal > 2500 and deptno = 10 or deptno = 20;
分析以上语句的问题?
and优先级比or高。
以上语句会先执行and,然后执行or。
以上这个语句表示什么含义?
找出工资大于2500并且部门编号为10的员工,或者20部门所有员工找出来。
select
*
from
emp
where
sal > 2500 and (deptno = 10 or deptno = 20);
and和or同时出现,and优先级较高。如果想让or先执行,需要加“小括号”
以后在开发中,如果不确定优先级,就加小括号就行了。
5.in 包含,相当于多个 or (not in 不在这个范围中)
查询工作岗位是MANAGER和SALESMAN的员工?
select empno,ename,job from emp where job = 'MANAGER' or job = 'SALESMAN';
select empno,ename,job from emp where job in('MANAGER', 'SALESMAN');
注意:in不是一个区间。in后面跟的是具体的值。
查询薪资是800和5000的员工信息?
select ename,sal from emp where sal = 800 or sal = 5000;
select ename,sal from emp where sal in(800, 5000); //这个不是表示800到5000都找出来。
// not in 表示不在这几个值当中的数据。
select ename,sal from emp where sal not in(800, 5000, 3000);
6. not 可以取非,主要用在 is 或 in 中
is null
is not null
in
not in
7.like称为模糊查询,支持%或下划线匹配 **********
%匹配任意多个字符
下划线:任意一个字符。
(%是一个特殊的符号,_ 也是一个特殊符号)
找出名字中含有O的?
mysql> select ename from emp where ename like '%O%';
找出名字以T结尾的?
select ename from emp where ename like '%T';
找出名字以K开始的?
select ename from emp where ename like 'K%';
找出第二个字每是A的?
select ename from emp where ename like '_A%';
找出第三个字母是R的?
select ename from emp where ename like '__R%';
找出名字中有“_”的?
select name from t_student where name like '%_%'; //这样不行。mysql> select name from t_student where name like '%\_%'; // \转义字符。
1.排序: select ename,sal from order by sal; // 默认升序
指定降序: select enamel,sal from emp order by sal desc;
指定升序?
select
ename,sal
from
emp
order by
sal asc;
2.两个字段排序或者多个字段排序
查询员工名字和薪资,要求按照薪资升序,如果薪资一样的话,
再按照名字升序排列。
select
ename,sal
from
emp
order by
sal asc, ename asc; // sal在前,起主导,只有sal相等的时候,才会考虑启用ename排序。
了解:根据字段的位置也可以排序
select ename,sal from emp order by 2; // 2表示第二列。第二列是sal
按照查询结果的第2列sal排序。了解一下,不建议在开发中这样写,因为不健壮。
因为列的顺序很容易发生改变,列顺序修改之后,2就废了
关键字顺序不能变:
select
...
from
...
where
...
order by
...
以上语句的执行顺序必须掌握:
第一步:from
第二步:where
第三步:select
第四步:order by(排序总是在最后执行!)
数据处理函数又被称为单行处理函数
单行处理函数的特点:一个输入对应一个输出。
和单行处理函数相对的是:多行处理函数。(多行处理函数特点:多个输入,对应1个输出!)
1.1 lower 转小写 select lower(ename) as ename from emp;
1.2 upper 转换大写 select upper(name) as name from t_student;
1.3 substr( 被截取的字符串, 起始下标,截取的长度)
select substr(ename, 1, 1) as ename from emp;
注意:起始下标从1开始,没有0.
1.4 concat函数进行字符串的拼接 select concat(empno,ename) from emp;
1.5 length() 取长度 select length(ename) enamelength from emp;
1.6 trim() 去空格 select * from emp where ename = trim(' KING');
1.7 round() 四舍五入
select round(1236.567, 1) as result from emp; //保留1个小数
select round(1236.567, 2) as result from emp; //保留2个小数
select round(1236.567, -1) as result from emp; // 保留到十位。
1.8 rand() 生成随机数 select round(rand()*100,0) from emp; // 100以内的随机数
1.9** ifnull 可以将 null 转换成一个具体值 ifnull是空处理函数。专门处理空的。
注意:NULL只要参与运算,最终结果一定是NULL。为了避免这个现象,需要使用ifnull函数。
ifnull函数用法:ifnull(数据, 被当做哪个值)
如果“数据”为NULL的时候,把这个数据结构当做哪个值。
补助为NULL的时候,将补助当做0
select ename, (sal + ifnull(comm, 0)) * 12 as yearsal from emp;
多行处理函数的特点:输入多行,最终输出一行。
5个:
count 计数 select count(ename) from emp;
sum 求和 mysql> select sum(sal) from emp;
avg 平均值 select avg(sal) from emp;
max 最大值 select max(sal) from emp;
min 最小值 mysql> select min(sal) from emp;
注意:
分组函数在使用的时候必须先进行分组,然后才能用。
如果你没有对数据进行分组,整张表默认为一组。
分组函数在使用的时候需要注意哪些?
第一点:分组函数自动忽略NULL,你不需要提前对NULL进行处理。
第二点:分组函数中count(*)和count(具体字段)有什么区别?
count(具体字段):表示统计该字段下所有不为NULL的元素的总数。
count(*):统计表当中的总行数。(只要有一行数据count则++)
因为每一行记录不可能都为NULL,一行数据中有一列不为NULL,则这行数据就是有效的。第三点:分组函数不能够直接使用在where子句中。
第四点:所有的分组函数可以组合起来一起用。
select sum(sal),min(sal),max(sal),avg(sal),count(*) from emp;
19.1、什么是分组查询?
在实际的应用中,可能有这样的需求,需要先进行分组,然后对每一组的数据进行操作。
这个时候我们需要使用分组查询,怎么进行分组查询呢?
select ... from...group by ...
计算每个部门的工资和?
计算每个工作岗位的平均薪资?
找出每个工作岗位的最高薪资?
....
19.2、将之前的关键字全部组合在一起,来看一下他们的执行顺序?
select
...
from
...
where
...
group by
...
order by
...
以上关键字的顺序不能颠倒,需要记忆。
执行顺序是什么?
1. from
2. where
3. group by
4. select
5. order by
为什么分组函数不能直接使用在where后面?
select ename,sal from emp where sal > min(sal);//报错。
因为分组函数在使用的时候必须先分组之后才能使用。
where执行的时候,还没有分组。所以where后面不能出现分组函数。
select sum(sal) from emp;
这个没有分组,为啥sum()函数可以用呢?
因为select在group by之后执行。
19.3、找出每个工作岗位的工资和?
实现思路:按照工作岗位分组,然后对工资求和。
select
job,sum(sal)
from
emp
group by
job;
+-----------+----------+
| job | sum(sal) |
+-----------+----------+
| ANALYST | 6000.00 |
| CLERK | 4150.00 |
| MANAGER | 8275.00 |
| PRESIDENT | 5000.00 |
| SALESMAN | 5600.00 |
+-----------+----------+
以上这个语句的执行顺序?
先从emp表中查询数据。
根据job字段进行分组。
然后对每一组的数据进行sum(sal)
select ename,job,sum(sal) from emp group by job;
+-------+-----------+----------+
| ename | job | sum(sal) |
+-------+-----------+----------+
| SCOTT | ANALYST | 6000.00 |
| SMITH | CLERK | 4150.00 |
| JONES | MANAGER | 8275.00 |
| KING | PRESIDENT | 5000.00 |
| ALLEN | SALESMAN | 5600.00 |
+-------+-----------+----------+
以上语句在mysql中可以执行,但是毫无意义。
以上语句在oracle中执行报错。
oracle的语法比mysql的语法严格。(mysql的语法相对来说松散一些!)
重点结论:
在一条select语句当中,如果有group by语句的话,
select后面只能跟:参加分组的字段,以及分组函数。
其它的一律不能跟。
having
SELECT 字段列表 FROM 表名 [WHERE 分组前条件限定] GROUP BY 分组字段名 [HAVING 分组后条件过滤];
having和where区别:
执行时机不一样:where 是分组之前进行限定,不满足where条件,则不参与分组,而having是分组之后对结果进行过滤。
可判断的条件不一样:where 不能对聚合函数(单行处理函数 )进行判断,having 可以。
select 字段列表 from 表名 limit 起始索引 , 查询条目数;
注意: 上述语句中的起始索引是从0开始
练:
select * from stu limit 0 , 3; //从0索引开始查,一页最多显示3个
起始索引 = (当前页码 - 1) * 每页显示的条数
建表属于DDL语句,DDL包括:create drop alter
create table 表名(字段名1 数据类型, 字段名2 数据类型, 字段名3 数据类型);
create table 表名(
字段名1 数据类型,
字段名2 数据类型,
字段名3 数据类型
);
表名:建议以t_ 或者 tbl_开始,可读性强。见名知意。
字段名:见名知意。
表名和字段名都属于标识符。
练:
1. varchar(最长255)
可变长度的字符串
比较智能,节省空间。
会根据实际的数据长度动态分配空间。
优点:节省空间
缺点:需要动态分配空间,速度慢。
2. char(最长255)
定长字符串
不管实际的数据长度是多少。
分配固定长度的空间去存储数据。
使用不恰当的时候,可能会导致空间的浪费。
优点:不需要动态分配空间,速度快。
缺点:使用不当可能会导致空间的浪费。
注意:
varchar和char我们应该怎么选择?
性别字段你选什么?因为性别是固定长度的字符串,所以选择char。
姓名字段你选什么?每一个人的名字长度不同,所以选择varchar。
3. int(最长11)
数字中的整数型。等同于java的int。
4. bigint
数字中的长整型。等同于java中的long。
5. float
单精度浮点型数据
6. double
双精度浮点型数据
7. date
短日期类型
8. datetime
长日期类型
9. clob
字符大对象
最多可以存储4G的字符串。
比如:存储一篇文章,存储一个说明。
超过255个字符的都要采用CLOB字符大对象来存储。
Character Large OBject:CLOB
10. blob
二进制大对象
Binary Large OBject
专门用来存储图片、声音、视频等流媒体数据。
往BLOB类型的字段上插入数据的时候,例如插入一个图片、视频等,
你需要使用IO流才行。
设计数据库里的表字段的时候,一般不会让java开发来设计活写,一般都会有数据库管理员,来对表进行增删改查等等。。
插入数据insert (DML)
insert into 表名(字段名1,字段名2,字段名3...) values(值1,值2,值3);
注意:字段名和值要一一对应。什么是一一对应?
数量要对应。数据类型要对应。注意:insert语句但凡是执行成功了,那么必然会多一条记录。
没有给其它字段指定值的话,默认值是NULL。
- insert into t_student(no,name,sex,age,email) values(1,'zhangsan','m',20,'zhangsan@123.com');
- insert into t_student(email,name,sex,age,no) values('lisi@123.com','lisi','f',20,2);
insert语句中的“字段名”可以省略吗?可以
insert into t_student values(2); //错误的// 注意:前面的字段名省略的话,等于都写上了!所以值也要都写上!
- drop table if exists t_student;
- create table t_student(
- no int,
- name varchar(32),
- sex char(1) default 'm',
- age int(3),
- email varchar(255)
- );
- #insert into t_student values(2); //错误的
-
- insert into t_student values(2, 'lisi', 'f', 20, 'lisi@123.com');
一次插入多条语句
- 一次可以插入多条记录:
- insert into t_user(id,name,birth,create_time) values
- (1,'zs','1980-10-11',now()),
- (2,'lisi','1981-10-11',now()),
- (3,'wangwu','1982-10-11',now());
-
- 语法:insert into t_user(字段名1,字段名2) values(),(),(),();
update 表名 set 字段名1=值1,字段名2=值2,字段名3=值3... where 条件;
注意:没有条件限制会导致所有数据全部更新。
update t_user set name = 'jack', birth = '2000-10-11' where id = 2;
删除数据 delete (DML) delete from 表名 where 条件;
注意:没有条件,整张表的数据会全部删除!!!!!
- delete from t_user where id = 2;
-
- insert into t_user(id) values(2);
-
- delete from t_user; // 删除所有!
约束是作用于表中列上的规则,用于限制加入表的数据
例如:我们可以给id列加约束,让其值不能重复,不能为null值。
约束的存在保证了数据库中数据的正确性、有效性和完整性
添加约束可以在添加数据的时候就限制不正确的数据,年龄是3000,数学成绩是-5分这样无效的数据,继而保障数据的完整性。
主键是一行数据的唯一标识,要求非空且唯一。一般我们都会给没张表添加一个主键列用来唯一标识数据。
主键约束的相关术语?
主键约束:就是一种约束。
主键字段:该字段上添加了主键约束,这样的字段叫做:主键字段
主键值:主键字段中的每一个值都叫做:主键值。
什么是主键?有啥用?
主键值是每一行记录的唯一标识。
主键值是每一行记录的身份证号!!!
记住:任何一张表都应该有主键,没有主键,表无效!!
怎么给一张表添加主键约束呢?
- drop table if exists t_vip;
- // 1个字段做主键,叫做:单一主键
- create table t_vip(
- id int primary key, //列级约束
- name varchar(255)
- );
- insert into t_vip(id,name) values(1,'zhangsan');
- insert into t_vip(id,name) values(2,'lisi');
这个mysql 里的注释是 # 或 -- 我这里先就这样写
//错误:不能重复
insert into t_vip(id,name) values(2,'wangwu');
ERROR 1062 (23000): Duplicate entry '2' for key 'PRIMARY'//错误:不能为NULL
insert into t_vip(name) values('zhaoliu');
ERROR 1364 (HY000): Field 'id' doesn't have a default value
非空约束: 关键字是 NOT NULL
保证列中所有的数据不能有null值。
- -- 创建表时添加非空约束
- CREATE TABLE 表名(
- 列名 数据类型 NOT NULL,
- …
- );
唯一约束用于保证列中所有数据各不相同
- -- 创建表时添加唯一约束
- CREATE TABLE 表名(
- 列名 数据类型 UNIQUE [AUTO_INCREMENT],
- -- AUTO_INCREMENT: 当不指定值时自动增长
- …
- );
- CREATE TABLE 表名(
- 列名 数据类型,
- …
- [CONSTRAINT] [约束名称] UNIQUE(列名)
- );
保存数据时,未指定值则采用默认值
- -- 创建表时添加默认约束
- CREATE TABLE 表名(
- 列名 数据类型 DEFAULT 默认值,
- …
- );
约束总结:
-- 唯一约束 unique
-- 默认值 default
-- 不能为 null not NULL
-- 主键约束 PRIMARY key auto_increment 主键自增
具体看业务
1.表关系:
1.1 一对一:
一对一关系多用于表拆分,将一个实体中经常使用的字段放一张表,不经常使用的字段放另一张表,用于提升查询性能
1.2一对多:
一个部门对应多个员工,一个员工对应一个部门
1.3多对多:
一个商品对应多个订单,一个订单包含多个商品。
具体详情等我有空 把数据库通吃
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。