[MySQL] MySQL 高级(进阶) SQL 语句

一、高效查询方式

1.1 指定指字段进行查看

事先准备好两张表

select 字段1,字段2 from 表名;

1.2 对字段进行去重查看  

 SELECT DISTINCT "字段" FROM "表名";

1.3 where条件查询 

 SELECT "字段" FROM 表名" WHERE "条件";

1.4 and 和 or 进行逻辑关系的增加 

 SELECT "字段" FROM "表名" WHERE "条件1"  AND "条件2";

 SELECT "字段" FROM "表名" WHERE "条件1"  OR "条件2";

1.5 查询取值列表中的数据 

 SELECT "字段" FROM "表名" WHERE "字段" IN ('值1', '值2', ...);   #in,遍历一个取值列表

1.6 between的引用 

 SELECT "字段" FROM "表名" WHERE "字段" BETWEEN '值1' AND '值2';

1.7 like的查询方式

like查询通常会与通配符配合使用

%:百分号表示零个、一一个或多个字符

 _:划线表示单个字符

SELECT * FROM Store_Info WHERE Store_Name like '%os%';
SELECT * FROM store_info WHERE Store_Name like '_os%';

1.8 排序方式进行查询 

order by,按关键字排序。

注意:

  • 一般对数值字段进行排序。
  • 如果对字符类型的字段进行排序,则会按首字母排序。
SELECT Store_Name,Sales,Date FROM store_info ORDER BY Sales DESC;
SELECT Store_Name,Sales,Date FROM store_info ORDER BY Sales asc;
#ASC是按照升序进行排序的,是默认的排序方式。
 #DESC是按降序方式进行排序。

 二、运用函数查询

2.1 数据库中常用数学的函数 

数学函数作用
abs(x)返回x的绝对值
rand()返回0到1的随机数
mod(x, y)返回x除以y以后的余数
power(x, y)返回x的y次方
round(x)返回离x最近的整数
round(x, y)保留x的y位小数四舍五入后的值
sqrt(x)返回x的平方根
truncate(x, y)返回数字x截断为y位小数的值 #不四舍五入
ceil(x)返回大于或等于x的最小整数
floor(x)返回小于或等于x的最大整数
greatest(x1,x2,...)返回集合中最大的值
least(x1,x2,...)返回集合中最小的值
SELECT abs(-1), rand(), mod(5,3), power(2,3), round(1.89);
SELECT round(1.8937,3), truncate(1.235,2), ceil(5.2), floor(2.1), least(1.89,3,6.1,2.1);

2.2 聚合函数  

聚合函数含义
avg()返回指定列的平均值
count()返回指定列中非 NULL 值的个数
min()返回指定列的最小值
max()返回指定列的最大值
sum(字段)返回指定列的所有值之和
SELECT avg(Sales) FROM Store_Info;

SELECT count(Store_Name) FROM store_info;
SELECT count(DISTINCT Store_Name) FROM Store_Info;

SELECT max(Sales) FROM Store_Info;
SELECT min(Sales) FROM Store_Info;

SELECT sum(Sales) FROM Store_Info;

2.3 字符串函数 

字符串函数作用
trim()返回去除指定格式的值
concat(x,y)将提供的参数 x 和 y 拼接成一个字符串
substr(x,y)获取从字符串 x 中的第 y 个位置开始的字符串,跟substring()函数作用相同
substr(x,y,z)获取从字符串 x 中的第 y 个位置开始长度为 z 的字符串
length(x)返回字符串 x 的长度
replace(x,y,z)将字符串 z 替代字符串 x 中的字符串 y
upper(x)将字符串 x 的所有字母变成大写字母
lower(x)将字符串 x 的所有字母变成小写字母
left(x,y)返回字符串 x 的前 y 个字符
right(x,y)返回字符串 x 的后 y 个字符
repeat(x,y)将字符串 x 重复 y 次
space(x)返回 x 个空格
strcmp(x,y)比较 x 和 y,返回的值可以为-1,0,1
reverse(x)将字符串 x 反转
 (1)去除字符 trim
 SELECT TRIM ([ [位置] [要移除的字符串] FROM ] 字符串);
 SELECT TRIM ([ [位置] [要移除的字符串] FROM ] 字符串);
 ​
 #[位置]:值可以为 LEADING (起头), TRAILING (结尾), BOTH (起头及结尾)。 
 #[要移除的字符串]:从字串的起头、结尾,或起头及结尾移除的字符串。缺省时为空格。

