1、关于查询结果集的去重?
distinct 关键字
select distinct job from emp; //distinct关键字取出重复记录
tips: 这个关键字前面不能写其他的字段;
select distinct deptno,job from emp; (联合去重)
案例:
统计岗位的数量;
select count(distinct job) from emp;
2、连接查询
2.1 什么是连接查询?
在实际开发中,大部分的情况下都不是从单表中查询数据, 一般都是多张表联合查询取出最终的结果。
在实际开发中,一般一个业务都会对应多张表,比如:学生和班级,起码两站表
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
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;
案例:找出哪个部门没有员工
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)
)
.
