MySQL数据库|Day1_9 Java学习之DQL语言与完整性约束

目录

一、DQL语言
DQL语言的概述
DQL基础查询
DQL条件查询
DQL模糊查询
DQL字段控住查询
二、完整性约束
完整性约束的概述
主键约束与主键自增长
非空约束
唯一约束
外键约束

一、DQL语言

  • DQL语言的概述
解析:
1.DQL(Data Query Language) 就是数据查询语言,数据库执行DQL语句不会对数据进行改变,而是让数据库发送结果集给客户端。
2.这个语言集是数据库学习的重点必须掌握理解。
  • DQL基础查询
语法格式:
1.查询所有列(也就是表的所有记录)
SELECT * FROM 表名;
示例:select * from stu;
特别注意: * 号代表查询所有字段,在实际开发中尽量少用(不直观、影响效率)。
2.查询指定列
SELECT 字段1, 字段2, 字段3 ... FROM 表名 ;
示例:select sid,sname,gender from stu;
示例结果:select * from stu;
MySQL数据库|Day1_9 Java学习之DQL语言与完整性约束
文章图片

示例结果:select sid,sname,gender from stu;
MySQL数据库|Day1_9 Java学习之DQL语言与完整性约束
文章图片

  • DQL条件查询
解析:
1.条件查询就是在查询时给出WHERE子句,在WHERE子句中可以使用如下运算符及关键字:
1.1、=、!=、<>(不等于)、<、<=、>、>=
1.2、BETWEEN…AND(介于两者之间的范围)
1.3、IN(set)(用于多个值的判断)
1.4、IS NULL(是空值)
1.5、AND &&(都是表示并且)
1.6、OR ||(都是表示或)
1.7、NOT !(都是表示不是,非)
使用演示:以下结果小伙伴们一定要自己去按照查询需求自己去亲手操作。
-- 查询性别为女,并且年龄50的记录
select sid,sname,age,gender from stu WHERE gender = 'female' and age=50;
-- 查询学号为S_1001,或者姓名为liSi的记录
select * FROM stu where sid = 'S_1001' or sname = 'liSi';
-- 查询学号为S_1001,S_1002,S_1003的记录
select * from stu WHERE sid in('S_1001','S_1002','S_1003');
-- 查询学号不是S_1001,S_1002,S_1003的记录
select * from stu WHERE sid not in ('S_1001','S_1002','S_1003');
-- 查询年龄为null的记录
select * from stu WHERE age is null;
-- 查询年龄在20到40之间的学生记录
select * from stu WHERE age >= 20 and age <=40; select * from stu WHERE age BETWEEN 20 and 40;
-- 查询性别非男的学生记录
select * from stu WHERE gender!='male';
select * from stu WHERE gender<>'male';
select * from stu WHERE not gender='male';
-- 查询姓名不为null的学生记录
select * from stu WHERE not gender is null;
select * from stu WHEREgender is not null;
  • DQL模糊查询
解析:
1.当想查询姓名中包含z字母的学生时就需要使用模糊查询了。
2.模糊查询需要使用关键字LIKE。
3.也就是说模糊查询适用于查询表数据中包含我想查询的关键字符条件时使用,返回一个围绕关键字的结果集。
4.1模糊查询必须使用LIKE关键字。其中"_"匹配任意一个字母,5个"_"表示5个任意字母。
4.2 其中“%”匹配0~n个任何字母。
使用演示:
-- 查询姓名由5个字母构成,并且第5个字母为“i”的学生记录
select * from stu WHERE sname like '_____i';
-- 查询姓名以“z”开头的学生记录
select * from stu WHERE sname like 'z%';
-- 查询姓名中第2个字母为“i”的学生记录
select * from stu WHERE sname like '_i%';
-- 查询姓名中包含“a”字母的学生记录
select * from stu WHERE sname like '%a%';
  • DQL字段控住查询