(2) 截取 substr
SELECT substr(Store_Name,3) FROM location WHERE Store_Name = 'Los Angeles';
SELECT substr(Store_Name,2,4) FROM location WHERE Store_Name = 'New York';

 

(3)字段拼接 
  1)concat(x,y)
SELECT concat(Region, Store_Name) FROM location WHERE Store_Name = 'Boston';

2)使用 || 符号 
SELECT Region || ' ' || Store_Name FROM location WHERE Store_Name = 'Boston';

(4)返回字符长度 length 
select length(name) from city;

(5)替换 replace 
SELECT REPLACE(Region,'ast','astern')FROM location;

三、高级查询语句 

3.1 GROUP BY(用于分组和汇总) 

对GROUPBY后面的字段的查询结果进行汇总分组,通常是结合聚合函数一起使用的     

   "GROUP BY"有一个原则,凡是在"GROUP BY"后面出现的字段,必须在SELECT 后面出现;

        凡是在SELECT 后面出现的、且未在聚合函数中出现的字段,必须出现在"GROUP BY"后面。

 (1)汇总统计
select name, count(name) from city group by name;

(2)汇总并对其指定字段(数字类)进行累加 
select name,sum(name) from city group by name;

(3)汇总并对其指定字段(数字类)进行累加,再进行降序 
select name,sum(name) from city group by name order by sum(name) desc;

3.2 HAVING 过滤 

  • 用来过滤由"GROUP BY"语句返回的记录集,通常与"GROUP BY"语句联合使用。

  • HAVING语句的存在弥补了WHERE 关键字不能与聚合函数联合使用的不足。

  • where只能对原表中的字段进行筛选,不能对group by后的结果进行筛选。

SELECT Store_Name, SUM(Sales) FROM store_info GROUP BY Store_Name HAVING SUM(Sales) > 1500;

3.3 别名设置查询  

 语法格式: 

 SELECT 字段1,字段2 AS 字段2的别名 from 表名;   #AS可以省略不写
(1)字段别名
SELECT A.Store_Name Store, SUM(A.Sales) "Total Sales" FROM store_info A GROUP BY A.Store_Name;
 (2)表别名
SELECT 表格别名.字段1 [AS] 字段别名  FROM 表格名 [AS] 表格别名; #AS可以省略不写

3.4  子查询语句 

子查询:连接表格,在WHERE 子句或HAVING 子句中插入另一个SQL语句。 

 SELECT "字段1" FROM "表格1" WHERE "字段2" [比较运算符]     #外查询
 (SELECT "字段1" FROM "表格2" WHERE "条件") ;             #内查询

普通的表数据连接: 

select * from location A, store_info B where A.Store_Name=B.Store_Name;

子查询加入表连接 : 

select * from store_info where Store_Name in(select Store_Name from location where Sales > 1000);

3.5 EXISTS 

  • 用来测试内查询有没有产生任何结果,类似布尔值是否为真。
  • 如果内查询有结果的话,系统就会执行外查询中的SQL语句。若是没有结果的话,那整个SQL语句就不会产生任何结果。

格式: 

 SELECT "字段1" FROM "表格1" WHERE EXISTS (SELECT * FROM "表格2" WHERE "条件");


SELECT SUM(Sales) FROM store_info WHERE EXISTS (SELECT * FROM location WHERE Region = 'West');

 四、表连接查询 

MYSQL数据库中常用的表连接有三种:

  • inner join(内连接):只返回两个表中联结字段相等的行(有交集的值)
  • left join(左连接):返回包括左表中的所有记录和右表中联结字段相等的记录
  • A  left  join  B  : A为左表,B为右表
  • right join(右连接):返回包括右表中的所有记录和左表中联结字段相等的记
  • A  right join  B:  A为左表 ,B为右表

(1) 内连接 inner join 

SELECT * FROM location A INNER JOIN store_info B on A.Store_Name = B.Store_Name ;
SELECT * FROM location A, store_info B WHERE A.Store_Name = B.Store_Name;
SELECT A.Region REGION, SUM(B.Sales) SALES FROM location A, store_info B 
WHERE A.Store_Name = B.Store_Name GROUP BY REGION;

 

