当前位置: 首页 > 后端技术 > PHP

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

时间:2023-03-29 13:57:45 PHP

PS:文中整理的知识内容和素材均来自极客时间《SQL必知必会》专栏SQL函数及使用日期函数引起的问题EXTRACT:EXTRACT(YEARFROM'2019-09-04')=YEAR('2019-09-4');补充:在WHERE子句中使用SQL函数会使索引失效聚合函数的使用注意:ORDERBY是对记录进行排序。如果在前面使用GROUPBY,其实就是一种分组聚合的方式,一组数据已经聚合成一条记录,所以在排序的时候,相当于对分组的子查询进行排序,以player表为举例:非关联子查询:子查询从数据表中查询数据结果,数据结果只执行一次,然后将数据结果作为主查询的条件进行过滤;示例:SELECTplayer_name,heightFROMplayerWHEREheight=(SELECTmax(height)FROMplayer)关联子查询:子查询的执行依赖于外部查询。子查询中的表使用外部表并与条件相关联。每次执行外部查询,都要重新计算子查询All;例子:SELECTplayer_name,height,team_idFROMplayerASaWHEREheight>(SELECTavg(height)FROMplayerASbWHEREa.team_id=b.team_id)ANY(SOME)的使用:查询player表player数据在身高高于任何team_id=1002球员的球员示例:SELECTplayer_id,player_name,heightFROMplayerWHEREheight>ANY(SELECTheightFROMplayerWHEREteam_id=1002)ALL的使用:查询比team_id=1002的球员数据示例allplayerswithhighheight:SELECTplayer_id,player_name,heightFROMplayerWHEREheight>ALL(SELECTheightFROMplayerWHEREteam_id=1002)EXIST和IN查询效率比较查询字段索引时,主要是A表的数据比表B的数据大,使用IN子查询效率更高。相反,使用EXIST效率更高,因为IN表是outerside和innertable的hash连接,先执行子查询。EXISTS循环遍历外表,然后查询内表。因此,如果外部数据量大,就用IN,如果外部数据量小,就用EXISTS。IN的一个缺陷是不能判断NULL,所以如果字段中有NULL值就会返回,所以最好使用NOTEXISTS。例如:SELECT*FROMAWHEREccIN(SELECTccFROMB)SELECT*FROMAWHEREEXIST(SELECTccFROMBWHEREB.cc=A.cc)当A小于B时,使用EXIST。因为EXIST的实现相当于外层循环,所以实现逻辑类似:foriinAforjinBifj.cc==i.ccthen...当B小于A时,使用IN,因为实现的逻辑类似于:foriinBforjinAifj.cc==i.ccthen...所以哪个表小,用哪个表驱动,A表小,用EXIST,B表小,用IN;connect使用交叉连接(笛卡尔积):CROSSJOIN例子:SELECT*FROMplayerCROSSJOINteamnaturaljoin:NATURALJOIN例子:SELECTplayer_id,team_id,player_name,height,team_nameFROMplayerNATURALJOINteamLeftouterjoin:LEFTJOIN示例:SELECT*FROMplayerLEFTJOINteamONplayer.team_id=team.team_id右外连接:RIGHTJOIN示例:SELECT*FROMplayerRIGHTJOINteamONplayer.team_id=team.team_id自连接:JOIN示例:SELECTb.player_name,b.heightFROMplayerASaJOINplayerASbONa.player_name='Blake-Griffin'ANDa.height