- 表的操作
- 创建一张学生表
- 字段
- 字段的添加(追加 | first | after)
- 查看表结构
- 字段修改
- 销毁字段
- 表
- 修改表名:
- 修改表注释
- 清空表
- 表的销毁
- 主键约束
- 在创建表的时候添加
- 联合主键
- 表已经存在
- 销毁主键
- 字段约束(unique),唯一约束字段值不能重复
- 主键自增(auto_increment)
- 域完整性 – 保证列的数据正确性
- 增删改查
- 查看建表语句
- 添加(返回影响的记录数) 值是字符串要加引号
- 修改
- 删除(如果没有条件是删除整个表的数据)
- drop delete truncate区别:
- 查询语句DQL
- 复制表
- 查询user表中的所有的记录所有字段
- 算术运算符
- 比较运算符
- 逻辑运算符 and or !
- 位运算符 & | ^
- 查看字符编码
- DQL———————————————————–
- 查询所有字段的数据
- 查询部分字段
- 单一条件查询 where
- 组合条件
- 查询范围
- 集合查询
- 别名(字段,表达式,结果集,表…) [as] 别名
- 去重
- 空判断 is
- 排序 order by 字段 [asc|desc]
- 模糊查询 like %:0-多位 _:代表一位字符
- 限制结果查询 limit index,length
- 函数
- 数学函数
- 字符函数
- 日期函数
- 日期计算函数
- 聚合函数
- 计算总记录数
- 求字段的个数(非空)
- 分组函数
- 加密函数
- 流程函数
- 多表查询
- 查询所有员工的姓名emp及所在的部门的名称dept(分布在多张表)
- 内连接
- 外连接
- 自连接
- 嵌套查询(子查询)
- 案例:
- 联合查询
表的操作
创建一张学生表
create table student(
sid int,
sname varchar(20)
);
字段
字段的添加(追加 | first | after)
alter table student add sex bit(1); # 追加
alter table student add email varchar(20) first; # 最前面
alter table student add birthday date after sid; # 在什么后
查看表结构
desc student;
字段修改
alter table student change email semail varchar(20) after sid;
alter table student modify semail varchar(50);
销毁字段
alter table student drop semail;
表
修改表名:
rename table student to stu;
alter table stu rename to student;
修改表注释
alter table student comment '学生表';
清空表
truncate table student;
表的销毁
drop table student;
主键约束
在创建表的时候添加
create table student(
sid int primary key,
sname varchar(20),
brithday date
);
create table student(
sid int,
sname varchar(20),
brithday date,
primary key(sid)
);
联合主键
create table student(
sid int,
sname varchar(20),
brithday date,
primary key(sid,sname)
);
表已经存在
alter table student add constraint PK_SID primary key(sid);
alter table student add constraint PK_SID primary key(sid,sname); # 联合主键
销毁主键
alter table student sid drop primary key;
字段约束(unique),唯一约束字段值不能重复
create table student(
sid int primary key,
sname varchar(20) unique,
brithday date
);
create table student(
sid int primary key,
sname varchar(20),
brithday date,
unique(sname)
);
# 修改表结构添加唯一约束
alter table student add CONSTRAINT UN_SNAME unique(sname);
# 销毁:
drop unique index UN_SNAME on student;
主键自增(auto_increment)
create table student(
sid int primary key auto_increment,
sname varchar(20),
brithday date,
unique(sname)
);
域完整性 – 保证列的数据正确性
# 类型约束
# 非空约束(not null)
# 默认值(default)
create table userinfo(
uid int primary key auto_increment,
username varchar(20) not null,
sex bit(1) default 1
);
# 引用完整性
# 保证表中字段值的有效
# 外键约束(foreign key)
# 表中外键字段的取值需要依赖于另张表的主键的取值
CREATE TABLE `student` (
`sid` int(11) NOT NULL AUTO_INCREMENT,
`sname` varchar(20) DEFAULT NULL,
`cid` int(11) DEFAULT NULL,
PRIMARY KEY (`sid`),
UNIQUE KEY `sname` (`sname`),
KEY `FK_CID` (`cid`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4
CREATE TABLE `classroom` (
`cid` int(11) NOT NULL,
`cname` varchar(25) NOT NULL,
PRIMARY KEY (`cid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
# 添加外键
alter table student add constraint FK_CID foreign key(cid) references classroom(cid);
# 删除外键
alter table student drop foreign key FK_CID;
增删改查
查看建表语句
show create table student;
添加(返回影响的记录数) 值是字符串要加引号
# 代表多有字段都添加值(值的顺序和表的字段的顺序一样)
insert into userinfo values (1,'ls',1);
# 给部分字段添加值(值顺序和前面的字段顺序一致)
insert into userinfo (username,sex) values ('ww',1);
# 批处理(添加多条记录)
insert into userinfo (username,sex) values ('oo',1),('pp',1),('tt',0);
# 复制表
# 复制表结构
create table user select * from userinfo where 0;
# 把表数据插过来
insert into user select * from userinfo;
# <==> 等价上面两句
create table user select * from userinfo;
修改
update userinfo set sex = 0 where username = 'ww';
update userinfo set sex = 1 where uid = 5;
删除(如果没有条件是删除整个表的数据)
delete from userinfo where uid = 5;
delete from user; # 清空表数据
truncate table userinfo; # 清空表数据
# delete 不会重置自增,逐行删除
# truncate 清空表,重置自增
select * from user;
select * from student;
drop delete truncate区别:
# drop 删除表及数据
# delete 逐行删除
# truncate 清空表数据
查询语句DQL
复制表
insert into user select * from userinfo;
查询user表中的所有的记录所有字段
select * from user;
# * :通配符
# 表达式/字段
算术运算符
select 1+1; #2
select 1-1; #0
select 1*1; #1
select 5/2; #2.5000
select 5%2; #1
select 3/0; #null
select 5 div 2; #取整
比较运算符
#结果? true--> 1 / false ---> 0
select 1=1; #1
select 1!=1; #0
select 1<>1; #0
逻辑运算符 and or !
# 结果? true--> 1 / false ---> 0
select 1>2 and 1<2; # 0
select 1>2 or 1<2; # 1
select !(1>2); # 1
位运算符 & | ^
# &:按位与 有一侧为0结果为0
select 3 & 2 # 2
# |:按位或 有一侧为1结果为1
select 3 | 2 # 3
# ^:按位异或 两侧数据一样取0,两侧数据不一样取1
select 3 ^ 2 # 1
查看字符编码
show variables like '%char%';
# character_set_client utf8mb4
# character_set_connection utf8mb4
# character_set_database utf8mb4
# character_set_filesystem binary
# character_set_results utf8mb4
# character_set_server utf8mb4
# character_set_system utf8
# character_sets_dir /www/server/mysql/share/charsets/
DQL———————————————————–
# select 子句 #表达式/字段,结果集中展示的内容
# from 子句 #表/结果集/视图,数据的来源
# where 子句 #条件(单个条件,组合条件)
# order by 子句 #排序
# group by 子句 #分组
# having 子句 #分组之后条件
# limit 子句 #限制结果查询(mysql方言) 分页
查询所有字段的数据
select * from emp;
查询部分字段
# 查询员工的编号和名称
select empno,ename from emp;
单一条件查询 where
# 查询20号部门的员工的所有的信息
select * from emp where deptno = 20;
组合条件
# 查询20号部门工资大于2000的员工信息
select * from emp where deptno = 20 and sal > 2000;
# 查询员工编号为7788,7521,7369的员工信息
select * from emp where empno = 7788 or empno = 7521 or empno = 7369;
查询范围
# 查询员工工资在1000到2000之间的员工信息
select * from emp where sal >=1000 and sal <= 2000;
select * from emp where sal between 1000 and 2000;
集合查询
# 查询员工编号为7788,7521,7369的员工信息
select * from emp where empno in (7788,7521,7369);
别名(字段,表达式,结果集,表…) [as] 别名
# 查询员工工资提升5%之后的样子
select ename,sal*1.05 sal from emp;
select e.ename from emp e;
去重
# 查询所有的职位
select distinct(job) from emp;
空判断 is
# 查询没有奖金的员工信息
select * from emp where comm is null;
# 查询有奖金的员工信息
select * from emp where comm is not null;
排序 order by 字段 [asc|desc]
# 查询员工工资排序-升序
select * from emp order by sal;
select * from emp order by sal asc;
# 查询员工工资排序-降序
select * from emp order by sal desc;
# 查询员工工资排序-降序,并列时empno排序
select * from emp order by sal desc,empno desc; #并列时第二排序
模糊查询 like %:0-多位 _:代表一位字符
# 查询名字中包含S的员工信息
select * from emp where ename like 's%'; # s开头
select * from emp where ename like '%s'; # s结尾
select * from emp where ename like '%s%'; # 包含s
# 如果查询第二位为L的员工信息
select * from emp where ename like '_l%';
限制结果查询 limit index,length
# 查询前5条记录
select * from emp limit 5;
select * from emp limit 1,5;
函数
数学函数
select abs(-10);
select ceil(10.5); # 相上取整
select floor(10.5); # 向下取整
select rand(); # 取随机数
select round(12.46); # 四舍五入
select round(12.46,1); # 四舍五入
字符函数
select length('abc'); # 获取字符串长度
select length(ename) from emp;
日期函数
select now(); # 获取当前2020-12-24 13:45:22
select current_date(); # 获取当前 2020-12-24
select CURRENT_TIME(); # 获取当前 13:47:05
select CURRENT_TIMESTAMP(); # 获取当前时间戳
select YEAR(NOW()); # 获取当前年份
select YEAR('2018-08-08'); # 获取年份
select MONTH(NOW()); # 获取当前月份
select DAY(NOW()); # 获取当前是几号
日期计算函数
# 两周前
select DATE_ADD(NOW(),interval - 2 WEEK); # 不能使用组合
select DATE_ADD('2019-03-02',interval 5 day);
select last_day('2016-02-03'); # 获取给定日期月的最后一天
聚合函数
select max(sal) from emp;
select min(sal) from emp;
select avg(sal) from emp;
select sum(sal) from emp;
计算总记录数
select count(*) from emp;
select count(1) from emp;
求字段的个数(非空)
select count(comm) from emp;
分组函数
# 每个部分的平均工资
# 将数据划分为更小的小组,然后进行计算
# group by 字段:根据字段值的不同划分为多个小组,每个小组返回一条记录
# 在select子句中能够出现聚合函数,只能出现分组字段
select deptno,avg(sal) from emp group by deptno;
# 平均工资大于2000的部门编号及平均工资
select deptno,avg(sal) avg from emp group by deptno having avg >= 2000;
# having: 和where作用一致,但是出现在group by之后,主要分组之后再次进行过滤
# 1. where只能出现在group by之前
# 2. where中不能出现聚合函数
加密函数
select md5('root');
流程函数
# 若果expr1是真,返回expr2,否则返回expr3
# IF(expr1,expr2,expr3)
select if(1>2,1,0)
# 如果expr1不是NULL,返回expr1,否则返回expr2
# IFNULL(expr1,expr2)
select ifnull(comm,0) from emp;
# 如果value是真,返回result1,否则返回default
case when [value1] then[result1] else[defaut] end
# 如果expr等于value1,返回result1,否则返回default
case [expr] when [value1] then[resultq] else[default] end
# >=90 A <=90 and >=70 B <70 C
select sname,
case
when score >= 90 then 'A'
when score < 90 and score >= 70 then 'B'
else 'C'
end level
from student;
select sname,
case
when score >= 90 then 'A'
when score < 90 and score >= 70 then 'B'
when score < 70 then 'C'
end level
from student;
多表查询
查询所有员工的姓名emp及所在的部门的名称dept(分布在多张表)
内连接
# 1.与连接顺序没有关系(没有主从表(主次))
# 2.多张表都能匹配的数据才能出现在结果集中
select ename,job from emp,dept where emp.deptno = dept.deptno; # 方言
select * from emp a INNER JOIN dept b on a.deptno = b.deptno; # 标准
# 1.前提:关联字段名称必须是一样,而且是等值连接
# 优点:自动去重字段
select * from emp inner join dept using(deptno);
外连接
# 1.与连接顺序有关(主从表之分,驱动表/附属表)
# 2.以主表为基准,依次在主从表中寻找关联的记录,如果匹配则关联并展示在结果中,否则以null填充
select * from emp a left JOIN dept b on a.deptno = b.deptno;
select * from dept a left JOIN emp b on a.deptno = b.deptno;
自连接
# 查询员工及其领导的姓名
select a.ename 员工,b.ename 领导 from emp a, emp b where a.mgr = b.empno;
嵌套查询(子查询)
# 查询编号为7788的员工所在的部门名称
# 1.连接查询
select dname from emp,dept where emp.deptno = dept.deptno and empno = 7788;
# 2.其他方式(分步)-- 单行子查询:子查询返回的结果单行单列
select dname from dept where deptno = (select deptno from emp where empno = 7788);
# 多行子查询:子查询返回的结果是多行
# 薪水>2000的员工所在的部门的名称
select dname from dept where deptno in (select distinct deptno from emp where sal > 2000);
# in
# any: =any:相当于in >any: 大于最小值 <any:小于最大值
# all: >all: 大于最大值 <all:小于最小值
# 查询30号部门工资次高的的员工信息
select * from emp where sal = (select max(sal) from emp where sal <any(select distinct sal from emp where deptno = 20 ORDER BY sal desc));
案例:
# 1.查询薪水超过所在部门平均工资的员工信息
# 采用连接
select a.* from emp a,(select deptno,avg(sal) pj from emp GROUP BY 1) b where a.deptno = b.deptno and sal > pj;
# 采用子查询
select * from emp a where sal > (select AVG(sal) from emp b where b.deptno = a.deptno);
1.主查询传递deptno给子查询
2.子查询根据传递的deptno查询出所在部门的平均工资返回给主查询
3.主查询根据子查询返回的部门平均工资来处理后续
# 2.薪水>2000的员工所在的部门的名称
select dname from dept where deptno in (select distinct deptno from emp where sal > 2000);
# in和exists的区别
# in先执行子查询,在执行主查询;exists先执行主查询;
# exists子查询不返回具体结果,返回true值出现在结果集,否则不出现。
select dname from dept where exists(select * from emp where sal > 2000 and emp.deptno = dept.deptno);
# exists考虑的是匹配的问题:
# 先执行主查询,将主查询的记录依次交给子查询进行匹配,如果能够匹配则子查询返回true,主查询的结果显示在结果集;否则不显示。
联合查询
# 查询20号部门或者工资>2000的员工的信息
select * from emp where deptno = 20 or sal > 2000;
# union: 并集,所有的内容都查询,重复的显示一次
select * from emp where deptno = 20 union select * from emp where sal > 2000;
# union all: 并集,所有的内容都显示,包括重复的
select * from emp where deptno = 20 union all select * from emp where sal > 2000;
文档更新时间: 2021-02-25 10:51 作者:李延召