左外連接(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;(數據量小的時候用)
以上只是個人的筆記,僅供參考!