数据库(三)

78 阅读4分钟

数据库(三)

条件判断语句:

在mysql中,允许根据查询结果值的不同,返回不同的内容。

双分支语句:相当于三目运算符,条件满足,返回一个结果;条件不满足,返回另一个结果。

-- 显示所有学生,并且显示该学生的成绩是否合格

SELECT s.*,**IF(s_grade>=60,'合格','不合格')** grade FROM t_student s;

多分支语句:相当于 if …… else if ……

查询:

-- 查询所有学生,并且显示该学生的等级(优良中差) 

SELECT s. ***,** (**CASE WHEN** s_grade IS NULL **THEN** '缺考' **WHEN** s_grade>=90 **THEN** '优' **WHEN** s_grade>=80 **THEN** '良' **WHEN** s_grade>=60 **THEN** '中' **ELSE** '差' **END** ) grade FROM t_student s;

修改:

-- 药品类商品上涨5元,食品类商品上涨2元,酒类商品上涨10元 

UPDATE t_product **SET t_price=t_price+** (
CASE **WHEN** t_productType='药品类' **THEN 5****WHEN** t_productType='食品类' THEN 2ELSE 10 END);

聚合函数:

count

统计行的数量

1、count(*) :统计所有符合条件的记录

-- 统计有几种商品 
SELECT **COUNT(*)** FROM t_product; 

-- 统计食品类商品有几个 
SELECT **COUNT(*)** FROM t_product **WHERE** t_productType='食品类';

2、count(列名) :只统计非空

-- 统计非null厂家记录 
SELECT **COUNT(t_factory)** FROM t_product;

3、count(distinct 列名) :只统计非空、不重复的列

-- 统计有几类商品 
SELECT **COUNT(DISTINCT t_productType)** FROM t_product;
sum

统计某个列的总和

-- 统计商品的总价格 
SELECT SUM(t_price) FROM t_product;
avg

统计某个列的平均值只统计非空列;而sum/count统计所有列。

-- 统计商品的平均价格 
SELECT **AVG(t_price)** ,**SUM(t_price)/COUNT(*)** FROM t_product;
max

统计某个列的最大值

min

统计某个列的最小值不统计空值

-- 统计商品价格最大值和最小值 
SELECT MAX(t_price),MIN(t_price) FROM t_product;

分组查询:

group By:

分组就是将指定规则中相同的数据进行”小区域(组)”的划分,然后针对若干个“小区域”进行数据处理。

分组执行在where以后,是对where条件筛选的结果进行分组。

-- 统计每一类商品的数量 
SELECT t_productType,COUNT(*) FROM t_product **GROUP BY** t_productType;

-- 统计价格在50元以上,每类商品数量 
SELECT t_productType,COUNT(*) FROM t_product **WHERE** t_price>=50 **GROUP BY** t_productType;

注意:分组后,查询列只能出现分组列和聚合函数。

多列分组:

在group By 后面可以跟多个列,多个列的值完全相同算一个组。

-- 统计每个厂家生产不同类别商品的数量,厂家和类别都相同为一个组 

SELECT **t_factory,t_productType**,COUNT(*) FROM t_product GROUP BY **t_factory,t_productType**;
Having:

having 是对分组以后的结果进行筛选,执行在分组之后

-- 查询商品类别数量在3个以上的类别 
SELECT t_productType,COUNT( *) FROM t_product GROUP BY t_productType **HAVING** COUNT(* )>3;

Where 和 Having 的区别

Where 执行在分组之前不能跟聚合函数

Having 执行在分组之后,是对分组结果进行筛选,一般使用聚合函数进行筛选。

SQL执行顺序:

后执行的子句,可以使用前执行子句中的计算结果、定义的别名等。

执行顺序:(除select外)

1、执行 from

2、执行 where 进行条件筛选

3、执行 group by 分组

4、执行 select 查询列

5、执行 having 对分组结果进行筛选

6、执行 order by 排序

7、执行 limit 返回限定行

子查询:

在一个查询语句中在嵌套一个查询语句,称为子查询。

-- 查询比绿豆糕价格更高的商品 
SELECT * FROM t_product WHERE t_price> **(SELECT t_price FROM t_product WHERE t_productName='绿豆糕')** ;

-- 查询所有员工的姓名,以及该员工所处的部门名称 
SELECT e_name,(SELECT d_name FROM t_dept WHERE pk_deptId=fk_deptId) deptName FROM t_employee;

1、子查询嵌在 from 之后,相当于临时表。也就是将子查询查询的结果当作表来用。

注意:子查询的结果必须加别名

-- 查询张勇是做什么工作 
SELECT * FROM **(SELECT e_name,(SELECT d_info FROM t_dept WHERE pk_deptId=fk_deptId)
info FROM t_employee) eminfo** WHERE e_name='张勇';

2、在 where 后嵌入子查询。如果子查询的结果是单行单列(查询结果只有一个值),外查询才可以使用 =、!=、 >、>=、 <、 <=。

-- 查询和钱二同一个部门的员工 SELECT * FROM t_employee WHERE fk_deptId=(SELECT fk_deptId FROM t_employee WHERE e_name='钱二');

注意:如果子查询返回的结果是多行多列外查询只能用 in 或 not in

-- 查询和张勇、周军同一个部门的员工 
SELECT * FROM t_employee WHERE fk_deptId **IN**
(SELECT fk_deptId FROM t_employee WHERE e_name **IN**('张勇','周军'));
All:

和子查询的结果逐一比较,必须全部满足时表达式的值才为真。

-- 查询所有比食品类商品价格更高的商品 
SELECT * FROM t_product WHERE t_price >ALL(SELECT t_price FROM t_product WHERE t_productType='食品类'); 
SELECT * FROM t_product WHERE t_price >(SELECT MAX(t_price) FROM t_product WHERE t_productType='食品类');
Any:

和子查询的结果逐一比较,其中一条记录满足条件则表达式的值就为真。

-- 查询比任意食品类商品价格高的商品 
SELECT * FROM t_product WHERE t_price >ANY
(SELECT t_price FROM t_product WHERE t_productType='食品类');
exists:

判断子查询是否存在数据,如果存在则表达式为真,反之为假;not exists 相反。