PS:文章整理的知识内容及资料均来自极客时间《SQL必知必会》专栏编程
日期函数 EXTRACT: EXTRACT(YEAR FROM '2019-09-04') = YEAR('2019-09-4');
补充:在WHERE子句中使用SQL函数会使索引失效安全
注意:ORDER BY是对记录进行排序。若是在前面用到了GROUP BY,其实是一种分组的聚合方式,已经把一组的数据聚合成为了一条记录,因此再进行排序的时候,也至关因而对分的组进行排序模块化
player球员表为例:函数
例子: 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)
例子: SELECT player_id, player_name, height FROM player WHERE height > ANY (SELECT height FROM player WHERE team_id = 1002)
例子: SELECT player_id, player_name, height FROM player WHERE height > ALL (SELECT height FROM player WHERE team_id = 1002)
当查询字段字段进行了索引时,主表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
例子: SELECT * FROM player CROSS JOIN team
例子:SELECT player_id, team_id, player_name, height, team_name FROM player NATURAL JOIN team
例子:SELECT * FROM player LEFT JOIN team ON player.team_id = team.team_id
例子:SELECT * FROM player RIGHT JOIN team ON player.team_id = team.team_id
例子: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 中都对自链接处理进行了优化。排序
咱们须要了解到视图是虚拟表,自己不存储数据,若是想要经过视图对底层数据表的数据进行修改也会受到不少限制,一般咱们是把视图用于查询,也就是对 SQL 查询的一种封装。