文章目录
DQL查询表中的记录
准备一张表stu
基础查询(单表查询)
1. 查询多个字段
SELECT 字段名1,字段名2,字段名3...... FROM 表名 W;
2. 查询单个字段并去重
SELECT DISTINCT 字段名 FROM 表名 W;
去重前
去重后
3. 查询多个字段去重
SELECT DISTINCT 字段名1,字段名2,字段名3...... FROM 表名 W;
要对应字段的值完全相同,才视为同一条记录,才能去重。
查询结果参与运算
SELECT 字段名1 + 字段名2 FROM 表名;
将每个人的数学和英语相加
注意第五条,数学=86,英语=NULL,结果为NUll。与我们预想的结果不同,应该设置为某条记录math或english值为NULL,视为0。
观察到总分的字段名过长,所以要取别名
SELECT 字段名 1 AS 别名, 字段名 2 AS 别名... FROM 表名;
条件查询
SELECT 字段名 FROM 表名 WHERE 条件;
流程:取出表中的每条数据,满足条件的记录就返回,不满足条件的记录不返回
语句 | 说明 |
---|---|
>、<、<=、>=、=、<> | <>在 SQL 中表示不等于,在 mysql 中也可以使用!=没有== |
BETWEEN…AND | 在一个范围之内,如:between 100 and 200 相当于条件在 100 到 200 之间,包头又包尾 |
IN(集合) | 集合表示多个值,使用逗号分隔 |
LIKE ‘张%’ | 模糊查询 |
IS NULL | 查询某一列为 NULL 的值,注:不能写=NULL |
and 或 && | SQL 中建议使用前者,后者并不通用。 |
or 或 | |
not 或 ! |
">"测试:年龄大于20岁的有哪些人
"="测试:年龄等于20岁的有哪些人
"!="测试:年龄不等于20岁的有哪些人
"BETWEEN…AND "测试:年龄在20~30岁之间的有哪些人
" IN(集合)"测试:年龄为19,22,25岁之间的有哪些人
"LIKE"测试:
- 名字中含马的有哪些人
-
名字中第二个字是化的有哪些人
-
查询名字有三个字的有哪些人
"IS NULL"测试:查询英语成绩为NULL有哪些人
约束查询(多表查询)
查询语句
- 排序查询
自己规定排序的规则,对某个字段进行升序或降序排序
ORDER BY 子句
- 聚合函数
SELECT 聚合函数(列名) FROM 表名;
- 分组查询
SELECT 字段 1,字段 2... FROM 表名 GROUP BY 分组字段 [HAVING 条件];
按性别分组,分别查询男女同学的平均分
按性别分组,分别查询男女同学的平均分
统计人数
按性别分组,分别查询男女同学的平均分
统计人数
在统计人数之前把分数小于等于70的记录筛掉
按性别分组,分别查询男女同学的平均分
统计人数
在统计人数之前把分数小于等于70的记录筛掉
在统计人数之后把组内人数小于等于2的记录筛掉
tip:where在分组之前限定,having在分组之后限定,也就是说先分组后限定
- 分页查询
SELECT *|字段列表 [as 别名] FROM 表名 [WHERE 子句] [GROUP BY 子句][HAVING 子句][ORDER BY子句][LIMIT 子句];
开始的索引=(当前的页码-1)*每一页的条数
约束
1. 主键约束 primary key
创建表时添加主键约束,非空且唯一
字段名 字段类型 PRIMARY KEY; -- 在创建的时候添加
创建表后,添加主键约束
ALTER TABLE 表名 MODIFY 字段名 字段类型 PRIMARY KEY; -- 在创建后添加
删除字段的主键约束
ALTER TABLE 表名 DROP PRIMARY KEY; --删除主键约束
自动增长
字段名 字段类型 AUTO_INCREMENT;
ALTER TABLE 表名 MODIFY 字段名 INT AUTO_INCREMENT;
ALTER TABLE 表名 MODIFY 字段名 INT;
2. 非空约束 not null
创建表时添加非空约束,也就是值不能为空
字段名 字段类型 NOT NULL; -- 在创建的时候添加
创建表后,添加非空约束
ALTER TABLE 表名 MODIFY 字段名 字段类型 NOT NULL; -- 在创建后添加
删除字段的非空约束
ALTER TABLE 表名 MODIFY 字段名 字段类型; -- 删除非空约束
3. 唯一约束 unique
创建表时添加唯一约束,也就是值不能重复,但允许有多个NULL值
字段名 字段类型 UNIQUE; -- 在创建的时候添加
创建表后,添加唯一约束
ALTER TABLE 表名 MODIFY 字段名 字段类型 UNIQUE; -- 在创建后添加
删除字段的唯一约束
ALTER TABLE 表名 DROP INDEX 字段名; -- 删除非空约束
4. 外键约束 foreign key
创建表时添加外键约束
[CONSTRAINT] [外键约束名称] FOREIGN KEY(外键字段名) REFERENCES 主表名(主键字段名)
创建表后,添加外键约束
ALTER TABLE 从表 ADD [CONSTRAINT] [外键约束名称] FOREIGN KEY (外键字段名) REFERENCES 主表(主键字段名);
删除字段的外键约束
ALTER TABLE 从表 drop foreign key 外键名称;
怎么实现主表和从表的同步拜变化,如主键字段id的1变成了5,那么外键字段dep_id应该之前值为1的数据应该全部也变成5,所以有了级联操作。
设置级联
ON UPDATE CASCADE
ON DELETE CASCADE
多表关系
一对一
一个人只有自己的身份证
学生(id,name,age)
身份证(id,number)
解决方法:
可以在任意一方建立外键指向另一方的主键
一对多
一个部门对应多个员工(一对多)
多的一方:员工(id,name,age)
一的一方:部门(id,name)
解决方法:
在多的一方(员工)建立外键(dept_id),指向一的一方(部门)的主键(id)
多对多
一个学生需要上很多课,一门课也需要许多学生去上
学生(id,name,age)
课程(id,name)
解决方法:
借助第三方中间表sid-cid,中间表至少包含两个字段(sid-cid),这两个字段作为第三张表的外键,这两个字段分别指向两张主表(学生,课程)的主键
相同的学生序号可以对应不同的课程,相同的课程序号也可以对应不同的学生
范式
第一范式(拆):每一列都是不可分割的原子数据项
第一范式是最基本的范式。如果数据库表中的所有字段值都是不可分解的原子值,就说明该数据库表满足了第一范式。
第二范式:非码属性必须完全依赖于码(消除非码属性对主码的部分函数依赖)
第二范式需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)。
第三范式(任何非主属性不依赖于其他非主属性)
第三范式需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关。