sql
# 一、增删改查
# 1、数据库的四种操作
- insert 增
- delete 删
- update 改
- select 查 不改变数据库
# 2、查询SQL的结构是
SELECT... FROM... WHERE... GROUP BY... HAVING.... ORDER BY... LIMIT...
# 3、写SQL的顺序
**FROM-->WHERE-->GROUP BY-->SELECT-->HAVIGN-->ORDER BY-->LIMIT**
# 4、FROM的作用
FROM stu 将stu表的所有数据都获取过来
JOIN 以后说
# 5、WHERE的作用
对FROM 中获取的所有数据进行过滤 AND、OR、!= 符合的留下不符合的丢弃
# 6、GROUP BY的作用
GROUP BY classId 按照classId进行分组
分组后如果遇到SELECT那么输出的则是分组后每组的第一行数据
GROUP BY还可以和聚集函数在一起
聚集函数:
COUNT(),SUM(),MAX(),MIN(),AVG(),GROUP_CONCAT()
distinct代表不重复可以放在聚集函数里去重,否则函数不会去重
# 7、创建数据库(schema)
CREATE DATABASE Student;
# 8、创建表
CREATE TABLE stu(id int PRIMARY KEY,name char(10),class_id int) DEFAULT charset=utf8mb4
# 9、插入数据
INSERT into stu(id,name,class_id) VALUES(1,'张三',20),(2,'李四',20),(3,'王五',20),
(4,'小明',6),(5,'小红',6),(6,'小华',6),(7,'千钧',2),(8,'一发',2),(9,'淡季',2),(10,'小明',20)
SELECT * FROM stu WHERE class_id=20
SELECT * FROM stu GROUP BY class_id DESC
SELECT count(DISTINCT name),class_id FROM stu GROUP BY class_id DESC
SELECT sum(id),class_id FROM stu GROUP BY class_id DESC
# 二、JOIN
# 1、JOIN 表 ON 过滤条件
左表的每行数据都与右表每行数据按过滤条件匹配生成新表
# 2、LEFT JOIN 表 ON 过滤条件
区别: ①LEFT JOIN 必须有ON
②会检查左边表的数据是否都包含在新生成的表中如果包含那么与JOIN没区别
如果不包含那么会与NUL组成新的一行加入到新表中
# 三、子查询
# 1、WHERE里面的子查询
SELECT id FROM stu WHERE classId = (SELECT id FROM class WHERE teacher = '小红')
# 2、SELECT里面的子查询
SELECT id,(SELECT id FROM class WHERE teacher = '小红') FROM stu
# 3、FROM里面的子查询
SELECT stu.name FROM stu JOIN (SELECT * FROM class WHERE teacher='小红') AS c
ON stu.classId = c.id
注:FROM里面的子查询必须起别名
# 四、半连接
SELECT * FROM stu s1 WHERE s1.id = (SELECT MAX(id) FROM stu s2
WHERE s2.classId = s1.classId)
注:子查询用到了父查询里面的字段
# 五、索引
能被用到的才能作为索引
-- EXPLAIN 可以查看是否使用索引
EXPLAIN SELECT * FROM stu\G
MYSQL中主键是聚簇索引,其他的是非聚簇索引。聚簇索引下存的是数据,非聚簇下存的是主键。
每用一次非聚簇索引就会走一次聚簇索引。(如果没有主键则会默认创建一个看不见的主键)
全覆盖索引:SQL语句中用到的列全部包含于索引中,那么该索引就是这个SQL语句的全覆盖索引
这种情况下不会在走一遍聚簇索引
例:
SELECT classId FROM stu WHERE classId = 1;
# 六、数据库三范式和反模式
第一范式:强调属性的原子性约束,要求属性具有原子性不可再分解
第二范式:强调记录的唯一性约束,要求必须有一个主键,并且没有包含在主键中的列必须完全依赖于主键,而不 能只依赖主键的一部分
第三范式:强调属性的冗余性约束,非主键列必须直接依赖于主键。
范式可以避免数据冗余,监视我数据库的空间,减轻维护数据库完整性的麻烦,然而通过数据库范式化的设计会导致数据库业务涉及的表变多,并可能需要进行连表查询,这样会导致数据库性能下降,且不利于分库分表。
反模式:即空间换取时间,采用冗余数据避免表的关联查询
# 七、事务
设置事务级别
SET SESSION TRANSACTION ISOLATION LEVEL READ UMCOMMITTED;