數據庫基礎知識整理

左外連接(LEFT JOIN...ON | LEFT OUTER JOIN)

會顯示左表的所有行的信息,不管右表中是否有匹配的項,由表中沒有匹配的話則顯示null。假如連接條件是:left.name = right.name,且左表中有7個name='Tom',右表中有3個name='Tom',則查詢結果會有21條記錄。

 

假設有一個user表,字段分別爲:user_name, salary, sex, age。(純屬舉例,不討論表的設計)

內連接

我們平時使用的連接就是內連接(隱式) ,如:select a.name from a,b where a.name = b.name;

如果是顯式的內連接,使用inner join...on, 如:select a.name inner join b on a.name = b.name;

 

 需要統計的基本上都需要分組

 例如:統計男、女的個數分別是多少,就根據性別分組:select count(*),sex from user group by sex;

 

有分組的情況下才有having子句,having中可以寫聚合函數(where中不行)

例如:統計小於24歲的男或者女個數是多少: select count(*),sex from user group by sex having avg(age) < 24;

 

 嵌套查詢的核心是尋找中間表

中間表,即最先被查詢出來的數據,然後把這些數據當做一個表來處理。

例1:查詢所以比女性平均工資高的男性的名字。

select user_name from user where salary > (select avg(salary) from user where sex = 'female') and sex = 'male'

中間表只有一條數據,就是女性的平均工資。

例2:查詢工資比所有人的平均工資低且比Lili高的人的姓名和性別。

一般是這樣寫:

select * from user where salary < (select avg(salary) from user) and salary > (select salary from user where user_name='Lili')

如果有中間表的概念,你會想到:工資比所有人的平均工資低的,是一個集合,可以先查出來作爲中間表,如下:

select u.* from user u,(select id from user where salary < (select avg(salary) from user)) lower_avg 
where u.id = lower_avg.id and u.salary>(select salary from user where user_name='Lili')

 

MySQL和Oracle的分頁查詢 

 MySQL用的是limit,Oracle用的是ROWNUM。

Oracle:

SELECT * FROM (SELECT query_table_alias.*, ROWNUM RN FROM (SELECT * FROM targer_table) query_table_alias WHERE ROWNUM < 40) WHERE RN > 20

MySQL:

select * from table_name where id > (pageNo - 1)*pageSize limit pageSize;

或者 select * from table_name limit pageNo - 1)*pageSize, pageSize;(數據量小的時候用)

 

以上只是個人的筆記,僅供參考! 

發佈了86 篇原創文章 · 獲贊 144 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章