(2)左连接 left join 

SELECT * FROM location A LEFT JOIN store_info B on A.Store_Name = B.Store_Name ;

 (3)右连接 left join 

SELECT * FROM location A RIGHT JOIN store_info B on A.Store_Name = B.Store_Name ;

五、view 视图的运用 

视图:可以被当作是虚拟表或存储查询。

  • 视图跟表格的不同是,表格中有实际储存数据记录,而视图是建立在表格之上的一个架构,它本身并不实际储存数据记录。
  • 临时表在用户退出或同数据库的连接断开后就自动消失了,而视图不会消失。
  • 视图不含有数据,只存储它的定义,它的用途一般可以简化复杂的查询。 比如你要对几个表进行连接查询,而且还要进行统计排序等操作,写SQL语句会很麻烦的,用视图将几个表联结起来,然后对这个视图进行查询操作,就和对一个表查询一样,很方便。

格式:

CREATE VIEW "视图表名" AS "SELECT 语句";   #创建视图表
 ​
 DROP VIEW "视图表名";                     #删除视图表

(1)视图的创建 

view V_sales as select store_namee,sum(sales) from store_info group by store_namme;

视图创建的数据验证: 

(2) 视图提供的后续便捷操作 

视图的好处:创建视图的过程虽然和高级查询语句(通过两个select语句进行组合条件划分生成派生表)一样,过程是复杂的,但是如果该查询操作是需要经常使用的,创建视图就很有必要,不仅能简化查询过程,还能对该查询进行进一步操作,而且十分简便。

select store_name from V_sales group by store_name having count(store_name) = 1;

(3)经典定义问题:视图能否插入数据  

视图能否插入数据,要看情况而定: 

1)如果视图表是两个表的连接查询(比如视图的A字段来自A表,B字段来自B表,数据是无法插入的)。因为表结构和原表不一致。视图中的字段是根据原表中某个字段,通过函数运算,产生的新字段,而没有真正能够存储的字段,所以该数据是无法插入的。

2)如果视图表结构与原表保持一致,数据是可以插入的,插入的数据是存储在原表中,视图所更新出的数据,其实是映射原表的数据。

六、UNION 联级

UNION联集:将两个SQL语句的结果合并起来,两个SQL语句所产生的字段需要是同样的数据记录种类。

6.1 UNION(合并后去重)

生成结果的数据记录值将没有重复,且按照字段的顺序进行排序。#合并后去重

格式:[select 语句1] UNION [select 语句2];
SELECT Store_Name FROM location UNION SELECT Store_Name FROM store_info;

6.2 UNION ALL(合并后不去重)  

SELECT Store_Name FROM location UNION ALL SELECT Store_Name FROM store_info;

七、交集值与无交集值

7.1 求交集值

SELECT DISTINCT A.Store_Name FROM location A INNER JOIN store_info B USING(Store_Name);

SELECT DISTINCT Store_Name FROM location WHERE (Store_Name) IN (SELECT Store_Name FROM store_info);

SELECT DISTINCT A.Store_Name FROM location A LEFT JOIN store_info B USING(Store_Name) WHERE B.Store_Name IS NOT NULL;

SELECT A.Store_Name FROM (SELECT B.Store_Name FROM location B INNER JOIN store_info C ON B.Store_Name = C.Store_Name) A 
GROUP BY A.Store_Name;

SELECT A.Store_Name FROM 
(SELECT DISTINCT Store_Name FROM location UNION ALL SELECT DISTINCT Store_Name FROM store_info) A 
GROUP BY A.Store_Name HAVING COUNT(*) > 1;

 

 

7.2 求无交集值 

SELECT DISTINCT Store_Name FROM location WHERE (Store_Name) NOT IN (SELECT Store_Name FROM store_info);

SELECT DISTINCT A.Store_Name FROM location A LEFT JOIN store_info B USING(Store_Name) WHERE B.Store_Name IS NULL;

SELECT A.Store_Name FROM 
(SELECT DISTINCT Store_Name FROM location UNION ALL SELECT DISTINCT Store_Name FROM store_info) A 
GROUP BY A.Store_Name HAVING COUNT(*) = 1;

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值