面试题一面试
有A表(id,sex,par,c1,c2),B(id,age,c1,c2)两张表,其中A.id与B.id关联,如今要求写出一条SQL语句,将B中age>50的记录的c1,c2更新到A表中统一记录中的c1,c2字段中设计
SQL语句一:update A as a,B as b set a.c1=b.c1,a.c2=b.c2 where a.id=b.id and age>50;io
SQL语句二:update A inner join B on A.id = B.id set A.c1 = B.c1,A.c2=B.c2 where B.age >50;table
六种关联查询date
交叉链接(CROSS JOIN)select
SELECT * FROM A,B(,C) 或者 SELECT * FROM A CROSS JOIN B (CROSS JOIN C)nio
没有任何关联条件,结果时笛卡尔积,结果集会很大,没有意义,不多使用。im
内链接(INNER JOIN)数据
SELECT * FROM A,B WHERE A.id = B.id;查询
SELECT FROM A INNER JOIN B ON A.id = B.id;
多表中同时符合某种条件的数据记录的集合
内链接分为三类
等值链接:ON A.id = B.id
不等值链接:ON A.id > B.id
自链接:select * from a t1 inner join a t2 on t1.id = t2.pid;
外链接(LEFT JOIN / RIGHT JOIN)
左外链接:LEFT OUTER JOIN ,以左表为主,先查询出左表,按照ON后的关联条件匹配右表,没有匹配到的用NULL填充,能够简写成LEFT JOIN
右外链接:RIGHT OUTER JOIN, 以右表为主,先查询出右表,按照ON后的关联条件匹配左表,没有匹配到的用null填充,能够简写成RIGHT JOIN
联合查询(UNION / UNION ALL )
select * from a union select * from b union ....
就是把多个结果集集合中在一块儿,union前的结果为基准,须要注意的时联合查询的列数要相等,相同的记录会合并,若是使用union all ,不会合并重复的记录行
全链接(FULL JOIN)
MySQL不支持全链接
能够使用left join 和right 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)
根据考题要搞清楚表的结构和多表之间的关系,根据想要的结果思考使用哪一种关联方式,一般要把查询的列先写出来,而后分析这些列都属于那些表,才考虑使用关联查询
面试题二
为了记录足球比赛的结果,设计表以下:
参赛队伍表 team
字段名称 | 类型 | 描述 |
teamid | int | 主键 |
teamName | varchar(20) | 队伍名称 |
赛程表 match
字段名称 | 类型 | 描述 |
matchid | int | 主键 |
hostTeamid | int | 主队id |
guestTeamid | int | 客队id |
matchResult | varchar(20) | 比赛结果 |
matchTime | Date | 比赛日期 |
其中,match赛程表中的hostTeamID与guestTeamID 都和team表中的teamid关联,查询2006-6-1到2006-1-1之间举行的全部比赛,而且用如下形式列出:拜仁 2:0 不莱梅 2006-6-21
SQL语句:SELECT t1.teamName,m.matchResult,t2.teamName,m.matchTime FROM matchs as m LEFT JOIN team as t1 ON m.hostTeamid=t1.teamid LEFT JOIN team as t2 ON m.guestTeamid=t2.teamid WHERE m.matchTime BETWEEN "2006-06-01" AND "2006-07-01";