進階之SQL知識點

order by 是按照某個字段menu(分數)排序

1.查詢所有學生的數學成績,顯示學生姓名name, 分數, 由高到低
SELECT a.name, b.score
FROM student a, grade b
WHERE a.id = b.id
AND kemu = '數學'
ORDER BY score
DESC

gorup by 是某個字段menu(分數)相同的放在一組進行分組
2.統計每個學生的總成績,顯示字段:姓名,總成績
SELECT a.name, sum(b.score) as sum_score
FROM student a, grade b
WHERE a.id = b.id
GROUP BY name
DESC

一、truncate、delete和drop 的區別

1、表數據和表結構
truncate、delete都會刪除表中的數據,不刪除表的結構(定義),drop不僅會刪除表數據也會刪除表結構。


2、是否加入事務
drop、truncate都是DDL語句(數據定義語言),執行後會自動提交。delete是DML語句,不會自動提交。

3、delete 語句是數據庫操作語言(dml),這個操作會放到 rollback segement 中,事務提交之後才生效;

如果有相應的 trigger,執行的時候將被觸發。

truncate、drop 是數據庫定義語言(ddl),操作立即生效,原數據不放到 rollback segment 中,不能回滾,操作不觸發 trigger。

二、使用order by 和 limit 的組合,能夠找出一個列中最高或者最低的值。 

select prod_price from products order by prod_price desc limit 1;

// prod_price desc 對價格進行降序排列,然後取第一個,獲得最大值

order by 子句位置

多條件組合語句,順序不能出現錯誤,不然將產生錯誤。

order by 位於from 子句之後,limit 位於order by 子句之後。

三、連接類型:

1. 交叉聯接 :得到所連接表的所有組合 (笛卡兒集)cross join
2. 內聯接:得到連接表的滿足條件的記錄組合inner join  on
3. 外聯接:(左、右)得到一個表的所有行,及其餘表滿足連接條件的行 full | left | right  outer join  on

1、交叉聯接
在這類聯接的結果集內,兩個表中每兩個可能成對的行佔一行。
但是如果在交叉聯接中加入where 子句就相當與是內聯接

2、內聯接
僅顯示兩個聯接表中的匹配行的聯接。(這是查詢設計器中的默認聯接類型)

3、外鏈接
(1)左向外聯接
包括第一個命名錶(”左”表,出現在 JOIN子句的最左邊)中的所有行。不包括右表中的不匹配行。
(2)右向外聯接
包括第二個命名錶(”右”表,出現在 JOIN子句的最右邊)中的所有行。不包括左表中的不匹配行。

4、例子:   

-------------------------------------------------
  a表   id   name       b表     id   job   parent_id   
        1    張3                1    23     1   
        2    李四               2    34     2   
        3    王武               3    34     4   
        
  a.id 和 parent_id 關聯  
--------------------------------------------------    
 1) 內連接   
  select   a.*,b.*   from   a   inner  join   b   on   a.id=b.parent_id       
  結果是     
  1   張3                   1     23     1   
  2   李四                  2     34     2   
    
  2)左連接   
  select   a.*,b.*   from   a   left   join   b   on   a.id=b.parent_id       
  結果是     
  1   張3                   1     23     1   
  2   李四                  2     34     2   
  3   王武                  null   

 

 3) 右連接   
  select   a.*,b.*   from   a   right  join   b   on   a.id=b.parent_id       
  結果是     
  1   張3                   1     23     1   
  2   李四                  2     34     2   
  null                       3     34     4   
    
 4) 完全連接   
  select   a.*,b.*   from   a   full   join   b   on   a.id=b.parent_id   

  結果是     
  1   張3                  1     23     1   
  2   李四                 2     34     2   
  null                   3     34     4   
  3   王武                 null

​四、常見面試題:

1. 語句查詢出每門課都大於80 分的學生姓名

name   kecheng   fenshu 
張三     語文       81
張三     數學       75
李四     語文       76
李四     數學       90
王五     語文       81
王五     數學       100
王五     英語       90

答案一:: select distinct name from table where name not in (select distinct name from table where fenshu<=80)
答案二:select name from table group by name having min(fenshu)>80


2. 學生表 如下:
自動編號   學號   姓名 課程編號 課程名稱 分數
1        2005001 張三 0001      數學    69
2        2005002 
李四 0001      數學    89
3        2005001 
張三 0001      數學    69
刪除除了自動編號不同其他都相同的學生冗餘信息

A: delete tablename where 自動編號 not in(select min( 自動編號) from tablename group by 學號姓名課程編號課程名稱分數)

 

3. 說明:兩張關聯表,刪除主表中已經在副表中沒有的信息 

SQL: 
Delete from info where not exists (select * from infobz where info.infid=infobz.infid ) 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章