本篇講述的是對一個sql面試題的細致語法講解。關於執行流程(on where),內連接,外連接(左右)上實用。關於這些基本的語法知識請參考我前面的sql基本語法。
S(SNO,SNAME)學生學號,姓名
C(CNO,CNAME,CTEACHER)課程號,課程名,課成老師名。
SC(SNO,CNO,SCGRADE),SNO學號,CNO課程號,SCGRADE成績。
題1
要求:列出“1”號課程成績比“2”號課程成績高的所有學生學號及其“1”號課程和“2”號課程的成績

要求:列出“1”號課程成績比“2”號課程成績高的所有學生學號及其“1”號課程和“2”號課程的成績
1,分別查出1 2號課程的所有列表(包括學號,課程,成績)。
2,條件1課程表的成績>2課程表的成績。兩表連接查詢。
3,隱士的條件,這兩個表中的學號相等。兩表連接查詢。
4,select 表1或表2的序號,表1.成績,表2.成績。
5,分別起別名。
SELECT A.SNO as '學號',A.SCGRADE AS '1號課程',b.SCGRADE as '2號課程' FROM (SELECT *FROM SC WHERE CNO=1)AS A CROSS JOIN (SELECT * FROM SC WHERE CNO=2)as b WHERE A.SCGRADE>b.SCGRADE AND A.SNO=b.SNO; SELECT A.SNO as '學號',A.SCGRADE AS '1號課程',b.SCGRADE as '2號課程' FROM (SELECT SNO,SCGRADE FROM SC WHERE CNO=1)AS A CROSS JOIN (SELECT SNO,SCGRADE FROM SC WHERE CNO=2)as b WHERE A.SCGRADE>b.SCGRADE AND A.SNO=b.SNO; SELECT A.SNO as '學號',A.SCGRADE AS '1號課程',b.SCGRADE as '2號課程' FROM (SELECT SNO,SCGRADE FROM SC WHERE CNO=1)AS A INNER JOIN (SELECT SNO,SCGRADE FROM SC WHERE CNO=2)as b ON A.SCGRADE>b.SCGRADE AND A.SNO=b.SNO; SELECT A.SNO as '學號',A.SCGRADE AS '1號課程',b.SCGRADE as '2號課程' FROM (SELECT SNO,SCGRADE FROM SC WHERE CNO=1)AS A INNER JOIN (SELECT SNO,SCGRADE FROM SC WHERE CNO=2)as b ON A.SCGRADE>b.SCGRADE WHERE A.SNO=b.SNO; SELECT A.SNO as '學號',A.SCGRADE AS '1號課程',b.SCGRADE as '2號課程' FROM (SELECT SNO,SCGRADE FROM SC WHERE CNO=1)AS A LEFT JOIN (SELECT SNO,SCGRADE FROM SC WHERE CNO=2)as b ON A.SCGRADE>b.SCGRADE AND A.SNO=b.SNO; SELECT A.SNO as '學號',A.SCGRADE AS '1號課程',b.SCGRADE as '2號課程' FROM (SELECT SNO,SCGRADE FROM SC WHERE CNO=1)AS A LEFT JOIN (SELECT SNO,SCGRADE FROM SC WHERE CNO=2)as b ON A.SCGRADE>b.SCGRADE WHERE A.SNO=b.SNO; SELECT A.SNO as '學號',A.SCGRADE AS '1號課程',b.SCGRADE as '2號課程' FROM (SELECT SNO,SCGRADE FROM SC WHERE CNO=1)AS A RIGHT JOIN (SELECT SNO,SCGRADE FROM SC WHERE CNO=2)as b ON A.SCGRADE>b.SCGRADE AND A.SNO=b.SNO;
第一種:
SELECT A.SNO as '學號',A.SCGRADE AS '1號課程',b.SCGRADE as '2號課程' FROM (SELECT *FROM SC WHERE CNO=1)AS A CROSS JOIN (SELECT * FROM SC WHERE CNO=2)as b WHERE A.SCGRADE>b.SCGRADE AND A.SNO=b.SNO;

第二種:
SELECT A.SNO as '學號',A.SCGRADE AS '1號課程',b.SCGRADE as '2號課程' FROM (SELECT SNO,SCGRADE FROM SC WHERE CNO=1)AS A CROSS JOIN (SELECT SNO,SCGRADE FROM SC WHERE CNO=2)as b WHERE A.SCGRADE>b.SCGRADE AND A.SNO=b.SNO;
第三種
SELECT A.SNO as '學號',A.SCGRADE AS '1號課程',b.SCGRADE as '2號課程' FROM (SELECT SNO,SCGRADE FROM SC WHERE CNO=1)AS A INNER JOIN (SELECT SNO,SCGRADE FROM SC WHERE CNO=2)as b ON A.SCGRADE>b.SCGRADE AND A.SNO=b.SNO;

第四種:
SELECT A.SNO as '學號',A.SCGRADE AS '1號課程',b.SCGRADE as '2號課程' FROM (SELECT SNO,SCGRADE FROM SC WHERE CNO=1)AS A INNER JOIN (SELECT SNO,SCGRADE FROM SC WHERE CNO=2)as b ON A.SCGRADE>b.SCGRADE WHERE A.SNO=b.SNO;
第五種:
SELECT A.SNO as '學號',A.SCGRADE AS '1號課程',b.SCGRADE as '2號課程' FROM (SELECT SNO,SCGRADE FROM SC WHERE CNO=1)AS A LEFT JOIN (SELECT SNO,SCGRADE FROM SC WHERE CNO=2)as b ON A.SCGRADE>b.SCGRADE AND A.SNO=b.SNO;
第六種:
SELECT A.SNO as '學號',A.SCGRADE AS '1號課程',b.SCGRADE as '2號課程' FROM (SELECT SNO,SCGRADE FROM SC WHERE CNO=1)AS A LEFT JOIN (SELECT SNO,SCGRADE FROM SC WHERE CNO=2)as b ON A.SCGRADE>b.SCGRADE WHERE A.SNO=b.SNO;
第七種:
SELECT A.SNO as '學號',A.SCGRADE AS '1號課程',b.SCGRADE as '2號課程' FROM (SELECT SNO,SCGRADE FROM SC WHERE CNO=1)AS A RIGHT JOIN (SELECT SNO,SCGRADE FROM SC WHERE CNO=2)as b ON A.SCGRADE>b.SCGRADE AND A.SNO=b.SNO;
方法1和2之間區別是兩個連接表的查詢字段的多余與否。
方法3演示了inner jion和on的連接使用,並和cross jion的區別。
方法4和3演示了內連接流程順序,先from內(包含on)走完,再where。內連接和on where的功能相同,但順序不同。
方法5演示純的左連接和on多條件使用。
方法6和5演示了左鏈接流程順序,先from內(包含on)走完,再where。內連接和on where的功能相同,但順序不同。
方法7右連接的on多條件使用。
題2
找出沒有選修過“老師1”的課程的所有學生姓名。
SELECT S.SNAME FROM S WHERE SNAME NOT in( SELECT DISTINCT a.SNAME FROM S AS a INNER JOIN SC AS b ON a.SNO=b.SNO WHERE b.CNO =(SELECT CNO FROM C WHERE C.CTEACHER='老師1'));
SELECT DISTINCT a.SNAME--* FROM S AS a INNER JOIN SC AS b ON a.SNO=b.SNO WHERE b.CNO IN(SELECT CNO FROM C WHERE C.CTEACHER!='老師1')
題3
列出2門或者2門以上不及格課程的學生姓名及其平均成績。
SELECT a.SNAME ,avg(b.SCGRADE) from S AS a INNER JOIN SC AS b ON a.SNO=b.SNO WHERE a.SNO IN (SELECT SC.SNO FROM SC WHERE SC.SCGRADE<60 GROUP BY SC.SNO HAVING count(*)>=2) GROUP BY a.SNAME;
SELECT a.SNAME ,avg(p) from S AS a INNER JOIN (SELECT SC.SNO,avg(SCGRADE) AS p FROM SC WHERE SC.SCGRADE<60 GROUP BY SC.SNO HAVING count(*)>=2)AS b ON a.SNO=b.SNO;
1,
題4
列舉即學過“1”號課程,有學過“2”號課程的所有學生學號
SELECT DISTINCT SC.SNO FROM SC WHERE SC.SNO IN ((SELECT SNO FROM SC WHERE CNO=1)INTERSECT (SELECT SNO FROM SC WHERE CNO=2) )
題5
一張表biao,id cash。要求不用max和order by 查出最cash值最大的是多少?
1 SELECT id "編號",cash "最高工資" FROM Salary WHERE cash NOT IN 2 (SELECT DISTINCT a.cash FROM Salary a,Salary b WHERE a.cash<b.cash);
題6
一張表biao,id name age cash。里面1000萬以上的大數據,請分別查出年齡在20-30,cash2000-3000 年齡 30-40 cash3000-5000,年齡40-50,cash5000以上的人名。
SELECT name, CASE WHEN (age>=20 and age<=30 and cashM>=2000 and cashM<=10000) then '1' WHEN (age>=30 and age<=80 and cashM>=3000 and cashM<=10000) then '2' END AS "年齡工資" from cash
這些區別已經區分非常清楚。具體語法請看我前幾篇關於數據庫的基本語法文章。
當然,這些不是什么前沿技術,但很細致,對不對?
