一、去重(distinct)
去除重复记录
注意:原表中不会被修改,知识查询结果去重
语法: select distinct job from emp;
统计工作岗位的数量
语法: select count(distinct job) from emp; 可以允许这么写
二、连接查询
1.查询员工在哪个部门
语法: select e.ename,d.dname from emp as e, dept as d where e.deptno = d.deptno; //表起别名很重要,效率问题。
sql99语法:select e.ename,d.dname from emp e join dept d on e.deptno = d.deptno;//表起别名很重要,效率问题。
2、sql99语法:
select 查询列表
from 表1别名(连接类型)
join 表2别名
on 连接条件
【where筛选条件】
【group by 分组】
【having筛选条件】
【oder by 筛选列表】
分类:
内连接:inner
外连接:左外left【outer】、右外right【outer】、全外full【outer】
交叉连接:cross
3、外连接
查询每个员工的上级领导,要求显示所有员工的名字和领导名?
语法:select
a.ename as 'yuan', b.ename as 'lingdao'
from
emp a
left join
emp b
on
a.mgr = b.empno;
4、三张表、四张表怎么连接?
语法: select .....
from
a
join
b
on
a和b的连条件
join
c
on
a和c的连接条件
join
d
on
a和d的连接条件
案例1:找出每个员工的部门名称以及工资等级,要求显示员工名、部门名、薪资、薪资等级?
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;
案例2:找出每个员工的部门名称以及工资等级,还有上级领导,要求显示员工名、领导名、部门名、薪资、薪资等级?
语法:
select e.ename,e.sal,d.dname,s.grade,l.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 l
-> on
-> e.mgr = l.empno;
三、子查询
1.子查询是select语句中嵌套select语句,被嵌套的select语句称为子查询;
案例:找出比最低工资的名字跟工资
第一步先查询出最低工资:
select min(sal) from emp;
第二步:找出大于最低工资的:
select ename,sal from emp where sal > 800;
第三部:合并:
select ename,sal from emp where sal > (select min(sal) from emp);
2.from字句中的字查询
案例:找出每个岗位的平均工资的薪资等级。
代码: 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;
3.select后面出现的子查询
案例:找出每个员工的部门名称,要求显示员工名,部门名?
语法: select
-> e.ename,e.deptno,
-> (select d.dname from dept d where e.deptno = d.deptno)
-> as dname
-> from
-> emp e;
注意事项:对呀select后面的子查询来说,这个子查询只能一次返回1条结果,多余1条,就报错。!
四、union合并查询结果集
案例:查询工作岗位是MANAGER和SALESMAN的员工?
语法: select ename,job from emp where job = 'MANAGER'
-> union
-> select ename,job from emp where job = 'SALESMAN';
union的效率要高一些。对呀表连接来说,每连接一次新表,则匹配的次数满足笛卡尔积,成倍的翻。。。
但是union可以减少匹配的次数。在减少匹配次数的情况下,还可以完成两个结果集的拼接。
注意:union在进行结果集合并的时候,要求两个结果集的列数相同。
五、limit的使用(重点)
1.完整用法:limit startIndex,length ;//startIdex是起始下标(从零开始),length是长度。
案例:按照薪资降序,取出排名在前5名的员工?
语法:select ename,sal from emp order by sal desc limit 5;
2.注意事项:mysql当中limit在order by之后执行!!!!!
案例:取出工资排名找【3~5】名的员工?
select
ename,sal
from
emp
order by
sal desc
limit
2,3;
2表示起始位置从下标2开始,就是第三条记录。
3表示长度。
3.分页
分页公式: limit (pageNo - 1) * pageSize, pageSize;
六、关于DQL语句的大总结:
select
......
from
........
where
.....
group by
......
having
......
order by
.....
limit
.....
执行顺序:
1.from
2.where
3.group by
4.having
5.select
6.order by
7.limit..
七、表的创建(建表)
1.建表的语法格式:(建表属于DDL语句,DDL包括:create drop alter)
create table 表名(
字段名1 数据类型;
字段名2 数据类型;
字段名3 数据类型;
);
表名:建议以t_或者tal_开始,可读性强。
2.关于mysql中的数据类型
(1)varchar(255)
可变长度的字符串
比较智能,节省空间。
会根据实际的数据长度动态分配空间。
优点:节省空间
缺点:需要动态分配空间,速度慢。
(2)char(255)
定长字符串
不管实际的数据长度是多少。
分配固定长度的空间去存储数据。
使用不恰当的时候,可能会导致空间的浪费。
优点:不需要动态分配空间,速度快。
缺点:使用不当可能会导致空间的浪费。
(3)int(11)
数字中的整数型
(4)bigint
数字中的长整型
(5)float
单精度浮点型数据
(6)double
双精度浮点型数据
(7)dete
短日期类型
(8)datetime
长日期类型
(9)clob
字符大对象
最多可以存储4G的字符串
比如:存储一篇文章,存储一个说明。
超过255个字符的都要采用clob字符大对象存储。
(10)blob
二进制大对象
专门用来存储图片、声音、视频等流媒体数据。列如插入一个图片、视频等
你需要使用IO流才行。
3.创建一个学生表?
create table t_student(
no int,
name varchar(32),
sex char(1),
age int(3),
email varchar(255)
);
删除表:
(1) drop table 表名;//当这张表不存在的时候会报错!
(2)drop table if exists 表名;// 如果这张表存在的话就 删除。
4.插入数据insert(DML)
语法格式:insert into 表名(字段名1,字段名2,字段名3....) values(值1,值2,值3....);
注意事项:字段名和值要一一对应。
语法:insert into t_student(no,name,sex,age,email) values(1,'zhangsan','nan',20,'zhangsan@123.com');
5.insert插入日期
str_to_date函数可以将字符串转换成日期类型date?
语法:str_to_date('字符串日期','日期格式');
mysql的日期格式:
%y 年
%m 月
%d 日
%h 时
%i 分
%s 秒
6.date和datetime的区别
date是短日期
datetime是长日期
mysql短日期默认格式:%y-%m-%d
mysql长日期默认格式:%y-%m-%d %h:%i:%s
(1)now()函数;//可以获取系统当前的时间;
7.修改update(DML)
语法格式:
update 表名 set 字段名1 = 值1,字段名2 = 值2,字段名3 = 值3 ....... where 条件;
注意:没有条件限制会导致所有数据全部更新。
语法:update t_user set name = 'javke',birth = '1984-06-09', create_time = now() where id =1;
8.删除数据 delete(DML)
语法格式:
delete from 表名 where 条件;
注意:没有条件,整张表的数据会全部删除!
delete from t_user where id = 2;
insert into t_user(id) values(2);
delete from 表名;//删除所有!
insert delete update select
增 删 改 查