03. 视图,子查询,函数

03. 视图,子查询,函数

一、视图

目的:

1.临时创建的一张表,方便查询,用完就丢

2.对于复杂的查询事件,每次查询都需要编写MySQL代码效率低下。为了解决这个问题,数据库提供了视图

区别:视图不是表,视图是虚表,视图依赖于表

语法:

CREATE VIEW <视图名称>(<列名1>,<列名2>,...) AS <SELECT语句>

【例子】

CREATE VIEW productsum (product_type, cnt_product)
AS
SELECT product_type, COUNT(*)
  FROM product
 GROUP BY product_type ;
 
select * from productsum;

在这里插入图片描述

1.创建视图
#在product表和shop_product表的基础上,通过id合并在一起
CREATE VIEW view_shop_product(product_type, sale_price, shop_name)
AS
SELECT product_type, sale_price, shop_name
  FROM product,
       shop_product
 WHERE product.product_id = shop_product.product_id;
2.修改视图结构
ALTER VIEW <视图名> AS <SELECT语句>

【例子】

alter view productsum as
	select product_type,sale_price
	from product
	where regist_date>'2009-09-01';

在这里插入图片描述

3.更新视图
UPDATE productsum
   SET sale_price = '5000'
 WHERE product_type = '办公用品';
 #原表数据也更新了(不推荐)

在这里插入图片描述

4. 删除视图
DROP VIEW productSum;

二、子查询(套娃)

2.1 含义

出现在其他语句的select语句,称为子查询或内查询,外部的叫主查询

【示例】

select name from employees where
department_id in(
	select department_id from departments
    where location_id=1700
)
  1. 分类

    按结果集的行列数不同

    • 标量子查询(一列一行)
    • 列子查询(一列多行)
    • 行子查询(一行多列)
    • 表子查询(结果集一般为多行多列)

    按子查询出现的位置

    • select 后面:标量子查询
    • from 后面:表子查询
    • where/having后面:标量子查询 √,列子查询√,行子查询
    • exists后面:表子查询
2.2 标量子查询(单行)

特点:搭配单行操作符使用 > < >= <= = <>

#谁的工资比abel高
select * from empployees
	where salary>(select salary from employees 
	where last_name='Abel');  #()里面是abel的工资
#查询最低工资大于50号部门最低工资的部门id和其最低工资
select min(salary),departmrnt_id
from employees
group by department_id
having min(salary)>
(select min(salary) from employees where department_id=50)
2.3 多行子查询

特点:搭配多行操作符使用 in/ not in any/ some all

#返回location_id是1400或1700的部门中所有员工的姓名
select last_name from employees
where department_id in          #in
	(select distinct department_id
    from departments
    where location_id in(1400,1700)
    );
2.4 关联子查询

定义:通过一些标志将内外两层的查询连接起来起到过滤数据的目的。

SELECT product_type, product_name, sale_price
  FROM product AS p1
 WHERE sale_price > (SELECT AVG(sale_price)
                       FROM product AS p2
                      WHERE p1.product_type = p2.product_type
   GROUP BY product_type);

在这里插入图片描述

三、常见函数

select 函数名(实参列表)
3.1 算数函数
  • select abs(): 返回绝对值。
  • select mod(N,M): 返回N被M除的余数%。
  • select floor(x): 返回不大于x的最大整数值。
  • select ceiling(x): 返回不小于x的最小整数值。
  • select round(x): 返回x四舍五入的整数。
3.2 字符串函数
  • select ASCII(str): 返回字符串str的最左面字符的ASCII代码值。

    select ASCII('2');   #50
    select ASCII(2);   #50
    select ASCII('dx')  #100
    
  • concat(str1,str2…): 返回来自于参数连结的字符串,如果任何参数是NULL,返回NULL。超过2个参数,一个数字参数被变换为等价的字符串形式。

    select CONCAT('My', 'S', 'QL');   #MySQL
    select CONCAT('My', NULL, 'QL');   #NULL
    select CONCAT(14.3);  #14.3
    
  • length(str): 返回字符串str的长度。

  • locate(substr,str): 返回子串substr在字符串str第一个出现的位置。

    select LOCATE('bar', 'foobarbar');   #4
    select LOCATE('xbar', 'foobar');  #0
    
  • INSTR(str,substr): 返回子串substr在字符串str中的第一个出现的位置。

  • LOWER – 小写转换

  • REPLACE – 字符串的替换

  • SUBSTRING – 字符串的截取

3.3 日期函数
  • select CURRENT_DATE – 获取当前日期

  • ​ CURRENT_TIME – 当前时间

  • CURRENT_TIMESTAMP – 当前日期和时间

  • EXTRACT – 截取日期元素

    SELECT CURRENT_TIMESTAMP as now,
    EXTRACT(YEAR   FROM CURRENT_TIMESTAMP) AS year,
    EXTRACT(MONTH  FROM CURRENT_TIMESTAMP) AS month,
    EXTRACT(DAY    FROM CURRENT_TIMESTAMP) AS day,
    EXTRACT(HOUR   FROM CURRENT_TIMESTAMP) AS hour,
    EXTRACT(MINUTE FROM CURRENT_TIMESTAMP) AS MINute,
    EXTRACT(SECOND FROM CURRENT_TIMESTAMP) AS second;
    +---------------------+------+-------+------+------+--------+--------+
    | now                 | year | month | day  | hour | MINute | second |
    +---------------------+------+-------+------+------+--------+--------+
    | 2020-08-08 17:34:38 | 2020 |     8 |    8 |   17 |     34 |     38 |
    +---------------------+------+-------+------+------+--------+--------+
    
3.4 转换函数
  • CAST – 类型转换

    #将字符串类型转换为数值类型
    SELECT CAST('0001' AS SIGNED INTEGER) AS int_col;
    #将字符串类型转换为日期类型
    SELECT CAST('2009-12-14' AS DATE) AS date_col;
    
  • COALESCE – 将NULL转换为其他值

四、谓词

定义:返回值为真值的函数:like, between, is null, is not null, in, exists

1.like谓词

用于字符串的部分一致查询。

FROM samplelike      
WHERE strcol LIKE 'ddd%';  #samplelike 表; strcol 数据; 'dddabc'
WHERE strcol LIKE '%ddd%';  #中间是ddd abcddd,abdddc,dddabc
WHERE strcol LIKE 'abc__';  #abcdd
2. between谓词

使用 BETWEEN 可以进行范围查询。该谓词与其他谓词或者函数的不同之处在于它使用了 3 个参数。

SELECT product_name, sale_price
FROM product
WHERE sale_price BETWEEN 100 AND 1000;  #闭区间
3. IS NULL、 IS NOT NULL

为了选取出某些值为 NULL 的列的数据,不能使用 =,而只能使用特定的谓词IS NULL。

WHERE purchase_price IS NULL;
4. IN谓词 – OR的简便用法

多个查询条件取并集时可以选择使用or语句。

WHERE purchase_price = 320
OR purchase_price = 500
OR purchase_price = 5000;

WHERE purchase_price IN (320, 500, 5000);
WHERE purchase_price NOT IN (320, 500, 5000);  #不是320,500,5000 不能包含NULL
5. EXIST 谓词

可用IN,NOT IN代替。

五、CASE表达式

CASE WHEN <求值表达式> THEN <表达式>
     WHEN <求值表达式> THEN <表达式>
     WHEN <求值表达式> THEN <表达式>
     .
     .
     .
ELSE <表达式>
END 

依次判断 when 表达式是否为真值,是则执行 THEN 后的语句,如果所有的 when 表达式均为假,则执行 ELSE 后的语句。

SELECT name,
       SUM(CASE WHEN subject = '语文' THEN score ELSE null END) as chinese,
       SUM(CASE WHEN subject = '数学' THEN score ELSE null END) as math,
       SUM(CASE WHEN subject = '外语' THEN score ELSE null END) as english
  FROM score
 GROUP BY name;
+------+---------+------+---------+
| name | chinese | math | english |
+------+---------+------+---------+
| 张三 |      93 |   88 |      91 |
| 李四 |      87 |   90 |      77 |
+------+---------+------+---------+
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值