1、关于查询结果集的去重?

distinct 关键字
select distinct job from emp; //distinct关键字取出重复记录
tips: 这个关键字前面不能写其他的字段;

select distinct deptno,job from emp; (联合去重)
image.png

案例:
统计岗位的数量;
select count(distinct job) from emp;

2、连接查询

2.1 什么是连接查询?

在实际开发中,大部分的情况下都不是从单表中查询数据, 一般都是多张表联合查询取出最终的结果。
在实际开发中,一般一个业务都会对应多张表,比如:学生和班级,起码两站表
image.png

2.2 连接查询的分类?

1、根据语法出现的年代来划分的,包括
sql92
sql 99, 其中sql99是比较新的语法

2、根据表的链接方式来划分,包括:
内连接:
等值链接
非等值连接
自连接

外连接:
左外连接(左连接)
右外连接(右连接)
全连接(这个不讲,很少用的!

2.3 在表的链接查询方面有一种现象被称为:笛卡尔积现象。(笛卡尔乘积现象)

1.笛卡尔乘积现象:**当两张表进行连接查询的时候,没有任何条件进行限制,最终的查询结果条数事两张表记录条数的成绩。**

2.关于表的别名:
select e.ename,d.dname from emp e,dept d;
表的别名有什么好处?
1、执行效率高。
2、可读性好。

3.如何避免笛卡尔积现象?当然是加条件过滤。
如果加了条件,避免了笛卡尔积现象,会减少匹配次数吗?答案是不会,只不过是显示的是有效记录。

案例1:找出每一个员工的部门名称,要求显示员工名和部门名称;

select
e.ename,d.dname
from
emp e join dept d
on
e.deptno = d.DEPTNO (这个用了join … on,属于SQL99,较新 )
或者

select
e.ename,d.dname
from
emp e, dept d
where
e.deptno = d.DEPTNO
(这个用了普通的条件查询,这个属于SQL92,老规范了,以后不用)**

2.4、内连接之等值连接:最大特点是条件是等量关系。

案例:查询每个员工的部门名称,要求显示员工名和部门名称;

SQL92:select e.ename,d.dname from emp e,dept d where e.deptno = d.DEPTNO

SQL99 :select e.ename,d.dname from emp e join dept d on e.deptno = d.DEPTNO;
语法:

A
(inner 省略了)join
B
on
连接条件
where

SQL99语法结构更清晰一些:表的连接条件和后来的where条件分离了。

2.5、内连接之非等值连接:最大的特点是:连接条件中的关系是非等量关系。

案例:找出每个员工的工资等级,要求显示员工名、工资、工资等级,并且工资等级排序
select e.ename,e.sal,s.GRADE
from
emp e join salgrade s
on
e.sal
BETWEEN
s.LOSAL
and
s.HISAL order by s.GRADE;

2.6、自连接:最大的特点是:一张表看作两张表。自己连接自己。

案例:找出每个员工的上级领导,要求显示员工和对应的领导名;
select e.ename, e1.ename 领导名 from emp e join emp e1 on e.mgr = e1.empno

image.png

2.7、外连接是什么?

什么是外连接,和内连接有什么区别?
内连接:
假设A和B表进行连接,是用内连接的话,凡是A表和B表能够匹配上的记录查询出来,这就是内连接。AB两张表没有主副之分,两张表是平等的

外连接:
假设A和B表进行连接,是用外连接的话,AB两张表中有一张表是主表,一张表是副表,主要查询主表中的数据,捎带着查询副表,当副表中的数据没有和主表中的数据匹配上,副表自动模拟初NULL与之匹配

外连接最重要的特点是:主表中的数据无条件的全部查询出来

案例:找出每个员工的上级领导?(所有员工全部必须查询出来)

select e.ename,e1.ename 领导名称 from emp e left join emp e1 on e.MGR = e1.EMPNO;
image.png

案例:找出哪个部门没有员工
select d.* from emp e right join dept d on e.DEPTNO = d.DEPTNO where e.EMPNO is null

2.8、三张表怎么连接查询?

案例:找出每一个员工的部门名称以及工资等级

select e.ename,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

提示:A表先和B表进行连接,连接之后A表继续和C表进行连接。

案例:找出每一个员工的部门名称、工资等级、以及上级领导

select **e.ename,d.dname,s.grade ,e1.ename 领导名称
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 e1
on **e.MGR = e1.EMPNO

3、子查询?

3.1什么是子查询?子查询都可以出现在哪里?

select 语句中嵌套select语句,被嵌套的select语句事子查询。
子查询可以出现在哪里?
select
..(select).
from
..(select)
where
..(select)

3.2、where子句中使用子查询

案例:找出高于平局薪资的员工信息
select e.* from emp e where e.SAL >( select avg(sal) from emp);

3.3、from后面嵌套子查询

案例:找出每个部门平均薪水的薪资等级。

— 先找出每个部门平均薪水的薪资等级。
— select deptno,avg(sal) from emp group by DEPTNO

select t.*,s.grade from (select deptno,avg(sal) as avgsal from emp group by DEPTNO) t
join salgrade s
on t.avgsal BETWEEN s.LOSAL and s.HISAL

案例:找出每个部门的薪资等级的平均值
select avg(s.grade),e.deptno from emp e join salgrade s
on e.sal BETWEEN s.LOSAL and s.HISAL GROUP BY DEPTNO

3.4、在select后面嵌套子查询。

案例:找出每个员工所在的部门名称,要求显示员工名和部门名。
select e.ename,d.dname from emp e join dept d on e.deptno = d.deptno;

select e.ename,
(select d.dname from dept d where e.deptno = d.deptno ) as dname
from emp e;**

3.5、union (可以将查询结果集相加,需要相同的列)

案例:找出工作岗位是saleman和manager的员工?
第一种:selct ename,job from emp were job=’manager’ or job=’salesman’;( or )

第二种: select ename,job from emp where job in (‘salesman’,’manager’); ( in )

第三种(union):
select ename,job from emp where job = ‘salesman’
union
select ename,job from emp where job = ‘manager’

两张不相干的表中数据也能拼接,但是意义不大

4、limit(重点中的重点,以后分页查询全靠它)

4.1、limit是MySql特有的,其它数据库中没有,不通用(oracle有一个相同 的机制,叫做rownum)

4.2、limit取结果集中的部分数据,这是它的作用。

4.3、语法机制

limit startIndex,length
startIndex,表示开始的位置
length表示取的长度

案例:取出工资前五名的员工
select ename,sal from emp order by sal desc limit 0,5

5、创建表:

创建表的语法的格式
create table 表明(
字段名1 数据类型,
字段名2 数据类型,
字段名3 数据类型,
。。。
);

关于MySql当中的字段的数据类型?下列之说常见的
int 整数型
bigint 长整形(java中的long)
float 浮点型
char 定长字符串
varchar 可边长字符串
date 日期类型
blob 二进制大对象(存储图片、视频等流媒体信息)Binary large Object
clob 字符大对象(存储较大文本,比如,可以存储4G的字符串)

char 和 varchar怎么选择?
在实际的开发中,当中某个字段的数据长度不发生改变的时候,是定长的,例如:性别、生日等都是char
当一个字段的数据长度不确定,例如:简介、姓名都是采用varchar

表名在数据库当中一般建议以:t 或者tbl开始

创建学生表:
学生信息包括:
学号、姓名、性别、班级编号、生日
学号:bigint
姓名:varchar
性别:char
班级编号:int
生日:char
CREATE TABLE t_student(
no BIGINT,
name varchar(255),
sex char(1),
classno INT,
birthday varchar(255)
)

.