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 )