MySQL 高级(进阶) SQL 语句

SQL高级语句:

---- SELECT ----显示表格中一个或数个字段的所有数据记录

语法: select * from 表名        #显示表的所有数据
       selcet 字段 from 表名     #显示对应字段的表数据

---- DISTINCT ----不显示重复的数据记录

select distinct 字段 from 表名    #不显示重复字段的数据记录

---- WHERE ----有条件查询

select 字段 from 表名 where 条件 #查询满足条件的字段
select * from 表名 where 条件 #查询表中满足条件的所有数据

---- AND (且)

select * from 表名 where (条件1 and 条件2);  #满足条件1和条件2

-----OR   (或)

select 字段 from 表名 where 条件1 0r 条件2   #满足条件1或条件2

---- BETWEEN ----显示两个值范围内的数据记录
 

语法:SELECT "字段" FROM "表名" WHERE "字段" BETWEEN '值1' AND '值2';
SELECT * FROM store_info WHERE Date BETWEEN '2020-12-06' AND '2020-12-10';

通配符 ----通常通配符都是跟 LIKE 一起使用的

  1. % :百分号表示零个、一个或多个字符
  2. _ :下划线表示单个字符
  3. 'A_Z':所有以 'A' 起头,另一个任何值的字符,且以 'Z' 为结尾的字符串。例如,'ABZ' 和 'A2Z' 都符合这一个模式,而 'AKKZ' 并不符合 (因为在 A 和 Z 之间有两个字符,而不是一个字符)。
  4. 'ABC%': 所有以 'ABC' 起头的字符串。例如,'ABCD' 和 'ABCABC' 都符合这个模式。
  5. '%XYZ': 所有以 'XYZ' 结尾的字符串。例如,'WXYZ' 和 'ZZXYZ' 都符合这个模式。
  6. '%AN%': 所有含有 'AN'这个模式的字符串。例如,'LOS ANGELES' 和 'SAN FRANCISCO' 都符合这个模式。
  7. '_AN%':所有第二个字母为 'A' 和第三个字母为 'N' 的字符串。例如,'SAN FRANCISCO' 符合这个模式,而 'LOS ANGELES' 则不符合这个模式。
     

---- LIKE ----匹配一个模式来找出我们要的数据记录

select * from 表名 where 字段 like 条件   


---- ORDER BY ----按关键字排序

select * from 表名 (where 条件) order by 字段 asc/desc 
asc 升序 默认
desc 降序 

数学函数

  1. rand()   返回 0 到 1 的随机数
  2. round(x,y)  保留 x 的 y 位小数四舍五入后的值
  3. truncate(x,y)   返回数字 x 截断为 y 位小数的值
  4. greatest(值1, 值2, ....)   返回集合中最大的值,也可以返回多个字段的最大的值
  5. least(值1, 值2, ....)   返回集合中最小的值,也可以返回多个字段的最小的值
  6. mod(x,y) 返回   x 除以 y 以后的余数
  7. power(x,y)      返回 x 的 y 次方
     

聚合函数 用于获取一个字段里的值:

  1. avg()     返回指定列的平均值
  2. sum()    返回指定列的所有值之和
  3. count()  返回指定列中非 NULL 值的个数
  4. min()     返回指定列的最小值
  5. max()    返回指定列的最大值
     

字符串函数:

  1. concat('字符串1', '字符串2', ....)    将提供的参数 x 和 y 拼接成一个字符串
  2. substr(x,y,z)               获取从字符串 x 中的第 y 个位置开始长度为 z 的字符串
  3. replace(x,y,z)             将字符串 z 替代字符串 x 中的字符串 y
  4. length(x)                    返回字符串 x 的长度
  5. upper(x)                     将字符串 x 的所有字母变成大写字母
  6. lower(x)                     将字符串 x 的所有字母变成小写字母
  7. left(x,y)                      返回字符串 x 的前 y 个字符
  8. right(x,y)                     返回字符串 x 的后 y 个字符
     

字符串截取: 面试题