以下查询都是在创建了一个emp表的前提下进行的:
-- 创建emp表的sql语句
create table emp(
empno int,
ename varchar(50),
job varchar(50),
mgr int,
hiredate DATE,
sal decimal(7,2),
comm decimal(7,2),
deptno int
);
1.去除重复记录 (就是去除查询列中的两行或两行以上的记录)
【MySQL数据库|Day1_9 Java学习之DQL语言与完整性约束】语法格式:SELECT DISTINCT 字段名 FROM 表名;
使用示例:SELECT DISTINCT job FROM emp; 作用:去除返回的job列数据中重复的记录。
2. 查看雇员的月薪与奖金之和
使用示例:SELECT *sal+comm FROM emp;
作用:再返回表中的所有记录的同时,再所有列后面再加一列sal+comm为各行的月薪与奖金之和。
特别注意:1.做运算的两个列的属性必须为数值类型否则将报错。2.若任意一列中的值为null时,会出现数据丢失,因为任何东西与NULL相加结果还是NULL,于是应是用IFNULL参与运算。
使用演示:SELECT *,sal+IFNULL(comm,0) FROM emp;
作用:将comm中的null转化为0再进行运算。
3.给列名添加别名
语法格式:SELECT 字段1 [ AS 别名1 ] , 字段2 [ AS 别名2 ] ... FROM 表名;
或者
SELECT 字段1 [ 别名1 ] , 字段2 [ 别名2 ] ... FROM 表名;
作用:就是将字段取一个符合实际情况的别名字。
使用实例:SELECT *, sal+IFNULL(comm,0) AS total FROM emp; 其中AS是可以省略的
4.排序
1.排序在日常开发中是非常常见的一个操作,有升序排序,也有降序排序。
2.语法格式:SELECT 字段列表 FROM 表名 ORDER BY 字段1 排序方式1 , 字段2 排序方式2 ,...;
其中排序方式:ASC : 升序(默认值) DESC: 降序
特别注意:在使用多字段排序的时候,只有当字段1值相同时,才会使用字段2的排序,以此类推。
使用示例:-- 查询所有学生记录,按年龄升序排序 默认升序
select * FROM stu ORDER BY age asc;
select * FROM stu ORDER BY age;
-- 查询所有学生记录,按年龄降序排序
select * from stu order by age desc;
-- 查询所有雇员,按月薪降序排序,如果月薪相同时,按编号升序排序
select * from emp order by sal,empno;
5.聚合函数
1.聚合函数作用:将一列数据作为一个整体,进行纵向计算
2.语法格式:
SELECT 聚合函数(字段列表) FROM 表名 ;
注意:null值是不参与任何的聚合函数运算的。
函数使用关键字如下表所示:
函数 描述
COUNT() 统计指定列不为NULL的记录行数
MAX() 计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算
MIN() 计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算
SUM() 计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0
AVG() 计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0
使用演示:
-- 聚合函数
-- count 当需要纵向统计时使用
-- 查询emp表中记录数
select count(*) as cnt from emp;
-- 查询emp表中有奖金的人数
select count(comm) cnt from emp;
-- 查询emp表中月薪大于2500的人数
select count(*) cnt FROM emp where sal >2500;
-- 统计月薪与佣金之和大于2500元的人数 记得使用ifnull避免数据丢失
select count(*) cnt from emp where sal+IFNULL(comm,0) > 2500;
-- 查询有佣金的人数,以及有领导的人数
select count(comm),count(mgr) from emp;

-- sum求一列数据的和 avg求一列数据的平均数 当需要纵向求和时使用sum 纵向求平均数时使用avg
-- 查询所有雇员月薪和
select sum(sal) FROM emp;
-- 查询所有雇员月薪和,以及所有雇员奖金和
select sum(sal),sum(comm) from emp;
-- 查询所有雇员月薪+奖金和
select sum(sal+IFNULL(comm,0)) from emp;
-- 统计所有员工平均工资
select avg(sal) from emp;

