程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> MySQL_05-Select查詢詳解

MySQL_05-Select查詢詳解

編輯:MySQL綜合教程

MySQL_05-Select查詢詳解


SQL查詢詳解

1.Orderby

a) Order by 字段 asc | desc

b) 允許多字段排序: 先按第一個字段排序,如果不能區分,再使用第二個字段排序;以此類推

2.Limit(限制獲得的記錄數量)

a) 語法: limit offset, row_count (offset:偏移量,下標從0開始;row_count:總記錄數)。例如:limit 2,3 表示從第二條開始,取三條(即第2條到第4條記錄)

3.Distinct

a) 去除重復記錄。

b) 語法: select distinct 字段 from .......

4.Union

a) 將兩個不同關系中的查詢聯合起來返回

b) 例:查詢1班和2班的授課老師

(Select teacher from t_class where class_id=’1’)

Union (all)

(Select teacher from t_class where class_id=”2”)

c) 注意:如果union的結果有重復數據,會自動消除重復,查詢結果會丟失數據!解決:通過union的選項all來實現。 Union all...

d) 注意:union操作中子語句結果的排序問題

i. 將子語句包裹在括號內,非必需,但是便於閱讀,邏輯更加清晰!

ii. 子語句的order by只有配合limit時才會生效!沒有limit時排序是不起作用的!

e) 對union的最終結果進行排序(在語句最後添加order by ... 即可)

(Select teacher from t_class where class_id=’1’)

Union (all)

(Select teacher from t_class where class_id=”2”)

Order by stu_number desc;

5.子查詢(*)

a) 子查詢語句用括號括起來

b) 子查詢分類

i. 子查詢出現的位置:where型(出現在where後)、from型、exists型

ii. 子查詢的返回值形式: 單一值(標量)、列、表

c) 子查詢例子

i. 從教師表中查出授課天數最多的老師的姓名:Select t_name from t_teacher where teach_days=(select max(teach_days) from t_teacher);

注意:使用下列語句也可能達到效果

Select t_name from t_teacher order by teach_days desc limit 1;

但是,可能出現問題。如果有幾個老師的授課天數都最大並且一樣,這樣會漏掉結果!

ii. 子查詢返回集合: in ,not in, any, all

iii. 若子查詢返回結果是一行(行子查詢一般使用不多,但是要掌握!!!):使用(filed1,field2,...)這種形式構建一行來和子查詢返回的結果進行比較!!!

例:要求從教師表中查詢出和老師張三性別相同,並且也教過張三所教班級的其他老師的信息。

Select t_name, gender, age, course_name from t_teacher

where (gender, course_name) = //構建一行於子查詢結果比較(使用最多的是 = 和 in)

(select distinct gender, course_name from t_teacher where t_name=’張三’ and course_name=’MySql數據庫教程’);

iv. 子查詢返回一個表(通常用於from型子查詢,即子查詢返回的結果在from關鍵字後使用)。將一個復雜的邏輯分步處理。

v. Exists子查詢: exists(subquery),不提供數據,相當於一個布爾表達式,判斷是否獲取到了數據。

6.連接查詢(*)

a) Inner:數據內部的連接,要求參與連接的數據都存在才能執行的連接。

i. Inner join 內連接

ii. Cross join 交叉鏈接(笛卡爾鏈接):沒有連接條件,結果集的大小等於兩個參與連接的表的結果集笛卡爾乘積。

b) Outer:參與連接的一個或多個數據不真實存在的連接。

i. Left [outer] join 左外連接(開發中使用最多!!!): 左外連接時,如果出現左邊表數據連接不到右邊表的數據,則左邊表的數據最終被保留在結果內,右表對應字段填充NULL; 而如果出現右邊表的數據連接不到左邊表數據的情況,右邊數據被丟棄。

ii. Right [outer] join 右外連接

iii. Full join 全連接(暫不支持)

c) Natural 自然連接(natural join, natural left join, natural right join): 通過mysql自己的判斷完成連接過程,不需要指定連接條件。Mysql自動使用多表內相同的字段作為連接條件。

Select * from t_one natural join t_two;

d) 連接條件

i. On: 連接條件

ii. Where: 對連接的數據過濾.

iii. Using: 連接條件,只有當兩個表中連接的字段相同時才使用using,一般情況下很少使用,通常使用on。例如有兩個表:t_student_main_info(學生常用屬性)和t_student_other_info(學生不常用信息),它們的主鍵名稱相同,都叫id,此時才能使用using關鍵字。 Select * from t_student_main_info join t_student_other_info using(id);

注:連接操作支持多表連接,可以一直無限連接下去,但是極少使用。例如:

Select t_two.* ,t_three.* from t_one left join t_two on ... Left join t_three on ... where...

兩個例子:

1.假設兩個表分別為team和match

Id

Team_name

2

Php0331

5

Php0228

1

Php0115

7

Php0505

id

Host_id

Guest_id

time

result

1

2

1

10:00

34:28

2

2

7

15:00

35:45

3

4

要求查詢得到如下結果:

主隊

客隊

比賽時間

比賽結果

Php0331

Php0115

10:00

34:28

Php0331

Php0505

15:00

35:45

由於結果中每行記錄有兩個team_name,所以需要連接team表2次!!!

Match left join team on match.host_id=team.id left join team on match.guest_id=team.id

2.自身連接

有如下課程表course

cno

cname

cpno

credit

1

數據庫

5

4

2

數學

2

3

信息系統

1

4

4

操作系統

6

3

5

數據結構

7

4

6

數據處理

2

7

C語言

6

4

要求查詢每門課的間接先修課:

Select first.cno, second.cpno from course first, course second where first.cpno=second.cno;

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved