1.关于查询记录的去重?
mysql>select distinct job from emp;//distinct关键字去除重复记录
mysql>select ename,distinct job from emp;//错误
distinct只能出现在所有字段的最前面
mysql>select distinct deptno,job from emp;//联合去重
案例:统计岗位的数量?
select count(distinct job) from emp;
2.连接查询
Q:什么是连接查询?
A: 在实际开发中,大部分都不是从单表中查询数据,一般都是多表联合查询取出最终的结果。
在实际开发中,一般一个业务都会对应多张表,比如:学生和班级,起码两张表。
stuno stuname classno classname
-----------------------------------------------------------------------------------------------------------------------------------------------------
1 binqilin 1 北京大学一班
2 xiaoxiong 1 北京大学一班
...
学生和班级信息存储到一张表中,结果就像上面一样,数据会存在大量的重复,产生数据的冗余。
连接查询的分类?
根据语法出现的年代来划分的话,包括
SQL92(一些老的DBA可能还在使用这种语法,DBA:Database Adminstrator 数据库管理员)
SQL99 (新语法)
根据表的连接方式来分类:
内连接:等值连接
非等值连接
自连接
外连接:
左外连接(左连接)
右外连接(右连接)
全连接(很少用)
笛卡尔积现象:当两张表进行连接查询的时候,没有任何条件进行限制,最终查询结果条数是两张表记录条数的乘积。
内连接之等值连接:最大特点是:条件是等量关系。
案例:查询每个员工的部门名称,要求显示员工名和部门名。
SQL99:
e.name,d.name
from
emp e
(inner) join
dept d
on
e.deptno=d.deptno;
语法:
...
A
join
B
on
连接条件
where
...
SQL99的语法结构更清晰,表条件和where条件分离了。
内连接之非等值连接:最大的特点是:连接条件中的关系是非等量关系。
案例:找出每个员工的工资等级,要求显示员工名、工资、工资等级。
select
e.name,e.sal,s.grade
from
emp e
join
salgreade s
on
e.sal between s.local and s.hisal;
自连接:最大特点是一张表看成两张表,自己连接自己。
https://www.yiibai.com/sql/sql-self-join.html
外连接:
Q:什么是外连接?外连接和内连接的区别?
A:内连接:假设A和B表进行连接
使用内连接的话,凡是A表和B表能够匹配上的内容查询出来。
AB无主副之分,是平等的。
外连接:假设A和B表进行连接
使用外连接的话,AB两张表一张是主表,一张是副表,主要查询主表中的数据,捎带查询副表中的数据。
当副表中的数据没有和主表中的数据匹配上,副表自动模拟出NULL与之匹配。
外连接的分类:
左外连接(左连接):表示左边的这张表是主表
右外连接(右连接):表示右边的这张表是主表
左右连接都有自己各自的语法。
三张表怎么连接查询?
案例:找出每个员工的部门名称以及工资等级。
select
e.name,d.name,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;
3.子查询
Q:什么是子查询?子查询可以出现在哪里?
select语句当中嵌套select语句,被嵌套的select语句是子查询。
子查询可以出现在哪里?
select
..(select)
from
..(select)
where
..(select)
浙公网安备 33010602011771号