目录
5.1.2inner join、left join、right join的区别?
1.数据库常用操作
1.1创建数据库(create)
create database 库名 DEFAULT CHARACTER SET utf8;
例如:创建数据库,数据库名称:cgb2022create database cgb2022 DEFAULT CHARACTER SET utf8;
1.2删库(drop)
drop database 库名;
例如:删除名称是cgb2022的数据库
drop database cgb2022;
1.3查看所有数据库 (show)
show databases;
2表的常用操作
2.1创建表
例如:
创建tb_door表,有id,door_name,tel字段
create table tb_door(
id int primary key auto_increment, //设置自增主键id
door_name varchar(100), //字段door_name
tel varchar(50) //字段tel
);
2.2修改表
添加列:alter table 表名 add column 列名 类型(长度)
alter table tb_door add column money NUMERIC(7,2)
numeric(a,b)
a代表整数位加小数位的总位数(不算小数点),b代表小数位的位数。
2.3删除表(drop)
删除表:
drop table 表名
例如:
删除名称是tb_door的表:drop table tb_door;
2.4查看所有表(show)
show tables;
2.5查看表的结构、设计表(desc)
desc 表名
例如:
查看tb_door:desc tb_door;
3.表记录的常用操作
3.1插入数据
insert into 表名 values (字段1,字段2,字段3);
例如:
向tb_door表中插入2条记录:
insert into tb_door values(null,'永和大王1店',666);
insert into tb_door values(null,' 永和大王2店',888);
3.2查询记录
select * from 表名
例如:
查询tb_door表中的所有记录:SELECT * FROM tb_door;
3.3修改记录
update 表名 set 字段=值 where 字段=值
例如:
修改tb_door表中id为1的记录:update tb_door set tel=555 where id=1;
3.4删除记录
Delete from 表名 where 字段=值
例如:
删除tb_door表中id为2的数据:Delete from tb_door where id=2;
3.5记录,查询总数
select count(*/具体字段) from 表名;
例如:
查询tb_door表中的总记录数:Select count(*) from tb_door;
3.6排序
Select * from 表名 order by 字段 desc; //从高到低(降序)
Select * from 表名 order by 字段 asc; //从低到高(升序)
Select * from 表名 order by 字段 //默认升序
例如:
将tb_door表记录按照tel排序:Select * from tb_door order by tel desc;
4.其他表记录的操作
4.1like
select * from emp where ename like 'l%' --以l开头的
select * from emp where ename like '%a' --以a结束的
select * from emp where ename like '%a%' --中间包含a的
select * from emp where ename like 'l__' --l后面有两个字符的 _代表一个字符位置
4.2null
select * from emp where mgr is null --过滤字段值为空的
select * from emp where mgr is not null --过滤字段值不为空的
4.3between and
select * from emp where sal<3000 and sal>10000
select * from emp where sal<=3000 and sal>=10000--等效
select * from emp where sal between 3000 and 10000--等效与大于等和小于等于之间
4.4分页limit
select * from emp limit 2 --列出前两条
select * from emp limit 1,2 --从第二条开始,展示2条记录
select * from emp limit 0,3 --从第一条开始,展示3条记录--前三条
4.5聚合aggregation
4.5.1根据一列统计结果 count
select count(*) from emp --底层优化了
select count(1) from emp --效果和*一样
select count(字段) from emp --慢,只统计非NULL的
4.5.2max / min
select max(sal) from emp --求字段的最大值
select max(sal) sal,max(comm) comm from emp
select min(sal) min from emp --获取最小值
select min(sal) min,max(sal) max from emp --最小值最大值
SELECT ename,MAX(sal) FROM emp group by ename --分组
4.5.3sum 和/ avg 平均数
select sum(sal) from emp --求和
select avg(sal) from emp --平均数
4.5.4分组 group by
#每个部门每个岗位的最高薪资和平均薪资,结果中的非聚合列必须出现在分组中,否则业务意义不对
SELECT deptno,MAX(sal),AVG(sal) FROM emp
GROUP BY deptno #按照deptno分组
SELECT job,MAX(sal),AVG(sal) FROM emp
GROUP BY job #按照job分组
SELECT deptno,job,MAX(sal),AVG(sal) FROM emp
GROUP BY deptno,job #deptno和job都满足的
4.5.5having
having 子句类似where过滤返回的结果
select deptno, AVG(sal) from emp
group by deptno #按部门分组
having AVG(sal)<8000 #查询条件,类似where,但是group by只能配合having
#deptno出现的次数
SELECT deptno,COUNT(deptno) FROM emp
GROUP BY deptno #按deptno分组
HAVING COUNT(deptno)>1 #次数多的
5.关联查询
5.1多表联查join
5.1.1笛卡尔积 Cartesian product
- 内连接 inner join
- 左(外)连接 left join
- 右(外)连接 right join
SELECT * FROM emp
WHERE deptno = ( SELECT deptno FROM dept WHERE dname='research' )
--------------------------------------------------------------
SELECT d.dname,e.ename,e.job
FROM emp e INNER JOIN dept d
ON e.deptno=d.deptno
WHERE d.dname='research'
换成left join和right join,看看有什么不同呢?
--------------------------------------------------------------
SELECT *
FROM emp e INNER JOIN empext t
ON e.empno=t.empno
WHERE e.ename='tony'
换成left join和right join,看看有什么不同呢?
5.1.2inner join、left join、right join的区别?
- INNER JOIN两边都对应有记录的才展示,其他去掉
- LEFT JOIN左边表中的数据都出现,右边没有数据以NULL填充
- RIGHT JOIN右边表中的数据都出现,左边没有数据以NULL填充
5.2子查询
5.2.1概念
子查询是指嵌入在其他select语句中的select语句,也叫嵌套查询。子查询执行效率低慎用。记录少时效率影响不大、图方便直接使用,记录多时最好使用其它方式替代。
5.2.2列子
单行子查询 =
--列出tony所在部门的所有人员
select deptno from emp where ename='tony';
select * from emp where deptno = (select deptno from emp where ename='tony');
--------------------------------------------------------------------
多行子查询用 in
select * from emp where job in ('经理','员工');
select * from emp where job in (select distinct job from emp);
尽量用连接代替所有的子查询