1. 简单查询语句与约束
1.1. 本文
目录
1.3.1. 概念: 对表中的数据进行限定,保证数据的正确性、有效性和完整性。
1.3.2. 非空约束:not null,某一列的值不能为null
1.3.5. 外键约束:foreign key,让表于表产生关系,从而保证数据的正确性。
内容介绍
1.2. DQL:查询表中的记录(掌握)
* select * from 表名;
1.2.1. 基本语法
select
字段列表
from
表名列表
where
条件列表
group by
分组字段
having
分组之后的条件
order by
排序
limit
分页限定
1.2.2. 简单查询语句
-
多个字段的查询
select 字段名1,字段名2... from 表名;
注意: 如果查询所有字段,则可以使用*来替代字段列表。
-
去除重复:
distinct
注意:只有当查询的所有字段的值都相同,才会认为是重复数据
-
计算列
一般可以使用四则运算计算一些列的值。(一般只会进行数值型的计算)
ifnull(表达式1,表达式2)
:null参与的运算,计算结果都为null- 表达式1:哪个字段需要判断是否为null
- 如果该字段为null后的替换值。
-
起别名:
as
- 注意: as也可以省略
-
示例:
-- 查询表中的数据 SELECT * FROM student ; -- 按需查询 -- 查询学生的姓名 及数学分数 SELECT NAME ,math FROM student ; -- 查询学生的姓名 及数学分数 总分 SELECT DISTINCT `name` AS 姓名 ,math AS 数学,math+ IFNULL(english,0) AS 总分 FROM student;
1.2.3. 条件查询
什么是条件查询?
where子句后跟条件,对查询的结果进行筛选
条件运算符
运算类型 | 运算符 | 说明 |
---|---|---|
比较运算 | > 、< 、<= 、>= 、= 、<> | 例如: age>18 , <> 表示不等,在mysql5.x版本可以使用!= |
范围运算 | BETWEEN 值1 AND 值2 | 例如: BETWEEN a AND b ,值在a和b之间,含头含尾 |
集合运算 | IN( 集合) | 例如: in (1,2,3) ,值在集合之中 |
模糊运算 | LIKE _ 或者% | _ :单个任意字符 % :多个任意字符 |
空值运算 | IS NULL IS NOT NULL | 字段值为NULL 字段值不为NULL |
逻辑运算 | and && or ιι not ! | 与 或 非 |
数据准备
-- 数据准备
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
`id` int(11) DEFAULT NULL,
`name` varchar(20) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
`sex` varchar(5) DEFAULT NULL,
`address` varchar(100) DEFAULT NULL,
`math` int(11) DEFAULT NULL,
`english` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
insert into `student`(`id`,`name`,`age`,`sex`,`address`,`math`,`english`) values
(1,'马云',55,'男','杭州',66,78),
(2,'马化腾',45,'男','深圳',98,87),
(3,'马景涛',55,'男','香港',56,77),
(4,'柳岩',20,'女','湖南',76,65),
(5,'柳青',20,'男','湖南',86,NULL),
(6,'刘德华',57,'男','香港',99,99),
(7,'马德',22,'女','香港',99,99),
(8,'德玛西亚',18,'男','南京',56,65);
示例代码
-- 查询年龄大于20岁的学生
SELECT * FROM student WHERE age > 20;
SELECT * FROM student WHERE age >= 20;
-- 查询年龄等于20岁的学生
SELECT * FROM student WHERE age = 20;
-- 查询年龄不等于20岁的学生
SELECT * FROM student WHERE age != 20;
SELECT * FROM student WHERE age <> 20;
-- 查询年龄大于等于20 小于等于30 的学生
SELECT * FROM student WHERE age >= 20 && age <=30;
SELECT * FROM student WHERE age >= 20 AND age <=30;
SELECT * FROM student WHERE age BETWEEN 20 AND 30;
-- 查询年龄22岁,18岁,25岁的学生信息
SELECT * FROM student WHERE age = 22 OR age = 18 OR age = 25
SELECT * FROM student WHERE age IN (22,18,25);
-- 查询英语成绩为null的学生
SELECT * FROM student WHERE english = NULL; -- 不对的。null值不能使用 = (!=) 判断
SELECT * FROM student WHERE english IS NULL;
-- 查询英语成绩不为null的学生
SELECT * FROM student WHERE english IS NOT NULL;
-- 查询姓马的学生有哪些? like
SELECT * FROM student WHERE NAME LIKE '马%';
-- 查询姓名第二个字是化的的学生
SELECT * FROM student WHERE NAME LIKE "_化%";
-- 查询姓名是3个字的人的学生
SELECT * FROM student WHERE NAME LIKE '___';
-- 查询姓名中包含德的的学生
SELECT * FROM student WHERE NAME LIKE '%德%';
1.2.4. 排序查询
语法:order by 子句
order by 排序字段1 排序方式1 , 排序字段2 排序方式2...
排序方式
ASC:升序,默认的。
DESC:降序。
注意:
* 如果有多个排序条件,则当前边的条件值一样时,才会判断第二条件。
* 对含有null值的列进行排序,null永远最小
示例代码:
-- 查询学员信息,按照数学成绩升序排序 如果数学成绩相同按照英语成绩降序
SELECT * FROM student ORDER BY math ASC ,english DESC ;
-- 查询学生信息,按照英语升序排序
SELECT * FROM student ORDER BY english DESC ; -- 在mysql排序中null值最小
1.2.5. 聚合函数
将一列数据作为一个整体,进行纵向的计算。
1. count:计算个数
* 一般选择非空的列:主键 `count(id)`
* count(*)
* count(1)
2. max:计算最大值
3. min:计算最小值
4. sum:计算和
5. avg:计算平均值
注意:聚合函数的计算,排除null值。
1. 选择不包含非空的列进行计算
2. IFNULL函数
示例代码
-- 计算学生的个数
SELECT COUNT(id) FROM student;
SELECT COUNT(english) FROM student;
SELECT COUNT(*) FROM student;
SELECT COUNT(1) FROM student;
-- 计算所有学生的数学平均成绩
SELECT AVG(math) FROM student ;
-- 计算所有学生的数学最高分
SELECT MAX(math) FROM student ;
-- 计算所有学生的数学最低分
SELECT MIN(math) FROM student ;
-- 计算所有学生数学成绩的总和 和英语成绩的总和
SELECT SUM(math) AS 数学成绩 ,SUM(english) 英语成绩 FROM student ;
-- 计算所有学生数学成绩和英语成绩的总和
SELECT SUM(math)+ SUM(english) 成绩总和 FROM student ;
SELECT SUM(math+IFNULL(english,0)) FROM student ;
1.2.6. 分组查询
语法:group by 分组字段
注意:
1. 分组之后查询的字段:分组字段、聚合函数
2. where 和 having 的区别?
* where 在分组之前进行限定,如果不满足条件,则不参与分组。having在分组之后进行限定,如果不满足结果,则不会被查询出来
* 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;
SELECT sex , AVG(math),COUNT(id) 人数 FROM student WHERE math > 70 GROUP BY sex HAVING 人数 > 2;
1.2.7. 分页查询
语法:limit start,size; -- start开始索引,从0 开始算 size 每页显示的条数
公式:开始的索引 = (当前的页码 - 1) * 每页显示的条数
-- 每页显示3条记录
SELECT * FROM student LIMIT 0,3; -- 第1页
SELECT * FROM student LIMIT 3,3; -- 第2页
SELECT * FROM student LIMIT 6,3; -- 第3页
注意: limit 是一个MySQL"方言",只有Mysql数据库有limit.
1.3. 约束(理解约束的作用)
1.3.1. 概念: 对表中的数据进行限定,保证数据的正确性、有效性和完整性。
约束分为以下四种:
1. 非空约束:not null
2. 唯一约束:unique
3. 主键约束:primary key
4. 外键约束:foreign key
1.3.2. 非空约束:not null,某一列的值不能为null
添加非空约束
-- 1. 创建表时添加约束
CREATE TABLE stu(
id INT,
NAME VARCHAR(20) NOT NULL -- name为非空
);
-- 2. 创建表完后,添加非空约束
ALTER TABLE stu MODIFY NAME VARCHAR(20) NOT NULL;
删除非空约束
-- 3. 删除name的非空约束
ALTER TABLE stu MODIFY NAME VARCHAR(20);
1.3.3. 唯一约束:unique,某一列的值不能重复
添加唯一约束
-- 在创建表时,添加唯一约束
CREATE TABLE stu(
id INT,
phone_number VARCHAR(20) UNIQUE -- 手机号
);
-- 在表创建完后,添加唯一约束
ALTER TABLE stu MODIFY phone_number VARCHAR(20) UNIQUE;
删除唯一约束
-- 删除唯一约束
ALTER TABLE stu DROP INDEX phone_number;
注意:
在sql标准中规定唯一约束可以有NULL值,但是只能有一条记录为null ,但是各个数据库厂商对sql标准的实现是有区别的
例如: MYSQL 和 ORACLE 数据库, 唯一约束可以有多个NULL值, SQLSERVER数据库唯一约束就只能有一个NULL值
1.3.4. 主键约束:primary key。
添加主键约束
-- 1. 在创建表时,添加主键约束
create table stu(
id int primary key,-- 给id添加主键约束
name varchar(20)
);
-- 2. 创建完表后,添加主键
ALTER TABLE stu MODIFY id INT PRIMARY KEY;
删除主键约束
-- 删除主键
-- 错误 alter table stu modify id int ;
ALTER TABLE stu DROP PRIMARY KEY;
自动增长: 如果某一列是数值类型的,使用 auto_increment 可以来完成值得自动增长
-- 在创建表时,添加主键约束,并且完成主键自增长
create table stu(
id int primary key auto_increment,-- 给id添加主键约束
name varchar(20)
);
-- 删除自动增长
ALTER TABLE stu MODIFY id INT;
-- 添加自动增长
ALTER TABLE stu MODIFY id INT AUTO_INCREMENT;
注意:
1. 含义:非空且唯一
2. 一张表主键只能有一个,但是主键字段可以有多个,一个主键多个主键字段的情况我们称为`复合主键`
3. 主键就是表中记录的唯一标识
1.3.5. 外键约束:foreign key,让表于表产生关系,从而保证数据的正确性。
在创建表时,可以添加外键
create table 表名(
....
外键列
constraint 外键名称 foreign key (外键列名称) references 主表名称(主表列名称)
);
删除外键
ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;
创建表之后,添加外键
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名称) REFERENCES 主表名称(主表列名称);
示例代码
-- 准备数据
-- 创建部门表(id,dep_name,dep_location)
-- 一方,主表
CREATE TABLE department(
id INT PRIMARY KEY AUTO_INCREMENT,
dep_name VARCHAR(20),
dep_location VARCHAR(20)
);
-- 创建员工表(id,name,age,dep_id)
-- 多方,从表
CREATE TABLE employee(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20),
age INT,
dep_id INT, -- 外键对应主表的主键
-- 创建外键约束
constraint emp_depid_fk foreign key (dep_id) references department(id)
)
-- 添加2 个部门
INSERT INTO department VALUES(NULL, '研发部','广州'),(NULL, '销售部', '深圳');
SELECT * FROM department;
-- 添加员工,dep_id 表示员工所在的部门
INSERT INTO employee (NAME, age, dep_id) VALUES ('张三', 20, 1);
INSERT INTO employee (NAME, age, dep_id) VALUES ('李四', 21, 1);
INSERT INTO employee (NAME, age, dep_id) VALUES ('王五', 20, 1);
INSERT INTO employee (NAME, age, dep_id) VALUES ('老王', 20, 2);
INSERT INTO employee (NAME, age, dep_id) VALUES ('大王', 22, 2);
INSERT INTO employee (NAME, age, dep_id) VALUES ('小王', 18, 2);
-- 删除外键约束
alter table employee drop foreign key emp_depid_fk;
-- 表创建成功之后添加外键
alter table employee add constraint emp_depid_fk foreign key (dep_id) references department(id);
4. 级联操作(了解)
-- 1. 添加级联操作
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名称) REFERENCES 主表名称(主表列名称) ON UPDATE CASCADE ON DELETE CASCADE ;
分类:
* 级联更新:ON UPDATE CASCADE
* 级联删除:ON DELETE CASCADE
示例代码:
-- 表创建成功之后添加外键 添加级联操作
alter table employee add constraint emp_depid_fk foreign key (dep_id) references department(id) ON UPDATE CASCADE ON DELETE CASCADE ;