echo abcdefg
i=abcdefg #定义变量

echo ${i:2:2}   #从下标2开始截取两个    下标从0开始计算

echo abcdefg | cut  -b 3-4       #截取下标3到4个的   cut下表从1开始

expr substr $i 3 2                  #expr下表从1开始  

使用字符串函数连接两个字段:

select concat (字段,字段2) from 表名;   字符串要加 ' '

select 字段1 || 字段2 from 表名    字符串要加 ' '   #要开启PIPES_AS_CONCAT 模式

1.

2.

使用字符串函数截取

select substr(字段,y,z) from 表名 where 语句;
slect substr(store_name,5,6)form location where store_name='los Angles';

GROUP BY :

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

原则:GROUP BY 有一个原则,凡是在 GROUP BY 后面出现的字段,必须在 SELECT 后面出现;凡是在 SELECT 后面出现的、且未在聚合函数中出现的字段,必须出现在 GROUP BY 后面。

HAVING:

用来过滤由 GROUP BY 语句返回的记录集,通常与 GROUP BY 语句联合使用
HAVING 语句的存在弥补了 WHERE 关键字不能与聚合函数联合使用的不足。

原因:是因为SQL语句执行顺序中having优先级低于where。
 

select 字段1 聚合函数(字段2) from 表 group by 字段1   #分组,通常会结合聚合函数使用,分组也有去重的效果  
select 字段1 聚合函数(字段2) from 表 group by 字段1 having (函数条件); #having的作用:过滤group by分组后的结果

别名 :字段別名 表格別名

语法:SELECT "表格別名"."字段1" [AS] "字段別名" FROM "表格名" [AS] "表格別名"; 【】代表可以省略

子查询  :用于连接表格,内查询的结果会作为外查询的条件来使用

select 字段 from 表名1 where 字段 比较运算符(select 字段 from 表2 where 条件表达式)

EXISTS:用来根据条件过滤查询结果,并只返回满足条件的行  

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

#这里的子查询作为条件进行判断。如果子查询返回至少一行结果,则外部查询的结果将包含该行

---- 连接查询 ----

  1. inner join(内连接):只返回两个表中联结字段相等的行
  2. left join(左连接):   返回包括左表中的所有记录和右表中联结字段相等的记录 ,不相等的行返回NULL
  3. right join(右连接): 返回包括右表中的所有记录和左表中联结字段相等的记录,不相等的行返回NULL 

求交集

内连接:select A.字段 from 左表 A inner join 右表 B on A.字段=B.字段;
               select A.字段 from 左表 A inner join 右表 B using(字段);

using(字段)=  on A.字段=B.字段;

 

联集

union          联集,将两个select查询语句的结果合并,并去重
union all      联集,将两个select查询语句的结果合并,不去重

 用联集求两个表无交集

select 字段 from 左表 A  left join 右表 B on A.字段=B的字段 where B字段 is null 
#求右表与左表无交集的字段
select 字段 from 左表 A  right join 右表 B on A.字段=B。字段 where A字段 is null
#求左边与右表无交集的字段


再使用联集
select 字段 from 左表 A  left join 右表 B on A.字段=B的字段 where B字段 is null  
union all
select 字段 from 左表 A  right join 右表 B on A.字段=B。字段 where A字段 is null
就可以显示出两表无交集的字段

