面試題一面試
有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";