DQL
完整语法:
select [ALL|DISTNCT]
查询的字段...
from 表名 [别名]
[left|right|inner join 表2] -- 联合查询
[on ...]
[where ...] -- 指定结果需满足的条件
[group by ...] -- 指定结果按照哪几个字段分组
[having ...] -- 过滤分组的记录必须满足的次要条件
[order by 排序字段 排序方式,排序字段 排序方式,...] -- 指定查询记录按一个或多个条件排序
[limit 开始的索引,每页显示的页数] -- 指定查询的记录从哪条至哪条
数 据 查 询 语 言 : 查 询 语 句 , 凡 是 select 语 句 都 是 DQL 。
-- 查全部
select * from student
-- 查询指定字段
select studentNo,studentName from student
-- 别名,给查询结果起一个别名(可以给字段起别名,也可以给表起别名)
select studentNo 学号,student 学生姓名 from student s
-- 查询成绩在95~100之间的学生
select studentid,studentResult from result
where studentResult>=95 AND studentResult<=100
-- 查询除了1000号学生之外的同学的成绩
select studentid,studentResult from result
where studentid!=1000
-- 学员考试成绩+1分查看
select studentid,studentResult+1 提分后 from result
---------like(匹配)--------
-- 查询姓刘的同学 like+% (通配符:%任意字符,_一个字符)
select studentid studentName from student
where studentid like ‘刘%‘
-- 查询姓刘的同学,后面有两个字的
select studentid studentName from student
where studentid like ‘刘__‘
-- 查询名字中有嘉字的同学
select studentid studentName from student
where studentid like ‘%嘉%‘
---------in (具体的一个或多个值,不能结合通配符使用)----------
-- 查询1001,1002,1005号的学生
select studentid,studentName from student
where studentin in (1000,1001,1005)
-- 查询在北京,安徽的学生
select studentid,studentName from student
where Address in (‘北京‘,‘安徽‘)
---------null和not null-----------
-- 查询地址为空的学生
select studentid,studentName from student
where address=‘‘ or address is null
-- 查询有出生日期(不为空)的学生
select studentid,studentName from student
where bornDate is not null
---------between(查询在范围内数据)----------
-- 查询学号在[95-100]之间的学生
select studentid,studentResult from student
where studentid between 95 and 100
函数Concat
作用:在查询出来的每一条数据前拼接字符串
-- 函数 Concat(a,b)拼接字符串 select Concat(‘id:‘,gradeid) id from grade
去重 distinct
作用:去除select查询出来的结果中重复的数据,只显示一条
select distinct gradeid from grade
-- 其他操作
select version() -- 查询版本号
select 100*3 计算结果 -- 用来计算
select @@auto_increment_increment --查询自增的步长
多表查询
-- 内连接(隐式)(查两表中交集数据) select s.studentid, studentName, SubjectNo, StudentResult from student s, result r on s.studentid=r.studentid -- 内连接(显式) select s.studentid, studentName, SubjectNo, StudentResult from student s inner join result r on s.studentid=r.studentid -- 左查询(查询出所有学生,即使在result表中没有该学生数据) select s.studentid,studentName,SubjectNo,StudentResult from student s left join result r on s.studentid=r.studentid -- 右查询(查询出所有有成绩的学生,左表student表中没有成绩的学生查不到) select s.studentid,studentName,SubjectNo,StudentResult from student s right join result r on s.studentid=r.studentid -- 查询缺考的同学 select s.studentid,studentName,SubjectNo,StudentResult from student s left join result r on s.studentid=r.studentid -- 查出所有的学生 where studentResult is null -- 筛选成绩为空的学生
操作 描述 inner join 如果表中至少有一个匹配,就返回行 left join 会从左表中返回所有的值,即使右表中没有匹配 right join 会从右表中返回所有的值,即使左表中没有匹配
自连接
自己的表和自己的表连接,核心:一张表看为两张一样的表即可
子查询
分页limit和排序order by
排序语法:order by 排序字段 排序方式(DESC、ASC)
分页语法:limit 开始的索引,每页显示的条数
? 开始索引=(当前的页码-1)*每页显示的条数
select * from student order by id desc -- 每页显示三条记录 limit 0,3; -- 第一页 -- limit 3,3 --第二页 -- limit 6,3 --第三页
聚合函数
----------- count() ---------------
-- 查询表中有多少条记录
select count(studentname) from student -- count(字段),会忽略所有的null值
select count(*) from student -- count(*),不会忽略null值
select count(1) from student -- count(1),不会忽略所有的null值
-- 如果查询字段为主键时,count(主键名)效率最高,如果不是主键count(1)比count(字段)快,如果表中多个列并且没有主键count(1)比count(*)快,如果表中只有一个字段并且不是主键,则count(*)最快。
----------sum()、avg()、max()、min()、-----------
select sum(studentResult) 总分 from result
select avg(studentResult) 平均分 from result
select max(studentResult) 最高分 from result
select min(studentResult) 最低分 from result
-- 查询不同课程的平均分、最高分、最低分
分组查询
语法:group by 分组字段
1.where 和 having的区别?where在分组之前进行限定,如果不满足条件,则不参与分组。having在分组之后进行限定,如果不满足,则不会被查出来。
2.where后不能跟集合函数,having可以进行聚合函数判断
-- 按照性别分组,分别查询男、女同学的平均分
select sex,avg(math)
from student
group by sex
-- 按照性别分组,分别查询男、女同学的平均分,人数
select sex,avg(math),count(id)
from student
group by sex
-- 按照性别分组,分别查询男、女同学的平均分、人数。要求:分数低于70分的人,不参与分组
select sex,avg(math),count(id)
from student
where math>70
group by sex
-- 按照性别分组,分别查询男、女的平均分,人数。要求:分数低于70分的人不参与分组,分组之后人数要大于2个人
select sex,avg(math),count(id)
from student
where math>70
group by sex
having count(id)>2
DML
数 据 操 作 语 言 : insert,delete,update , 对 表 当 中 的 数 据 进 行 增 删 改 。
1.添加
insert
-- 插入语句(添加)
-- insert into 表名 ([字段名1,字段名2,字段名三...]) values (‘值1‘,‘值2‘,‘值3‘...),(‘值1‘,‘值2‘,‘值3‘...)...
-- insert into grade (gradename) values (‘大四‘)
insert into grade values (1,‘大四‘)
-- 插入多条记录
insert into grade (gradeid,gradename) values (‘2‘,‘大二‘),(‘3‘,‘大三‘)
2.删除
delete命令
-- 删除数据
delete from student
-- 删除指定数据
delete from student where id=1
truncate命令
作用:完全清空一个数据库表,表的结构和索引约束不会变。
-- 清空 student 表
truncate student
3.修改
update
update 表名 set 字段=‘值‘,[字段=‘值‘]... where [条件]
符号 | 含义 | 实例 |
---|---|---|
= | 等于 | id=1 |
<>或!= | 不等于 | id!=1 |
> | 大于 | id>1 |
< | 小于 | id<2 |
>= | 大于等于 | |
<= | 小于等于 | |
between ... and ... | 在范围内[1,3] | id bentween 1 and 3 |
and | 和 | id<3 and id>1 |
or | 或 | id<3 or id>5 |
事务
事务的四大特性(数据库事务 transanction 正确执行的四个基本要素。)
ACID,原子性(Atomicity)、一致性(Correspondence)、隔离性(Isolation)、持久性(Durability)。
(1)原子性:整个事务中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
(2)一致性:在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。转账前总额是1000,转账后还是1000。
(3)隔离性:隔离状态执行事务,使它们好像是系统在给定时间内执行的唯一操作。如果有两个事务,运行在相同的时间内,执行相同的功能,事务的隔离性将确保每一事务在系统中认为只有该事务在使用系统。这种属性有时称为串行化,为了防止事务操作间的混淆必须串行化或序列化请求,使得在同一时间仅有一个请求用于同一数据。
(4)持久性:在事务没有提交前服务器断电,恢复到原装,在事务提交后断电,持久化到数据库。事务一旦提交则不可逆。
事物的隔离级别
脏读:指一个事物读取了另一个事务未提交的数据。
不可重复读:在事务内读取表中的某一行数据,多次读取的结果不同。
虚读(幻读):指在一个事务内读取到了别的事务插入的数据,导致前后读取不一致。
索引
索引是为了加速对表中数据行的检索而创建的一种分散的存储结构。
在一个表中,主键索引只能有一个,唯一索引可以有多个。
- 主键索引(primary key):唯一的标识,主键不能重复,只能有一个列作为索引。
- 唯一索引(unique key):避免重复的列出现,唯一索引可以重复,多个列都可以标识位 唯一索引。
- 常规索引(key/index):默认的,index/key关键字来设置。
- 全文索引(FullText):在特定的数据库引擎下才有,MyISAM。快速定位数据。
-- 显示所有的索引信息
show index from 表名
-- 增加一个全文索引 索引名 字段名
alter table 表名 add fulltext index studentName(studentName)
索引原则
优点
1.大大加快数据的检索速度;
2.创建唯一性索引,保证数据库表中每一行数据的唯一性;
3.加速表和表之间的连接;
4.在使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间。
缺点
1.索引需要占物理空间。
2.当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,降低了数据的维护速度。
数据库设计的三大范式
第一范式(1NF):每一列都是不可再分割的原子数据项。
第二范式(2NF):在第一范式的基础上,非码属性必须完全依赖于码。(在第一范式的基础上消除了非主属性对主码的部分函数依赖)
-
? 函数依赖:A-->B,如果通过A属性(属性组)的值,可以确定唯一B属性的值,则称B依赖于A。
? 学号-->姓名,(学号,课程号)-->分数
-
? 完全函数依赖:A-->B,如果A是一个属性组,则B属性的确定需要依赖于A属性组中所有的属性值。
? (学号,课程号)-->分数 #学号课程号两个一起才能唯一确定分数
-
? 部分函数依赖:A-->B,如果A是一个属性组,则B属性的确定只需要依赖于A属性组中的某一些属性即可。
? (学号,课程号)-->姓名 #学号可唯一确定姓名
-
? 传递函数依赖:A-->B,B-->C,如果通过A的属性(属性组)的值,可以唯一确定B属性的值,再通过B属性的值可以确定唯一C属性的值,则称C属性传递函数依赖于A。
? 码:如果在一张表中,一个属性或属性组被其他所有属性完全依赖,则称这个属性(属性组)为该表的码。
? 主属性:码属性组中所有的属性。
? 非主属性:除码属性组的属性。
第三范式(3NF):在第二范式的基础上任何非主属性不依赖于其他非主属性(在第二范式的基础上消除传递函数依赖)
show
show create database school -- 查看创建数据库的语句
show create table student -- 查看student数据表的定义语句
desc student -- 显示表的结构
show index from 表名 -- 显示所有索引信息