-- max min 求一列数据中的最大最小值的数据
select max(sal),min(sal) from emp;
6.分组查询
解析:
1.当需要分组查询时需要使用GROUP BY子句,分组的意思是将要分组的字段中的该字段列下的数据,按照数值相同的分为一组。
2.语法格式:
SELECT 字段列表 FROM 表名 [ WHERE 条件 ] GROUP BY 分组字段名 [ HAVING 分组 后过滤条件 ];
3.where与having区别:
3.1、执行时机不同:where是分组之前进行过滤,不满足where条件,不参与分组;而having是分组之后对结果进行过滤。
3.2、判断条件不同:where不能对聚合函数进行判断,而having可以。
特别注意:1、分组之后,查询的字段一般为聚合函数和分组字段,查询其他字段无任何意义。2、执行顺序: where > 聚合函数 > having 。3、支持多字段分组, 具体语法为 : group by columnA,columnB
使用演示:
-- 分组查询 就是将根据一列中相同的数据元素规为同一组
-- 查询每个部门的部门编号和每个部门的工资和
select deptno,sum(sal) from emp group by deptno;
-- 查询每个部门的部门编号以及每个部门的人数
select deptno,count(*) from emp group by deptno;
-- 查询每个部门的部门编号以及每个部门工资大于1500的人数
select deptno,count(*) from emp WHERE sal > 1500 group by deptno ;
-- HAVING子句
-- 查询工资总和大于9000的部门编号以及工资和
select deptno,sum(sal) from empgroup by deptno having sum(sal) > 9000;
7.分页查询
1.页操作在业务系统开发时,也是非常常见的一个功能,我们在网站中看到的各种各样的分页条,后台都需要借助于数据库的分页操作。MySQL使用LIMIT用来限定查询结果的起始行,以及总行数。
2.语法格式:SELECT 字段列表 FROM 表名 LIMIT 起始索引, 查询记录数 ;
特别注意:1、起始索引从0开始,起始索引 = (查询页码 - 1)* 每页显示记录数。2、分页查询是数据库的方言,不同的数据库有不同的实现,MySQL中是LIMIT。3、如果查询的是第一页数据,起始索引可以省略,直接简写为 limit 10。
使用演示:
-- 分页查询
-- 查询5行记录,起始行从0开始
select * from emp limit 0,5;
-- 查询10行记录,起始行从3开始
select * from emp limit 3,10;
由于以上查询结果过多就不一一列出运行结果了,想学好mysql数据操作的小伙伴一定要动手操作哦。
二、完整性约束
  • 完整性约束的概述
解析:
1.约束是作用于表中字段上的规则,用于限制存储在表中的数据。
2.目的:保证数据库中数据的正确、有效性和完整性。
3.约束是作用于表中字段上的,可以在创建表/修改表的时候添加约束。
约束的的分如下表所示:
约束 描述 关键字
非空约束 限制该字段的数据不能为null NOT NULL
主键约束 主键是一行数据的唯一标识,要求非空且唯一 PRIMARY KEY
唯一约束 保证该字段的所有数据都是唯一、不重复的 UNIQUE
默认约束 保存数据时,如果未指定该字段的值,则采用默认值 DEFAULT
外键约束 用来让两张表的数据之间建立连接,保证数据的一致性和完整性 FOREIGN KEY
检查约束(8.0.16版本之后) 保证字段值满足某一个条件 CHECK
  • 主键约束与主键自增长
解析:
1.被添加主键约束的列是作为该表中每一行的标识符的存在,应为该字段下的值唯一且非空。
2.MySQL提供了主键自动增长的功能!这样用户就不用再为是否有主键是否重复而烦恼了。当主键设置为自动增长后,在没有给出主键值时,主键的值会自动生成,而且是最大主键值+1,也就不会出现重复主键的可能了。
特别注意:该主键的数据类型必须为整型时才可以自增长。
使用演示:-- 主键约束
alter table stu add primary key(sid);
-- 删除主键约束
ALTER table stu drop primary key
-- 添加主键自增长 主键必须是整数类型才可增长
alter table stu change sid sid int AUTO_INCREMENT;
-- 移除主键自增长
alter table stu change sid sid int;
  • 非空约束
1.指定非空约束的列不能没有值,也就是说在插入记录时,对添加了非空约束的列一定要给值;在修改记录时,不能把非空列的值设置为NULL,若不给值将会报错。
使用演示:
-- 添加非空约束 以下两种都可
其中 stu代表表名 gender sname 代表字段名 char varchar 代表字段的数据类型
alter table stu CHANGE COLUMN gender gender char(10) not null;
alter table stu modify sname varchar(20) not null;
  • 唯一约束
1.添加唯一约束后的字段,那么该字段中的值就不可重复了必须是唯一的。
使用演示:
-- 添加唯一约束
alter table stu add UNIQUE(sname);
-- 移除唯一约束
ALTER TABLE stu DROP INDEX sname;
  • 外键约束
