sql一個題的解法分析講解


本篇講述的是對一個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);
先用笛卡爾積求出小於最大數的所有值。再not in 主要自己理解。求最小值:把小於號換成大於號

題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
case when 多條件then顯示end 對一新列進行操作。as起個列名

 

這些區別已經區分非常清楚。具體語法請看我前幾篇關於數據庫的基本語法文章。

當然,這些不是什么前沿技術,但很細致,對不對?

 

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM