文章目录
- Mysql
- Mysql 基础
- 1. DB、DBMS、sql
- 2. 表、记录、字段
- 3. SQL语句分类
- Mysql命令
- 1. 导入数据
- 2. 常用命令
- DQL 语句
- 1. 简单查询语句
- 2. 条件查询
- 3. 查询结果集的去重
- 4. 排序
- 5. 单行处理函数
- 6. 五个分组函数
- 7. group by 和 having
- 8. 连接查询
- 内连接:(inner) join
- 外连接:left join/right join,主表的数据无条件的全部查询出来。
- 9. 子查询
- 在from后面嵌套子查询
- 在where子句中使用子查询
- 10. union (可以将查询结果集相加)
- 11. limit (重点,用于分页查询)
- 12. 计算两个日期的时间差
- 13. 完整DQL语句的执行顺序
Mysql
Mysql 基础
1. DB、DBMS、sql
- DB: DataBase(数据库,数据库实际上在硬盘上以文件的形式存在)
- DBMS: DataBase Management System(数据库管理系统,常见的有:MySQL Oracle DB2 Sybase SqlServer…)
- SQL:
结构化查询语言,是一门标准通用的语言。标准的sql适合于所有的数据库产品。
SQL属于高级语言。只要能看懂英语单词的,写出来的sql语句,可以读懂什么意思。
SQL语句在执行的时候,实际上内部也会先进行编译,然后再执行sql。(sql语句的编译由DBMS完成。)
DBMS -(执行)-> SQL -(操作)-> DB,DBMS负责执行sql语句,通过执行sql语句来操作DB当中的数据。
2. 表、记录、字段
表:table是数据库的基本组成单元,所有的数据都以表格的形式组织,可读性强。
行:称为数据/记录(data)
列:称为字段(column),一个字段包括的属性:字段名、数据类型、相关的约束。
3. SQL语句分类
DQL(数据查询语言): 查询语句,凡是select语句都是DQL。
DML(数据操作语言):insert delete update,对表当中的数据进行增删改。
DDL(数据定义语言):create drop alter,对表结构进行增删改。
TCL(事务控制语言):commit提交事务,rollback回滚事务。(TCL中的T是Transaction)
DCL(数据控制语言): grant授权、revoke撤销权限等。
Mysql命令
1. 导入数据
- 第一步:登录mysql数据库管理系统
mysql -u root -p - 第二步:查看已有数据库
show databases; - 第三步:创建数据库
create database 数据库名; - 第四步:使用数据库
use 数据库名; - 第五步:查看当前数据库中的表
show tables; - 第六步:初始化数据
source sql脚本文件地址
2. 常用命令
ctrl+c (结束当前语句)
exit(退出mysql)
select version(); (查看mysql的版本号)
show databases;
create database 数据库名;
drop database 数据库名;
select database(); (查看当前使用的数据库)
use 数据库名;
desc 数据表名; (查看表结构)
show create table 数据表名;(查看创建表的语句)
select * from 数据表名;(查看数据)
DQL 语句
1. 简单查询语句
select 字段名1,字段名2,字段名3,… from 表名;
(字段可以参与数学运算,用as来重命名,as关键字可以省略)
select * from 表名;
实际开发中不建议使用*,效率较低。
注意:
任何一条sql语句以“;”结尾
sql语句不区分大小写
标准sql语句用单引号将字符串括起来
2. 条件查询
select 字段,字段… from 表名 where 条件;
执行顺序:先from,然后where,最后select
运算符 | 说明 |
= | 等于 |
<>或!= | 不等于 |
< | 小于 |
<= | 小于等于 |
> | 大于 |
>= | 大于等于 |
between … and …. | 在…之间,应用于数值为闭区间,必须左小右大;应用于字符串为左闭右开 |
is null | 为空,null不是一个值,不能用等号衡量(is not null 不为空) |
and | 并且 |
or | 或者 |
in | 包含,相当于多个or(not in不在这个范围中) |
not | not可以取非,主要用在is 或in中 |
like | like称为模糊查询,%匹配任意个字符,_匹配单个字符;当需要查询含有%或_的内容时,在前使用转义字符’\’ |
3. 查询结果集的去重
distinct关键字去除重复记录
注意:
distinct只能出现在所有字段的最前面,代表后方字段联合去重。
4. 排序
select 字段 from 表名 where 条件 order by 字段 ;
默认升序,asc表示升序,desc表示降序。当多字段排序时","隔开,越靠前的字段优先级越高。
5. 单行处理函数
输入一行,输出一行。
如:ifnull()函数,为单行处理函数。ifnull(可能为NULL的数据,替代处理值),用于处理可能含有NULL值运算。
6. 五个分组函数
分组函数也叫多行处理函数(输入多行,最终输出的1行结果)
count 计数
sum 求和
avg 平均值
max 最大值
min 最小值
区分:
count(*): 统计总记录条数(和某个字段无关)
count(字段名): 统计某字段中不为NULL的数据总数
注意:
a. 分组函数自动忽略NULL。
b. 分组函数不能直接使用在where子句中。因为group by是在where执行之后才会执行,分组函数在group by之后执行。
正确写法 – select 字段 from 表 where 字段 > (select avg(字段) from 表),字段和表无需相同
7. group by 和 having
group by : 按照某个字段或者某些字段进行分组。
having : having是对分组之后的数据进行再次过滤,和groupby连用。能先用where过滤的就用where,效率更高。
注意:
分组函数一般都会和group by联合使用。并且任何一个分组函数都在group by语句执行结束之后才会执行。当一条sql语句没有group by,则整张表的数据会自成一组。
规则:
当一条语句中有group by,select后面只能跟分组函数和参与分组的字段。
8. 连接查询
实际开发中,一般将信息存储到多张表中,避免数据存储在一张表上出现大量重复,导致数据的冗余。
根据表的连接方式来划分:
内连接:(inner) join
- 假设A、B两表进行内连接,查询后只显示A、B两表能够匹配上的记录。A、B两张表没有主副之分,两张表是平等的。
语法:
select 字段… from 表1
inner join 表2
on 连接条件
where …
- 等值连:连接条件是等量关系。
e.g 查询每个员工的部门名称,要求显示员工名和部门名
select e.ename,d.dname from emp e inner join dept d on e.deptno = d.deptno; - 非等值连接:连接条件是非等量关系。
e.g 找出每个员工的工资等级,要求显示员工名、工资、工资等级
select e.ename,e.sal,s.grade from emp e join salgrade s on e.sal between s.losal and s.hisal; - 自连接:将一张表看做两张表,自己连接自己。(自连接的连接条件可以是等量关系,也可以是非等量关系。)
e.g 找出每个员工的上级领导,要求显示员工名和对应的领导名
select a.ename as ‘员工名’,b.ename as ‘领导名’ from emp a inner join emp b on a.mgr = b.empno;
外连接:left join/right join,主表的数据无条件的全部查询出来。
- 假设A、B两表进行外连接,查询以确保主表数据完整为前提。A、B两张表中有一张表是主表,一张表是副表。在附表中匹配主表中的数据,当副表数据匹配不到时,自动用NULL进行匹配,以确保主表数据的完整性。
- 左外连接(左连接)
e.g 找出每个员工的上级领导,要求显示员工名和对应的领导名(确保king记录显示)
select a.ename ‘员工’, b.ename ‘领导’ from emp a left join emp b on a.mgr = b.empno; - 右外连接(右连接)
e.g 找出哪个部门没有员工
select d.* from emp e right join dept d on e.deptno = d.deptno where e.empno is null;
- 全连接(很少用!)
注意:
在链接查询时,多对表起别名。在查询字段前加上表格别名,即提高了执行效率,且可读性好。
9. 子查询
select语句当中嵌套select语句,被嵌套的select语句是子查询。子查询可以出现在select、from、where后。
- 在select后面嵌套子查询(不常用)
e.g 找出每个员工所在的部门名称,要求显示员工名和部门名。
select e.ename,(select d.dname from dept d where e.deptno = d.deptno) as dname
from emp e;
在from后面嵌套子查询
e.g 找出每个部门平均薪水的等级。
- 第一步:找出每个部门平均薪水(按照部门编号分组,求sal的平均值)
select DEPTNO, avg(SAL) from emp group by DEPTNO; - 第二步:将以上的查询结果当做临时表es,让es表和salgrade s表连接
select es.*, s.GRADE
from (select DEPTNO, avg(SAL) as avg_sal from emp group by DEPTNO) es
left join salgrade s
on es.avg_sal between s.LOSAL and s.HISAL;
在where子句中使用子查询
e.g 找出高于平均薪资的员工信息。
select * from emp where SAL > (select avg(SAL) from emp);
10. union (可以将查询结果集相加)
e.g 找出工作岗位是SALESMAN和MANAGER的员工
- 第一种:select ename,job from emp where job = ‘MANAGER’ or job = ‘SALESMAN’;
- 第二种:select ename,job from emp where job in(‘MANAGER’,‘SALESMAN’);
- 第三种:union
select ename,job from emp where job = ‘MANAGER’
union
select ename,job from emp where job = ‘SALESMAN’;
11. limit (重点,用于分页查询)
- limit是mysql特有的,不通用,其他数据库中没有。(Oracle中的相同机制,叫rownum)
- limit截取结果集中的部分数据
- 语法机制:limit startIndex, length
startIndex表示起始位置,从0开始,0表示第一条数据;length表示取几个
e.g 取找出工资排名在第4到第9名的员工
降序:
select ENAME,SAL from emp order by SAL desc;
取第4到第9名:
select ENAME, SAL from emp order by SAL desc limit 3,6;
12. 计算两个日期的时间差
语法格式:TimeStampDiff(间隔类型, 前一个日期, 后一个日期)
间隔类型 | 解释 |
SECOND | 秒 |
MINUTE | 分钟 |
HOUR | 小时 |
DAY | 天 |
WEEK | 星期 |
MONTH | 月 |
QUARTER | 季度 |
YEAR | 年 |
13. 完整DQL语句的执行顺序
select …5
from … 1
where …2
group by … 3
having … 4(与group by一起使用,不可以单独的出现)
order by …6
limit …7
原则:能在where中过滤的数据,尽量在where中过滤,效率较高。having的过滤是专门对分组之后的数据进行过滤的。