1.主外键是构成表与表关联的唯一途径!
2.外键是另一张表的主键!
3.外键的作用是为了保证数据的一致性和完整性的。
举例说明:
例如员工表与部门表之间就存在关联关系,其中员工表中的部门编号字段就是外键,是相对部门表的外键。如下图:
MySQL数据库|Day1_9 Java学习之DQL语言与完整性约束
文章图片

左侧的emp表是员工表,里面存储员工的基本信息,包含员工的ID、姓名、年龄、职位、薪资、入职日期、上级主管ID、部门ID,在员工的信息中存储的是部门的ID dept_id,而这个部门的ID是关联的部门表dept的主键id,那emp表的dept_id就是外键,关联的是另一张表的主键。
就是说我们在父表中将id为1的该行记录删除后,就不存在这个部门了,而子表中确还存在,这明显的不符合实际,从而会导致数据的错乱,为了避免这种情况的出现外键约束的作用就体现出来了。
语法格式:
alter table 表名 add constraint 外键名称 foreign key (外键字段名) references 主表 (主表列名);
--删除外键约束
alter table 表名 drop foreign key 外键名称;
使用演示:-- 添加外键约束
alter table emp add constraint dept_id_foreign foreign key (dept_id) references dept(id);
-- 删除外键约束
alter table emp drop foreign key dept_id_foreign;
4.删除/更新行为
解析:添加了外键之后,再删除父表数据时产生的约束行为,我们就称为删除/更新行为。具体的删除/更新行为有以下几种:
行为 说明
NO ACTION 当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除/更新。 (与 RESTRICT 一致) 默认行为
RESTRICT 当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除/更新。 (与 NO ACTION 一致) 默认行为
CASCADE 当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有,则也删除/更新外键在子表中的记录。
SET NULL 当在父表中删除对应记录时,首先检查该记录是否有对应外键,如果有则设置子表中该外键值为null(这就要求该外键允许取null)
SET DEFAULT 父表有变更时,子表将外键列设置成一个默认的值 (Innodb不支持)
语法格式:ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段) REFERENCES 主表名 (主表字段名) ON UPDATE CASCADE ON DELETE CASCADE;
使用演示:alter table emp add constraint fk_emp_dept_id foreign key (dept_id) references dept(id) on update cascade on delete cascade ;
作用:将emp子表的dept_id字段定义为外键,且在父表dept进行修改或者删除表记录时,通过外键的关联同时对对应的子表进行修改与删除操作。
添加上述约束后的运行比较结果;
修改父表之前:子表:MySQL数据库|Day1_9 Java学习之DQL语言与完整性约束
文章图片
修改父表之后:子表:根据结果我们不难看出以上的行为的确产生了级联效果。
MySQL数据库|Day1_9 Java学习之DQL语言与完整性约束
文章图片

特别注意:1.其中的NO ACTION 是添加外键后的默认行为。2.上述的行为都是在添加外键的前提下在添加上述的约束,这些约束效果就是由父表的操作而按照上述的添加行为在同时自动的对子表进行表记录操作。
5.表与表之间的关系
解析:
1、一对一:例如t_person表和t_card表,即人和身份证。这种情况需要找出主从关系,即谁是主表,谁是从表。人可以没有身份证,但身份证必须要有人才行,所以人是主表,而身份证是从表。设计从表可以有两种方案:
1.1、在t_card表中添加外键列(相对t_user表),并且给外键添加唯一约束;
1.2、给t_card表的主键添加外键约束(相对t_user表),即t_card表的主键也是外键。

2、一对多(多对一):最为常见的就是一对多!一对多和多对一,这是从哪个角度去看得出来的。t_user和t_section的关系,从t_user来看就是一对多,而从t_section的角度来看就是多对一!这种情况都是在多方创建外键!
理解:
1.多方就是从表也是创建外键的表。
2.emp 的 员工 为 多方 即为 从表 就是子表 在其中添加外键列 而 dept表即为一为主表
3.为emp表的dept_id字段添加外键约束,关联dept表的主键id。

3、多对多:例如t_stu和t_teacher表,即一个学生可以有多个老师,而一个老师也可以有多个学生。这种情况通常需要创建中间表来处理多对多关系。例如再创建一张表t_stu_tea表,给出两个外键,一个相对t_stu表的外键,另一个相对t_teacher表的外键。

    推荐阅读