1. distinct把查询结果去除重复记录:
原表数据不会被修改,只是查询结果去重。
select distinct job,deptno from emp;// distinct只能出现在所有字段的最前方。distinct出现在job,deptno两个字段之前,表示两个字段联合起来去重。
统计一下工作岗位的数量:select count(distinct job) from emp;
2.连接查询:
▲连接查询的分类:①内连接:等值连接、非等值连接、自连接;②外连接:左外连接(左连接)、右外连接(右连接);③全连接
查询每个员工所在部门名称,显示员工名和部门名:select e.ename,d.dname from emp e (inner) join dept d on e.deptno = d.deptno where (筛选条件); // 条件是等量关系,所以被称为等值连接。
找出每个员工的薪资等级,要求显示员工名、薪资、薪资等级:select e.ename, e.sal, s.grade from emp e join salgrade s on e.sal between s.losal and s.hisal; // 条件不是一个等量关系,称为非等值连接。
查询员工的上级领导,要求显示员工名和对应的领导名:select a.ename as '员工名', b.ename as '领导名’from emp a join emp b on a.mgr = b.empno; //内连接中的自连接,技巧:一张表看做两张表。
查询员工的职位:select e.ename,d.dname from emp e right (outer) join dept d on e.deptno = d.deptno;// right代表什么:表示将join关键字右边的这张表看成主表,主要是为了将这张表的数据全部查询出来,捎带着关联查询左边的表。在外连接当中,两张表连接,产生了主次关系。(右外连接)
▲带有right的是右外连接,又叫做右连接。带有left的是左外连接,又叫做左连接。任何一个右连接都有左连接的写法。任何一个左连接都有右连接的写法。
▲外连接的查询结果条数一定是 >= 内连接的查询结果条数? √
查询每个员工的上级领导,要求显示所有员工的名字和领导名:select a.ename as '员工名', b.ename as '领导名' from emp a left join emp b on a.mgr = b.empno;
▲三张表,四张表怎么连接:select ...from a join b on a和b的连接条件 join c on a和c的连接条件 right join d on a和d的连接条件;// 一条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;
3.子查询:
▲select语句中嵌套select语句,被嵌套的select语句称为子查询。
where子句中的子查询:找出比最低工资高的员工姓名和工资:select ename,sal from emp where sal > (select min(sal) from emp);
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;// from后面的子查询,可以将子查询的查询结果当做一张临时表。
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条,就报错了。
4. union合并查询结果集:
查询工作岗位是MANAGER和SALESMAN的员工:select ename,job from emp where job = 'MANAGER' union select ename,job from emp where job = 'SALESMAN';// union在进行结果集合并的时候,要求两个结果集的列数相同;最好结果集合并时列和列的数据类型也一致。
5.limit用法:
▲limit startIndex, length //startIndex是起始下标,length是长度,起始下标从0开始。
按照薪资降序,取出排名在前5名的员工:select ename,sal from emp order by sal desc limit 5; //取前5
▲mysql当中limit在order by之后执行。
取出工资排名在[3-5]名的员工:select ename,sal from emp order by sal desc limit 2, 3;
分页:每页显示pageSize条记录:第pageNo页:limit (pageNo - 1) * pageSize , pageSize
▲关于DQL语句的大总结 执行顺序:
from where group by having select order by limit
6. 表的创建(建表):
▲建表的语法格式:create table 表名(字段名1 数据类型, 字段名2 数据类型, 字段名3 数据类型);// 表名:建议以t_ 或者 tbl_开始,可读性强。
▲关于mysql中的数据类型:
①varchar(最长255):可变长度的字符串;比较智能,节省空间。会根据实际的数据长度动态分配空间。
②char(最长255):定长字符串;不管实际的数据长度是多少。分配固定长度的空间去存储数据。使用不恰当的时候,可能会导致空间的浪费。//varchar和char我们应该怎么选择:性别固定长度char;名字长度不同varchar。
③int(最长11):数字中的整数型。
④bigint:数字中的长整型。
⑤float:单精度浮点型数据。
⑥double:双精度浮点型数据。
⑦date:短日期类型。只包括年月日信息。%Y-%m-%d
⑧datetime:长日期类型。包括年月日时分秒信息。%Y-%m-%d %h:%i:%s
⑨clob:字符大对象。最多可以存储4G的字符串。比如:存储一篇文章,存储一个说明。超过255个字符的都要采用CLOB字符大对象来存储。
⑩blob:二进制大对象。专门用来存储图片、声音、视频等流媒体数据。
创建一个学生表(学号、姓名、年龄、性别、邮箱地址):create table t_student(no int,name varchar(32),sex char(1),age int(3),email varchar(255));
删除表:drop table if exists t_student;
7. 插入数据insert (DML):
▲语法格式:insert into 表名(字段名1,字段名2,字段名3...) values(值1,值2,值3);// 字段名和值要一一对应;数量要对应,数据类型要对应。
在学生表中插入学生信息:insert into t_student(no,name,sex,age,email) values(1,'zhangsan','m',20,'zhangsan@123.com');// insert语句但凡是执行成功了,那么必然会多一条记录。没有给其它字段指定值的话,默认值是NULL。
格式化数字:format(数字, '格式'):select ename,format(sal, '$999,999') as sal from emp;
▲str_to_date:将字符串varchar类型转换成date类型。str_to_date('字符串日期', '日期格式') 默认格式:%Y-%m-%d
mysql的日期格式:%Y 年;%m 月;%d 日;%h 时;%i 分;%s 秒。
date_format:将date类型转换成具有一定格式的varchar字符串类型。
▲数据库中的有一条命名规范:所有的标识符都是全部小写,单词和单词之间使用下划线进行衔接。
8. 修改update(DML):
▲语法格式:update 表名 set 字段名1=值1,字段名2=值2,字段名3=值3... where 条件;// 没有条件限制会导致所有数据全部更新。
更新少数:update t_user set name = 'jack', birth = '2000-10-11' where id = 2;
更新所有:update t_user set name = 'abc';
9. 删除数据 delete (DML):
▲语法格式:delete from 表名 where 条件;// 没有条件,整张表的数据会全部删除。
删除一个:delete from t_user where id = 2;
删除所有:delete from t_user;