一、DQL:查询语句
1、排序查询
语法:
order by 子句
order by 排序字段1 排序方式1 ,排序字段2 排序方2...
排序方式:
-
ASC:升序[默认]
-
DESC:降序
-
在SQL语句中永远排序最后
注:
如果有多个排序条件,当前边的条件值一样时,才会判断第二条件。
聚合函数
定义:将一列数据作为一个整体,进行纵向的计算。
1、count:计算个数
一般选择非空的列:主键
2、count(*):总计总数
3、max:计算最大值
4、min:计算最小值
5、sum:计算和
6、avg:计算平均值
注:聚合函数的计算,排除null值。
解决方案:
1. 选择不包含非空的列进行计算 2. IFNULL函数
2、分组查询
语法:
group by 分组字段;
注:分组之后查询的字段:分组字段、聚合函数
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;
3、分页查询
语法:
limit 开始的索引,每页查询的条数;
公式:
开始的索引 = (当前的页码 - 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"方言"
4、多表查询
概念:在基本查询语句基础之上,增加关联表的查询
4.1 内连接查询
4.1.1 隐式查询
select 字段 ...
from 表1、表2、表3
where 条件
***练习示例***
-- 查询部门表和员工表中的所有数据 -- 多表的隐式查询
SELECT * FROM dept,emp
WHERE dept.id = emp.dept_id;
-- 统计不同部门的员工数量 -- 查询不同部门的员工
SELECT
dept.id,
dept.NAME,
emp.name
FROM dept,emp
WHERE dept.id = emp.dept_id;
-- 对不同部门的员工进行聚合
SELECT
dept.NAME,
COUNT(dept.NAME)
FROM dept,emp
WHERE dept.id = emp.dept_id
GROUP BY dept.NAME
4.1.2 显式查询
select 字段 ...
from 表1 inner join 关联表2 on 条件 表2 inner join 关联表3 on 条件 -- 显示多表查询 :inner join
SELECT
dept.id,
dept.NAME,
emp.name
FROM dept INNER JOIN emp ON dept.id =emp.dept_id
-- 显示查询不同部门的员工数量
SELECT
dept.NAME,
COUNT(dept.NAME)
FROM dept INNER JOIN emp ON dept.id =emp.dept_id
GROUP BY dept.NAME
4.2 外连接查询
4.2.1 左外连接查询
select * from
表1 left outer join
表2 on 条件
表1 的数据全部显式出来 如果表2存在空值,那么表2对应的字段也是空值null显示
-- 左外连接
SELECT * FROM dept LEFT OUTER JOIN emp ON dept.id = emp.dept_id;
-- 右外连接
SELECT * FROM emp RIGHT OUTER JOIN dept ON dept.id = emp.dept_id;
-- 应用场景 希望表中的数据全部查询出来,空值也显示出来
4.3 子查询
查询中嵌套查询,叫做子查询。
分类:
单行单例的查询:结果可以作为where 条件使用 关系运算符进行判断:
多行单列的查询;结果作为where 条件 使用 in 判断判断
多行多列的查询;结果作为数据源,虚拟的表的存在
***练习示例***
-- 查询员工员工最高的员工的部门 --
1、查询员工的最高工资 -- 2、根据员工的最高工资查询部门
SELECT
dept.NAME,
dept.id,
emp.name,
emp.salary
FROM dept,emp
WHERE dept.id=emp.dept_id
AND emp.salary=(SELECT MAX(salary) FROM emp)
5、约束
对表中的数据进行限定,保证数据的正确性、有效性和完整性。
-
分类:
-
主键约束:primary key
-
非空约束:not null
-
唯一约束:unique
-
外键约束:foreign key
4.1 非空约束:not null
某一列的值不能为null
-
创建表时添加约束
CREATE TABLE stu( id INT, NAME VARCHAR(20) NOT NULL );
-
创建表完后,添加非空约束
ALTER TABLE stu MODIFY NAME VARCHAR(20) NOT NULL;
-
删除name的非空约束
ALTER TABLE stu MODIFY NAME VARCHAR(20);
4.2 唯一约束:unique
某一列的值不能重复
-
注意:
唯一约束可以有NULL值,但是只能有一条记录为null -
在创建表时,添加唯一约束
CREATE TABLE stu( id INT, phone_number VARCHAR(20) UNIQUE );
-
删除唯一约束
ALTER TABLE stu DROP INDEX number;
-
在表创建完后,添加唯一约束
ALTER TABLE stu MODIFY number VARCHAR(20) UNIQUE;
4.3 主键约束:primary key
-
注意:
-
含义:非空且唯一
-
一张表只能有一个字段为主键
-
主键就是表中记录的唯一标识
-
-
在创建表时,添加主键约束
create table stu( id int primary key, -给id添加主键约束 name varchar(20) );
-
删除主键
ALTER TABLE stu DROP PRIMARY KEY;
-
创建完表后,添加主键
ALTER TABLE stu MODIFY id INT 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;
-
4.4 外键约束:foreign key
让表于表产生关系,从而保证数据的正确性。
-
在创建表时,可以添加外键
语法:-
create table 表名( .... 外键列 constraint 外键名称 foreign key (外键列名称) references 主表名称(主表列名称) );
-
-
删除外键
ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;
-
创建表之后,添加外键
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名称) REFERENCES 主表名称(主表列名称);
-
级联操作
-
添加级联操作 语法:
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名称) REFERENCES 主表名称(主表列名称) ON UPDATE CASCADE/ON DELETE CASCADE ;
-
分类:
-
级联更新:
ON UPDATE CASCADE
-
级联删除:
ON DELETE CASCADE
-
-