![在这里插入图片描述](https://img-blog.csdnimg.cn/af625dcf519e4515b563589d238dea81.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAd2VpeGluX0Rh5Yaw,size_12,color_FFFFFF,t_70,g_se,x_16#pic_center
注:以下查询都是基于以上三张表
什么是表
表:是数据库的基本组成单元,所有的数据都以表格的形式组织,目的是可读性强,一个表包括行和列:
行:被称为数据/记录(data) 列:被称为字段(colum)
每个字段应该包括哪些属性?
- 字段名
- 数组类型
- 相关约束
SQL语句分类
- DQL(数据查询语言):查询语句,凡是select语句都是DQL。
- DML(数据操作语言):insert delete update,对表当中的数据进行增删改。
- DDL(数据定义语言):create drop alert,对表结构的增删改。
- TCL(事务控制语言):commit提交事务,rollback回滚事务(TCL中的T是Transation)。
- DCL(数据控制语言):grant授权、revoke撤销权限等。
在DOS窗口下使用的一些命令
- 登录mysql:mysql -u用户名 -p密码
- 查看数据有哪些数据库:show databases; (这个不是SQL语句,是MySQL的命令)
- 创建自己的数据库:create database 数据库名
- 使用某个数据库:use 数据库名;(这个不是SQL语句,是MySQL的命令)
- 查看当前数据库有哪些表格:show tables;(这个不是SQL语句,是MySQL的命令)
- dos执行.sql文件:source 文件路径
- 查看某个表的结构:desc 表名;
- \c命令:结束一条语句
- exit退出mysql
- select version(); 查看mysql的版本号
- select database(); 查看当前使用的是哪个数据库
查询语句
简单的查询语句(DQL)
语法格式:
select 字段1,字段2,字段3,… from 表名;
提示:
1、任何一条sql语句以“;”结尾
2、sql语句不区分大小写
3、字段可以参数数学运算
4、给查询结果的列重命名:select ename, sal * 12 as 别名(中文要用品哪个单引号包起来) from 表名(as关键字可以省略)
条件查询
语法格式:
select 字段,字段… from 表名 where 条件;
执行顺序:先from,然后where,最后select
条件查询字符表
运算符 | 说明 |
---|---|
= | 等于 |
<>或!= | 不等于 |
< | 小于 |
<= | 小于等于 |
> | 大于 |
>= | 大于等于 |
between … and … | 两个值之间,等同于>= and <= |
is null | 为null(is not null 不为空) |
and | 并且 |
or | 或者 |
in | 包含,相当于多个or(not in 不在这个范围中) |
not | not 可以去非,主要用在is 或 in 中 |
like | like称为模糊查询,支持%(代表任意多个字符)或下划线(_代表任意1个字符)匹配 |
数据排序(升序、降序)
语法:
select 字段,字段… from 表名 order by 字段
注意:
默认是升序,怎么指定升序或者降序呢? asc表示升序,desc表示降序
select 字段,字段… from 表名 order by 字段 asc(指定升序排)
select 字段,字段… from 表名 order by 字段 desc(指定降序排)
例子:按照工资的降序排列,当工资相同的时候再按照名字的升序排列
select ename,sal from emp order by sal desc,ename asc;
注意:越靠前的字段越能起到主导作用,只有当前面的字段无法完成排序的时候,才会启用后面的字段,order by是最后执行的
分组函数
- count 计数
- sum 求和
- avg 平均值
- max 最大值
- min 最小值
注意:所有的分组函数都是对“某一组”数据进行操作的,分组函数会自动忽略Null
例子:找出工资总和?
select sum(sal) from emp;
例子:找出工资高于平均工资的员工?
注意:SQL语句当中有一个语法规则,分组函数不可直接使用在where子句当中,因为group by 是在where之后执行的
select ename from emp where sal > (select avg(sal) from emp)
select (5)
…
from(1)
…
where(2)
…
group by(3)
…
having(4)
…
order by(6)
…
单行处理函数
1、单行处理函数是输入一行,输出一行
2、ifnull() 空处理函数:ifnull(可能为null的数据,被当做什么处理):属于单行处理函数
group by 和 having(它们是搭档)
group by:按照某个字段或者某些字段进行分组
having:是对分组之后的数据进行再次过滤
例子:找出每个工作岗位的最高薪资
select max(sal) from emp group by job;
注意:分组函数一般都会和group by联合使用,这也是为什么它被称为分组函数的原因,并且任何一个分组函数(count sum avg max min)都是在group by语句执行结束之后才会执行的,当一条sql语句没有group by的话,整张表的数据会自成一组
例子:
> 1、找出每个部门的最高薪资,要求显示薪资大于2900的数据
> select max(sal),deptno from emp where sal > 2900 group by deptno;
> 2、找出每个部门的平均薪资,要求显示薪资大于2000的数据
> **注意where后面是不能使用分组函数的**
> select avg(sal),deptno from emp group by detpno having avg(sal) > 2000;
查询结果集的去重 distinct
select distinct job from emp;
distinct只能出现在所有字段的最前面,并且是所有字段联合去重
连接查询
1、什么是连接查询?
在实际开发中,大部分的情况下都不是从单表中查询数据,一般都是多张表联合查询取出最终的结果
在实际开发中,一般一个业务都会对应多张表,比如:学生和班级,起码两张表
2、连接查询的分类
(1)根据语法出现的年代来划分的话,包括:SQL92(一些老的DBA可能还在使用这种语法。)、SQL99(比较新的语法)
(2)根据表的连接方式来划分,包括:
内连接:等值连接、非等值连接、自连接
1、等值连接:最大特点是:条件是等量关系
案例:查询每个员工的部门名称,要求显示员工名和部门名
//内连接:innerSQL(99): select e.ename,d.dname #表显示的字段 form emp e inner(可省略)join #连接另一张表的名字 dept d on #避免笛卡尔积现象的条件 e.deptno = d.deptno;(等值关系)
2、非等值连接:最大特点是:连接条件中的关系是非等量关系
案例:找出每个员工的工资等级,要求显示员工名、工资、工资等级select e.ename,e.sal,s.grade from emp e join salgrade s on e.sal between s.losal and s.hisal;
3、自连接:最大特点是:一张表看作两张表。自己连自己
案例:找出每个员工的上级领导,要求显示员工名和对应的领导名select a.ename as '员工名',b.ename as '领导名' from emp a join emp b on a.mgr = b.empno;
外连接:左外连接(左连接)、右外连接(右连接)
什么是外连接,和内连接有什么区别?
内连接:假设A和B表进行连接,使用内连接的话,凡是A表和B表能够匹配上的记录查 询出来,这就是内连接。AB两张表没有主副之分,两张表是平等的 外连接:假设A和B表进行连接,使用外连接的话,AB两张表中有一张时主表。一张是 副表,主要查询主表中的数据,捎带着查询副表,当副表找那个的数据没有 和主表中的数据匹配上,副表自动模拟出null与之匹配。
1、左连接:表示左边的这张表是主表
2、右连接:表示右边的这张表是主表
注意:左连接有右连接的写法,右连接也会有对应的左连接的写法
案例: 找出每个员工的上级领导?(所有员工必须全部查询出来:使用外连接)#内连接 select a.ename as '员工',b.ename as '领导' from emp a join emp b on a.mgr = b.empno; #外连接中的左连接 select a.ename as '员工',b.ename as '领导' from emp a left outer(可省略) join emp b on a.mgr = b.empno; #上面左连接改为右连接(右表为主表) select a.ename as '员工',b.ename as '领导' from emp b right join emp a on a.mgr = b.empno;
全连接(少用)
3、笛卡尔积现象:当两张表进行连接查询的时候,没有任何条件限制时,最终的查询结果条数是两张表记录条数的乘积,可以加条件进行过滤
3张表以上连接查询
案例:找出每一个员工的部门名称以及工资等级(1)、以及上级领导(2)
(1)
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;
(2)外加条件上级领导
select
e.ename '员工',d.dname,s.grade,el.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 el
on
e.mgr = el.empno;