SQL基础
sql,DB,DBMS分别是什么,以及他们的关系
DB:DataBase,数据库,实际在硬盘上以文件的形式存在
DBMS:DataBase Management System 数据库管理系统 常见的有MySql,Oracle...
SQL: 结构化查询语言,是一门标准通用的语言,标准的SQL适用于所有数据库产品
DBMS负责执行SQL语句,通过执行SQL语句来操作DB中的数据
表
table是数据库的基本组成单元,所有的数据都以表格的形式组织,目的是可读性强
一个表包括行(被称为数据)和列(被称为字段),每一个字段包括字段名、数据类型(学号int、姓名Varchar)和相关的约束
SQL语句的分类
DQL数据查询语言:查询语句,如select
DML数据操作语言:insert,delete,update对表当中的数据进行增删改
DDL数据定义语言:create,drop,alter对表结构的增删改
TCL事物控制语言:commit提交事物,rollback回滚事物
DCL数据控制语言:grant授权,revoke撤销权限
MySQL常用命令
select database(); 查看当前用的是哪一个数据库
select version(); 查看MySQL版本
show database(); 查看和指定现有的数据库
show tables(); 查看表结构
desc 表名 :查看表结构
\c 结束一条语句
exit 退出MySQL
简单查询案例
select
ename,sal
from
emp
where
sal between 1000 and 3000;
判断是否为null和不为null
select
ename,sal
from
emp
where
comm is null;
select
ename,sal
from
emp
where
comm is not null;
⚠️ 当运算符优先级不确定的时候加小括号
条件查询In
In相当于or
select ename,job from emp where job = 'saleman' or job = 'manager';
select ename,job from emp where job in('saleman','manager');
模糊查询like
必须掌握 % 和 _
查找名字中有O的
select ename from emp where enames like '%O%';
找出名字中第二个字母是A的
select ename from emp where enames like '_O%';
找出名字中有下划线的
select ename from emp where enames like '%\_%';
⚠️ 不是'%_%',这样会返回所有的名字
找出名字中最后一个字母是T
select ename from emp where enames like '%T';
排序
select ename,sal from emp order by sal;
⚠️ 这里默认升序,可以通过asc指定升序和desc指定降序
按照工资的降序排列,工资相同的时候按照名字的升序排列
select ename,sal from emp order by sal desc, ename asc;
分组函数
count计数,sum求和,avg平均,max最大,min最小
⚠️ 另外还有个名字:多行处理函数
⚠️ 分组函数不可直接使用在where子句中,因为分组函数是在group by执行完毕后使用的,而group by是在where执行完毕后执行的
⚠️ count(*) 和 count(某一字段)区别:前者统计总记录条数,后者统计字段中不为NULL的数据总数量
特点:多行输入,单行输出且自动忽略null
ifnull(可能为null的字段,被当作什么处理)
select ename,ifnull(comm,0) from emp ;
分组查询
group by:按照某个字段或者某些字段进行分组,通常和分组函数联合使用,并且任何一个分组函数都在 group by 语句执行结束后才会执行
having:having是对分组之后的数据进行再次过滤
找出每个工作岗位的最高薪资
select max(sal) from emp group by job
找出工资高于平均工资的人
select ename,sal from emp where sal > (select avg(sal) from emp);
多字段分组查询
⚠️ 在使用group by时, select后面只能跟group by的字段和分组函数,MySQL虽然会通过但是结果没有意义,在Oracle中会报错
找出每个部门的最高薪资,并且薪资大于2900的
select max(sal),deptno from emp group by deptno having max(sal) > 2900;
但是这里不建议用having,因为用where效率更高
select max(sal),deptno from emp where sal > 2900 group by deptno;
一个完整的DQL顺序
⚠️ From -> Where -> Group By -> Having -> Select -> Order By
Distinct去重
⚠️ distinct只能出现在所有字段最前面
如统计岗位的数量
select count(distinct job) from emp;
连接查询的分类
内连接:等值连接、非等值连接、自连接
外连接:左连接、右连接
全连接
等值连接示例
select
e.ename,d.dname
from
emp e
join
dept d
on
e.deptno = d.deptno
非等值连接示例
select
e.ename, e.sal, s.grade
from
emp e
join
salgrade s
on
e.sal between s.losal and s.hisal
自连接示例
select
e.ename as '员工名',d.ename as '领导名'
from
emp e
join
emp d
on
a.mgr = b.empo;
实际开发中,外连接使用较多
Where嵌套子查询
select * from emp where sal > (select avg(sal) from emp;
From后面嵌套子查询
找出每个部门的平均工资对应的等级
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