MySQL的关联查询语句
六种关联查询
SELECT * FROM A,B(,C)或者
SELECT * FROM A CROSS JOIN B (CROSS JOIN C)
#没有任何关联条件,结果是笛卡尔积,结果集会很大,没有意义,很少使用
内连接(INNER JOIN)
SELECT * FROM A,B WHERE A.id=B.id或者
SELECT * FROM A INNER JOIN B ON A.id=B.id
多表中同时符合某种条件的数据记录的集合,INNER JOIN可以缩写为JOIN
内连接分为三类
外连接(LEFT JOIN/RIGHT JOIN)
联合查询(UNION与UNION ALL)
SELECT * FROM A UNION SELECT * FROM B UNION ...
全连接(FULL JOIN)
SELECT * FROM A LEFT JOIN B ON A.id=B.id UNION
SELECT * FROM A RIGHT JOIN B ON A.id=B.id
嵌套查询 用一条SQL语句得结果作为另外一条SQL语句得条件,效率不好把握 SELECT * FROM A WHERE id IN (SELECT id FROM B)
根据考题要搞清楚表的结果和多表之间的关系,根据想要的结果思考使用那种关联方式,通常把要查询的列先写出来,然后分析这些列都属于哪些表,才考虑使用关联查询
问题20: 为了记录足球比赛的结果,设计表如下: team:参赛队伍表 match:赛程表 其中,match赛程表中的hostTeamID与guestTeamID都和team表中的teamID关联,查询2006-6-1到2006-7-1之间举行的所有比赛,并且用以下形式列出:拜仁 2:0 不莱梅 2006-6-21
初步写一个基础的SQL:
SELECT hostTeamID,matchResult,matchTime guestTeamID from match where matchTime between "2006-6-1" and "2006-7-1";
通过外键联表,完成最终SQL:
select t1.teamName,m.matchResult,t2.teamName,m.matchTime from match as m left join team as t1 on m.hostTeamID = t1.teamID, left join team t2 on m.guestTeamID=t2.guestTeamID where m.matchTime between "2006-6-1" and "2006-7-1"
问题21:UNION与UNION ALL的区别?
问题22:一个6亿的表a,一个3亿的表b,通过外键tid关联,你如何最快的查询出满足条件的第50000到第50200中的这200条数据记录。
select * from a,b where a.tid = b.id and a.tid>50000 limit 200;
select * from b , (select tid from a limit 50000,200) a where b.id = a .tid;
问题23:拷贝表( 拷贝数据, 源表名:a 目标表名:b)
insert into b(a, b, c) select d,e,f from a;
问题24: Student(S#,Sname,Sage,Ssex) 学生表 Course(C#,Cname,T#) 课程表 SC(S#,C#,score) 成绩表 Teacher(T#,Tname) 教师表 查询没学过“叶平”老师课的同学的学号、姓名
select Student.S#,Student.Sname
from Student
where S# not in (select distinct( SC.S#) from SC,Course,Teacher where SC.C#=Course.C# and Teacher.T#=Course.T# and Teacher.Tname=’叶平’);
问题25:随机取出10条数据
SELECT * FROM users WHERE id >= ((SELECT MAX(id) FROM users)-(SELECT MIN(id) FROM users)) * RAND() + (SELECT MIN(id) FROM users) LIMIT 10
#此方法效率比直接用SELECT * FROM users order by rand() LIMIT 10高很多
问题26:请简述项目中优化SQL语句执行效率的方法,从哪些方面,SQL语句性能如何分析? 考点分析: 这道题主要考察的是查找分析SQL语句查询速度慢的方法 延伸考点:
如何查找查询速度慢的原因 记录慢查询日志,分析查询日志,不要直接打开慢查询日志进行分析,这样比较浪费时间和精力,可以使用pt-query-digest工具进行分析
set profiling=1;开启,服务器上所有执行语句会记录执行时间,存到临时表中
show profiles
show profile for query 临时表ID
show status会返回一些计数器,show global status会查看所有服务器级别的所有计数 有时根据这些计数,可以推测出哪些操作代价较高或者消耗时间多
观察是否有大量线程处于不正常的状态或特征
最常问的MySQL面试题五——每个开发人员都应该知道
分析单条SQL语句
优化查询过程中的数据访问
优化长难的查询语句
优化特定类型的查询语句
优化关联查询
优化子查询
优化LIMIT分页
优化UNION查询
优化WHERE子句
对于此类考题,先说明如何定位低效SQL语句,然后根据SQL语句可能低效的原因做排查,先从索引着手,如果索引没有问题,考虑以上几个方面,数据访问的问题,长难查询句的问题还是一些特定类型优化的问题,逐一回答。
SQL语句优化的一些方法?
select id from t where num is null可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:select id from t where num=
select id from t where num=10 or num=20可以这样查询:select id from t where num=10 union all select id from t where num=20
select id from t where num in(1,2,3) 对于连续的数值,能用 between 就不要用 in 了:select id from t where num between 1 and 3
select id from t where num=@num可以改为强制查询使用索引:select id from t with(index(索引名)) where num=@num
select id from t where num/2=100应改为:select id from t where num=100*2
select id from t where substring(name,1,3)=’abc’ ,name以abc开头的id应改为:
select id from t where name like ‘abc%’