一、SQL的分类
名称 | 英文 | 作用 | 代表关键字 |
---|---|---|---|
DQL(数据查询语言) | Query | 查询语句 | select |
DML(数据操作语言) | Manipulation | 增、删、改表中的数据 | insert、delete 、update |
DDL(数据定义语言) | Denifition | 对表结构的增删改 | create、drop、alter |
TCL(事务控制语言) | Trasactional Control | 提交事务,回滚事务 | commit、rollback |
DCL(数据控制语言) | Control | 授权、撤销权限等 | grant、revoke |
(链接:本文数据下载 , 提取码:1jvg )
二、常用的命令:
在DOS窗口启动MySQL服务:net start mysql
登录mysql数据库管理系统: mysql -uroot -p密码
查看有哪些数据库: show databases;
创建属于我们自己的数据库: create database 数据库名;
使用A数据库数据: use A;
查看当前使用的数据库中有哪些表: show tables;
初始化数据: mysql> source 文件的索引;
删除数据库A: drop database A;
查看表结构: desc 表名;
获取表中的数据: select * from 表名;
查询当前使用的数据库: select database();
查询当前使用的版本: select version();
终止一条语句: \c
退出MySQL: exit
查看表的创建语句: show create table 表名;
三、单表查询
选择经典工资表emp作为示例:
人名和入职日期
select ename,hiredate from emp;
人名和年薪
select enmae, sal*12 from emp;
把‘sal*12’ 显示为‘年薪‘(重命名为中文时最好加单引号,不要用双引号)。
select ename,sal*12 as '年薪' from emp;
或
select ename,sal*12 '年薪' from emp;
条件查询
语法格式:select 字段,字段… from 表名 where 条件;(执行顺序:先from,然后where,最后select)
查询部门编号为10的员工
select ename,deptno from emp where deptno=10;
查询King的工资
select ename ,sal from emp where ename='king';
查询工资>、<、=3000的员工
select ename,sal from emp where sal<3000;
select ename ,sal from emp where sal>3000;
select ename,sal from emp where sal=3000;
查询工资在2000到3000之间的员工
select ename,sal from emp where sal>2000 and sal<3000;
查询工资在2000到3000之间的员工,包括2000和3000([2000,3000]闭区间)。
select ename,sal from emp where sal>=2000 and sal<=3000;
select ename,sal from emp where sal between 2000 and 3000;
between and除了可以使用在数字方面之外,还可以使用在字符串方面(左闭右开)。
select ename from emp where ename between 'a' and 'k';
查询津贴是null的员工
select ename from emp where comm is null;
查询薪资大于1000的并且部门编号是20或30部门的员工
select ename,sal,deptno from emp where sal>1000 and (deptno=20 or deptno=30);
查询工作岗位是MANAGER和SALESMAN的员工
select ename,job from emp where job='MANAGER' or job='SALESMAN';
select ename,job from emp where job in ('MANAGER','SALESMAN');
not in: 不在这几个值当中。
select ename,job from emp where sal not in(800, 5000);
模糊查询like
找出名字当中含有O的?
select ename from emp where ename like '%O%';
找出名字中第二个字母是A的?
select ename from emp where ename like '_A%';
找出名字中最后一个字母是T的?
select ename from emp where ename like '%T';
=====> 排序
按照工资升序,查询员工名
order by默认是升序
select ename,sal from emp order by sal;
降序输出:
select ename,sal from emp order by sal desc;
查询部门编号是20或30的员工,并按薪水升序输出:
ename,deptno,sal from emp where deptno=20 or deptno=30 order by sal;
=====>分组函数(多行处理函数)
共5个。多行处理函数的特点:输入多行,最终输出的结果是1行。
分组函数自动忽略NULL。
分组函数不可直接使用在where子句当中
名称 | 作用 |
---|---|
count | 计数 |
sum | 求和 |
avg | 平均值 |
max | 最大值 |
min | 最小值 |
找出工资总和?
select sum(sal) from emp;
找出最高工资?
select max(sal) from emp;
找出最低工资?
select min(sal) from emp;
找出平均工资?
select avg(sal) from emp;
找出总人数?
select count(*) from emp;
select count(ename) from emp;
分组函数也能组合起来用:
select count(*),sum(sal),avg(sal),max(sal),min(sal) from emp;
找出工资高于平均工资的员工?
select ename,sal from emp where sal>(select avg(sal) from emp);
=====>单行处理函数
输入一行,输出一行。
计算每个员工的年薪?
select ename,sal,comm,(sal+ifnull(comm,0))*12 as yearsal from emp;
ifnull(可能为NULL的数据,被当做什么处理) : 属于单行处理函数。
group by : 按照某个字段或者某些字段进行分组。
having : having是对分组之后的数据进行再次过滤。
找出每个工作岗位的最高薪资
select max(sal),job from emp group by job;
找出每个部门的最高薪资
select max(sal),deptno from emp group by deptno;
分组函数一般都会和group by联合使用
并且任何一个分组函数(count sum avg max min)都是在group by语句执行结束之后才会执行的。
当一条sql语句没有group by的话,整张表的数据会自成一组。
当一条语句中有group by的话,select后面只能跟分组函数和参与分组的字段。
每个工作岗位的平均薪资?
select job,avg(sal) from emp group by job;
找出每个部门不同工作岗位的最高薪资。
select deptno,max(sal),job from emp group by deptno,job;
找出每个部门的最高薪资,要求显示薪资大于2900的数据。
select deptno ,max(sal) from emp where sal>2900 group by deptno;
找出每个部门的平均薪资,要求显示薪资大于2000的数据。
select avg(sal),deptno from emp group by deptno having avg(sal)>2000;
where后面不能使用分组函数
关于查询结果集的去重
select distinct job from emp;
select count(distinct job) from emp;
结果为5
完整的DQL语句的执行顺序
select 5
..
from 1
..
where 2
..
group by 3
..
having 4
..
order by 6
..
参考资料
[1]https://www.bilibili.com/video/BV1fx411X7BD (动力节点杜老师)