目的:
1.临时创建的一张表,方便查询,用完就丢
2.对于复杂的查询事件,每次查询都需要编写MySQL代码效率低下。为了解决这个问题,数据库提供了视图
区别:视图不是表,视图是虚表,视图依赖于表
语法:
CREATE VIEW <视图名称>(<列名1>,<列名2>,...) AS
【例子】
CREATE VIEW productsum (product_type, cnt_product)
AS
SELECT product_type, COUNT(*)
FROM product
GROUP BY product_type ;
select * from productsum;
#在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;
ALTER VIEW <视图名> AS
【例子】
alter view productsum as
select product_type,sale_price
from product
where regist_date>'2009-09-01';
UPDATE productsum
SET sale_price = '5000'
WHERE product_type = '办公用品';
#原表数据也更新了(不推荐)
DROP VIEW productSum;
出现在其他语句的select语句,称为子查询或内查询,外部的叫主查询
【示例】
select name from employees where
department_id in(
select department_id from departments
where location_id=1700
)
分类
按结果集的行列数不同
按子查询出现的位置
特点:搭配单行操作符使用 > < >= <= = <>
#谁的工资比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)
特点:搭配多行操作符使用 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)
);
定义:通过一些标志将内外两层的查询连接起来起到过滤数据的目的。
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 函数名(实参列表)
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 – 字符串的截取
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 |
+---------------------+------+-------+------+------+--------+--------+
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
用于字符串的部分一致查询。
FROM samplelike
WHERE strcol LIKE 'ddd%'; #samplelike 表; strcol 数据; 'dddabc'
WHERE strcol LIKE '%ddd%'; #中间是ddd abcddd,abdddc,dddabc
WHERE strcol LIKE 'abc__'; #abcdd
使用 BETWEEN 可以进行范围查询。该谓词与其他谓词或者函数的不同之处在于它使用了 3 个参数。
SELECT product_name, sale_price
FROM product
WHERE sale_price BETWEEN 100 AND 1000; #闭区间
为了选取出某些值为 NULL 的列的数据,不能使用 =,而只能使用特定的谓词IS NULL。
WHERE purchase_price IS NULL;
多个查询条件取并集时可以选择使用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
可用IN,NOT IN代替。
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 |
+------+---------+------+---------+