Mysql基础知识整理笔记(二)

PS:文章整理的知识内容及资料均来自极客时间《SQL必知必会》专栏编程

SQL函数以及使用带来的问题

clipboard.png

日期函数 EXTRACT: EXTRACT(YEAR FROM '2019-09-04') = YEAR('2019-09-4');
补充:在WHERE子句中使用SQL函数会使索引失效安全

汇集函数的使用

clipboard.png

注意:ORDER BY是对记录进行排序。若是在前面用到了GROUP BY,其实是一种分组的聚合方式,已经把一组的数据聚合成为了一条记录,因此再进行排序的时候,也至关因而对分的组进行排序模块化

子查询的使用

clipboard.png

player球员表为例:函数

clipboard.png

  • 非关联子查询:子查询从数据表中查询了数据结果,且这个数据结果只执行一次,而后以这个数据结果做为主查询的条件进行过滤;
例子: SELECT player_name, height FROM player WHERE height = (SELECT max(height) FROM player)
  • 关联子查询:子查询的执行依赖于外部查询,子查询中的表用到了外部的表并进行了条件关联,每执行一次外部查询,子查询都要从新计算一次;
例子:
SELECT player_name, height, team_id FROM player AS a 
WHERE height > (SELECT avg(height) FROM player AS b WHERE a.team_id = b.team_id)
  • ANY(SOME)的使用:查询player表中的球员身高比team_id=1002的任一球员身高高的球员数据
例子:
SELECT player_id, player_name, height FROM player 
WHERE height > ANY (SELECT height FROM player WHERE team_id = 1002)
  • ALL的使用:查询比team_id=1002的全部球员身高都高的球员数据
例子:
SELECT player_id, player_name, height FROM player 
WHERE height > ALL (SELECT height FROM player WHERE team_id = 1002)
  • EXIST和IN的查询效率比较
当查询字段字段进行了索引时,主表A数据大于从表B数据,使用IN子查询效率较高,相反则使用EXIST效率较高,由于IN表是外边和内表进行hash链接,是先执行子查询。EXISTS是对外表进行循环,而后在内表进行查询。所以若是外表数据量大,则用IN,若是外表数据量小,则用EXISTS。IN有一个缺陷是不能判断NULL,所以若是字段存在NULL值,则会出现返回,所以最好使用NOT EXISTS。

例如如:性能

SELECT * FROM A WHERE cc IN (SELECT cc FROM B)
SELECT * FROM A WHERE EXIST (SELECT cc FROM B WHERE B.cc=A.cc)

当A小于B时,用EXIST。由于EXIST的实现,至关于外表循环,实现的逻辑相似于:优化

for i in A
    for j in B
        if j.cc == i.cc then ...

当B小于A时,用IN,由于实现的逻辑相似于:spa

for i in B
    for j in A
        if j.cc == i.cc then ...

因此哪一个表小就用哪一个表来驱动,A表小 就用EXIST,B表小 就用IN;code

链接的使用

  • 交叉链接(笛卡尔积):CROSS JOIN
例子: SELECT * FROM player CROSS JOIN team
  • 天然链接:NATURAL JOIN
例子:SELECT player_id, team_id, player_name, height, team_name FROM player NATURAL JOIN team
  • 左外链接:LEFT JOIN
例子:SELECT * FROM player LEFT JOIN team ON player.team_id = team.team_id
  • 右外链接:RIGHT JOIN
例子:SELECT * FROM player RIGHT JOIN team ON player.team_id = team.team_id
  • 自链接:JOIN
例子:SELECT b.player_name, b.height FROM player AS a JOIN player AS b 
ON a.player_name = '布雷克-格里芬' AND a.height < b.height

使用链接的注意事项

一、控制链接表的数量
多表链接就至关于嵌套 for 循环同样,很是消耗资源,会让 SQL 查询性能降低得很严重,所以不要链接没必要要的表。在许多 DBMS 中,也都会有最大链接表的限制。

二、链接时使用WHERE语句过滤
多表链接的时候不要忘记了 WHERE语句,这样能够过滤掉没必要要的数据行返回。blog

三、使用自链接代替子查询
在自链接例子中,其实也可使用子查询。通常状况建议使用自链接,由于在许多 DBMS 的处理过程当中,对于自链接的处理速度要比子查询快得多。由于子查询其实是经过未知表进行查询后的条件判断,而自链接是经过已知的自身数据表进行条件判断,所以在大部分 DBMS 中都对自链接处理进行了优化。排序

视图

clipboard.png

咱们须要了解到视图是虚拟表,自己不存储数据,若是想要经过视图对底层数据表的数据进行修改也会受到不少限制,一般咱们是把视图用于查询,也就是对 SQL 查询的一种封装。
  1. 安全性:虚拟表是基于底层数据表的,咱们在使用视图时,通常不会轻易经过视图对底层数据进行修改,即便是使用单表的视图,也会受到限制,好比计算字段,类型转换等是没法经过视图来对底层数据进行修改的,这也在必定程度上保证了数据表的数据安全性。同时,咱们还能够针对不一样用户开放不一样的数据查询权限,好比人员薪酬是个敏感的字段,那么只给某个级别以上的人员开放,其余人的查询视图中则不提供这个字段。
  2. 简单清晰:视图是对 SQL 查询的封装,它能够将本来复杂的 SQL 查询简化,在编写好查询以后,咱们就能够直接重用它而没必要要知道基本的查询细节。同时咱们还能够在视图之上再嵌套视图。这样就比如咱们在进行模块化编程同样,不只结构清晰,还提高了代码的复用率。

存储过程

clipboard.png

游标

clipboard.png