SQL-DQL(对表中数据的查询)

DQL查询表中的记录

准备一张表stu
准备好的表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岁之间的有哪些人

BETWEEN...AND测试

" IN(集合)"测试:年龄为19,22,25岁之间的有哪些人

IN(集合)测试

"LIKE"测试:

  1. 名字中含马的有哪些人

LIKE测试

  1. 名字中第二个字是化的有哪些人
    LIKE测试

  2. 查询名字有三个字的有哪些人
    LIKE测试

"IS NULL"测试:查询英语成绩为NULL有哪些人

IS NULL测试

约束查询(多表查询)

查询语句

  1. 排序查询
    自己规定排序的规则,对某个字段进行升序或降序排序
ORDER BY 子句

以数学成绩降序排序

以数学成绩升序排序
按数学成绩升序排序,如果相同,按英语成绩升序排序

  1. 聚合函数
SELECT 聚合函数(列名) FROM 表名;

count查询总人数
max求数学成绩的最大值
min求数学成绩的最小值
sum求数学总成绩
avg求数学成绩的平均分

  1. 分组查询
SELECT 字段 1,字段 2... FROM 表名 GROUP BY 分组字段 [HAVING 条件];

按性别分组,分别查询男女同学的平均分
按性别分组,分别查询男女同学的平均分

按性别分组,分别查询男女同学的平均分
统计人数
在这里插入图片描述

按性别分组,分别查询男女同学的平均分
统计人数
在统计人数之前把分数小于等于70的记录筛掉
在这里插入图片描述

按性别分组,分别查询男女同学的平均分
统计人数
在统计人数之前把分数小于等于70的记录筛掉
在统计人数之后把组内人数小于等于2的记录筛掉
在这里插入图片描述

tip:where在分组之前限定,having在分组之后限定,也就是说先分组后限定

  1. 分页查询
SELECT *|字段列表 [as 别名] FROM 表名 [WHERE 子句] [GROUP BY 子句][HAVING 子句][ORDER BY子句][LIMIT 子句];

开始的索引=(当前的页码-1)*每一页的条数
查询第4,5,6条记录

约束

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),这两个字段作为第三张表的外键,这两个字段分别指向两张主表(学生,课程)的主键
相同的学生序号可以对应不同的课程,相同的课程序号也可以对应不同的学生

范式

范式讲解

第一范式(拆):每一列都是不可分割的原子数据项

第一范式是最基本的范式。如果数据库表中的所有字段值都是不可分解的原子值,就说明该数据库表满足了第一范式。

第二范式:非码属性必须完全依赖于码(消除非码属性对主码的部分函数依赖)

第二范式需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)。

第三范式(任何非主属性不依赖于其他非主属性)

第三范式需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关。

数据库的备份和还原

猜你喜欢

转载自blog.csdn.net/weixin_45966880/article/details/114266749