狂人日记 day8
连接查询
例:从emp取员工名字 dept取部门名字
分类 sql92
sql99
方式分类:
-
内连接
-
外连接
-
全链接
两张表连接查询没有条件会发生什么现象
例: 查询每个员工所在部门名称
一条数据和第二张表四个配对
没有任何条件限制;
select ename,dname from emp,dept;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qmZr9RLt-1621344267215)(/Users/suannai/Library/Application Support/typora-user-images/image-20210518185040291.png)]
---- 笛卡尔积现象 —
怎么避免这种现象
----连接时加条件
select ename,dname from emp,dept where emp.deptno = dept.deptno;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6n1FuXT8-1621344267216)(/Users/suannai/Library/Application Support/typora-user-images/image-20210518185454101.png)]
匹配次数没减少
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ef01n2h6-1621344267216)(/Users/suannai/Library/Application Support/typora-user-images/image-20210518185659245.png)]
上面是sql 92语法
尽量避免表的链接次数
内连接 - 等值连接
查询每个员工部门名称 显示员工命和部门名
92 结构不清晰
select e.ename, d.dname from emp e, dept d where e.deptno = d.deptno;
99 表连接条件独立
select e.ename,d.dname from (inner)emp e join dept d on e.deptno = d.deptno; // 条件是等量关系 所以是等值连接
select … from a join b on a和b的连接条件 where 筛选条件
非等值连接
select e.ename ,e.sal,s.grade from emp e join salgrade s on e.sal between s.losal and hisal;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7vFmw3K2-1621344267216)(/Users/suannai/Library/Application Support/typora-user-images/image-20210518191733682.png)]
内连接–自连接
查询员工上级领导
技巧:一张表看成两张表
select a.ename as’员工名’ ,b.ename as ‘领导名’ from emp a join emp b on a.mgr = b.empno;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-z2CYaldf-1621344267216)(/Users/suannai/Library/Application Support/typora-user-images/image-20210518192540678.png)]
外连接
select e.ename,d.dname from emp e right join dept d on e.deptno = d.deptno;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-i9tqgdcd-1621344267216)(/Users/suannai/Library/Application Support/typora-user-images/image-20210518192925790.png)]
有一个没匹配的也显示出来了
right 表示将右边的表为主表 把右面表全显示出来 捎带 左表
还有left左连接
join 前可以有outer 可以省略
案例 查询每个员工上级领导 显示所有员工名字和领导名
select e.ename,b.ename from emp e left join emp b on e.mgr = b.empno;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RrxHCy76-1621344267217)(/Users/suannai/Library/Application Support/typora-user-images/image-20210518193747909.png)]
三张表
select … from a join b on … join c on …
sql中内连接和外连接可以混合
案例 : 找出每个员工的部门名称以及工资等级 显示员工名 部门名 薪资 薪资等级
select e.ename ,e.sal,d.dname,s.grade from emp e join dept d on e.deptno
= d.deptno join salgrade s on e.sal between s.losal and s.hisal;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-k1W6pmt5-1621344267217)(/Users/suannai/Library/Application Support/typora-user-images/image-20210518194419998.png)]
select e.ename,e.sal,d.dname,s.grade from emp e join dept d on e.deptno =d.deptno join salgrade s on e.sal between s.losal and s.hisal left join emp l on e.mgr = l.empno;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Cq5foSSL-1621344267217)(/Users/suannai/Library/Application Support/typora-user-images/image-20210518194902097.png)]
子查询
select中嵌套select
select (select) from (select) where (select)
找出比最低工资高的员工姓名和工资
select ename,sal from emp where sal>(select min(sal) from emp);
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1xBA7ufl-1621344267217)(/Users/suannai/Library/Application Support/typora-user-images/image-20210518195250077.png)]
from 后面子查询 可以将子查询的查询结果当一张临时表(技巧)
找出每个岗位的平均工资的薪资等级
select t.*,s.grade from(The select job,avg(sal) as avgsal from emp group by job) t join salgrade s on t.avgsal between s.losal and s.hisal;
select t.* ,s.grade from (select job , avg(sal) as avgsal from emp group by job) t join salgrade s on t.avgsal between s.losal and s.hisal;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Q8gl3ku5-1621344267217)(/Users/suannai/Library/Application Support/typora-user-images/image-20210518200558820.png)]
select e.ename,(select d.dname from dept d where e.deptno = d.deptno )as dname from emp e;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YFSJB2DE-1621344267217)(/Users/suannai/Library/Application Support/typora-user-images/image-20210518200831929.png)]
对于select后语句子查询只能一次返回一条结果
如果查询多条则会报错参考如下
1个信息 对应了 2个信息 但要放在一个容器里
union
合并查询结果集
select ename,job from emp where job =‘MANAGER’
union
select ename,job from emp where job = ‘SALESMAN’;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PC0rxr9u-1621344267218)(/Users/suannai/Library/Application Support/typora-user-images/image-20210518203050452.png)]
union 效率高一点 将乘法变成了加法运算
union是上下合并
union 使用时 union 进行合并时要求列数相同
一般要求列和列的数据类型一致
limit
将查询表的一部分取出来
limit 用法
select ename,sal from emp order by sal desc limit0,5;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jTm4vxRT-1621344267218)(/Users/suannai/Library/Application Support/typora-user-images/image-20210518204946049.png)]
limit startindex ,length(长度)
startindex开始位置从0开始
在order by后进行
select ename,sal from emp order by sal desc limit 4,5;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lLe2q41D-1621344267218)(/Users/suannai/Library/Application Support/typora-user-images/image-20210518205426646.png)]
通用分页
每页显示3条记录
第一页:limit 0 ,3
第二页limit3,3
第三页limit6,3
第四页 limit 9,3
每页 pagesize 条记录
第pageno页 limit (pageno - 1 )*pagesize ,pagesize
有三十四道题
表的创建
属于 ddl语句
create table 表名(字段名,数据类型)
括号最后一个没有逗号
表名建议t_或t_bl开始 见名知意
- varchar 可变长度字符串
根据实际数据长度 动态分配空间
- char 定长
varchar速度慢 char速度快 最长255
-
int
-
bigint 数字数长整形 等于long
-
float
-
double
-
date短日期
-
datetime长日期
-
clob 字符大对象
最多存储4g的字符串
超过255,存储文章
-
blob
二进制大对象
存储图片声音视频等
往blob插入数据时 要用io流
t_movie 电影表
编号
No(bigint)
名字
name(varchar)
描述信息
description(clob)
上映日期
playtime(data)
时长
time(double)
海报
image(blob)
类型
type(char)