MySQL 8.0 引入了许多高级 SQL 语句和功能,极大地增强了数据库的灵活性和性能。以下是一些关键的高级 SQL 语句及其用法,适用于 MySQL 8.0 的高级用户和数据库开发者: ### 1. **窗口函数(Window Functions)** 窗口函数允许在结果集的某个“窗口”上执行聚合、排序或其他计算,而不必使用 GROUP BY。这在处理排名、累计统计等场景时非常有用。 ```sql SELECT employee_id, department, salary, RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS salary_rank FROM employees; ``` 该查询为每个部门的员工按薪资排名,使用 `RANK()` 窗口函数,`PARTITION BY` 按部门分组,`ORDER BY` 按薪资降序排列[^1]。 ### 2. **公用表表达式(Common Table Expressions, CTE)** CTE 提供了一种更清晰的方式来编写复杂的子查询,尤其是在递归查询中表现优异。 ```sql WITH RECURSIVE hierarchy AS ( SELECT employee_id, manager_id, name FROM employees WHERE manager_id IS NULL UNION ALL SELECT e.employee_id, e.manager_id, e.name FROM employees e INNER JOIN hierarchy h ON e.manager_id = h.employee_id ) SELECT * FROM hierarchy; ``` 此查询使用递归 CTE 来获取组织结构中的所有员工层级关系,从没有上级的员工开始,逐级展开[^1]。 ### 3. **JSON 函数增强** MySQL 8.0 提供了更强大的 JSON 数据类型支持,并引入了多个 JSON 函数来处理 JSON 数据。 ```sql SELECT json_data->'$.name' AS name, JSON_UNQUOTE(json_data->'$.address.city') AS city FROM json_table; ``` 上述查询使用 `->` 运算符提取 JSON 字段,并使用 `JSON_UNQUOTE()` 去除 JSON 值中的引号。此外,`JSON_TABLE()` 函数可以将 JSON 数组转换为关系表格式,便于进一步查询[^2]。 ### 4. **原子 DDL(Atomic DDL)** MySQL 8.0 引入了原子 DDL 操作,确保 DDL 操作要么完全成功,要么失败回滚,避免了部分完成导致的数据不一致问题。 ```sql CREATE TABLE new_table ( id INT PRIMARY KEY, name VARCHAR(100) ) ENGINE=InnoDB; ``` 该操作在 MySQL 8.0 中是原子的,如果在创建过程中发生错误,系统将回滚整个操作,而不是留下部分结构[^2]。 ### 5. **性能模式(Performance Schema)增强** MySQL 8.0 对 Performance Schema 进行了增强,提供了更详细的性能监控信息。 ```sql SELECT EVENT_NAME, COUNT_STAR AS total_events, SUM_TIMER_WAIT AS total_time FROM performance_schema.events_statements_summary_by_digest ORDER BY total_time DESC LIMIT 10; ``` 此查询展示了最耗时的 SQL 语句摘要,帮助识别性能瓶颈并进行针对性优化[^1]。 ### 6. **索引优化与隐藏索引(Invisible Indexes)** MySQL 8.0 支持隐藏索引,允许临时禁用索引而不删除它,便于测试和性能调优。 ```sql ALTER INDEX idx_employee_name ON employees INVISIBLE; ``` 该语句将 `idx_employee_name` 索引设置为隐藏状态,查询优化器将忽略该索引,但索引仍然存在,便于后续恢复使用。 ### 7. **函数索引(Functional Indexes)** MySQL 8.0 支持基于表达式的索引,允许在计算列或表达式上创建索引。 ```sql CREATE INDEX idx_lower_name ON employees ((LOWER(name))); ``` 此索引可用于加速对 `name` 字段进行 `LOWER()` 函数处理的查询,提升大小写不敏感搜索的性能。 ### 8. **优化器提示(Optimizer Hints)** MySQL 8.0 提供了更多优化器提示,允许开发者更精细地控制查询执行计划。 ```sql SELECT /*+ MAX_EXECUTION_TIME(5000) */ * FROM orders WHERE status = 'pending'; ``` 该查询使用 `MAX_EXECUTION_TIME` 提示限制查询执行时间,防止长时间运行的查询影响系统性能。 ### 9. **并行查询(Parallel Query)** 虽然 MySQL 本身不直接支持并行查询,但通过分区表和多线程客户端可以实现一定程度的并行处理。 ```sql SELECT * FROM sales_2023_q1 WHERE region = 'North'; UNION ALL SELECT * FROM sales_2023_q2 WHERE region = 'North'; ``` 该查询通过 `UNION ALL` 将多个分区表查询并行执行,提升大数据量下的查询效率[^1]。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值