亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > 綜合 > 正文

編寫SQL查詢的關鍵—SQL語句的執行順序

2024-07-21 02:44:54
字體:
來源:轉載
供稿:網友
   編寫 SQL 語句是每個程序員應該具備的基本功。在實際開發過程中,需要編寫比較復雜的 SQL 查詢語句是必不可少的,但很多 SQL 書籍上不是簡單的介紹一下就是出最終的查詢語句,編寫復雜 SQL 查詢的具體思路卻沒有多少介紹,這不能不說是一種巨大的遺憾 , 看著一串無比復雜的 SQL 語句,沒有掌握方法的話誰看了都會頭暈 ^-^

回憶一下學習編程語言的經歷( C++,java 等),我們一般都是先學習變量的定義,然后是流程控制語句,接著是函數,類等等。但我們在學習 SQL , SQL 書籍上都普遍忽略了一個重要的方面: SQL 語句的執行順序。 不知道是什么原因,這一點確實沒被多少書籍提過。掌握了SQL語句的執行順序的規律,就能較輕松的編寫出復雜的 SQL 查詢。

  

SQL 語句的執行順序如下:

  

1 、 from 子句組裝來自不同數據源的數據;

2 、 where 子句基于指定的條件對記錄行進行篩選;

3 、 group by 子句將數據劃分為多個分組;

4 、使用聚集函數進行計算;

5 、使用 having 子句篩選分組;

6 、計算所有的表達式;

7 、使用 order by 對結果集進行排序。

  

下面舉一個簡單的例子舉例說明,假設有以下一張表 student :

  

ID
Name
Age

1
Tom
23

2
Jack
25

3
Lucy
15

4
Anay
18

5
Bobby
21


  

要求通過 SQL 語句把年齡大于 20 的學生姓名查出來

  

SQL 語句如下:

  

Select name

From student

Where age>20

結果是:

Tom

Jack

Bobby


  

那對于這個簡單的 SQL 語句,執行順序是怎么樣的呢?

1.       from 子句組裝來自不同數據源的數據,簡單點來說就是要確定查詢的數據來自哪個表。如果 from 關鍵字后跟的表有兩個或以上,就產生笛卡爾積。

2.       where 子句對每個記錄行進行 篩選,把不符合條件的行篩選掉。

3.       針對符合條件的行執行相應的表達式操作,即 select 部分。

  

我們針對前面的寫的 SQL 語句簡單模擬一下執行過程:

1. 確定數據表,我們能根據 from 子句( From student )確定數據是來自下面的的表 student

    

ID
Name
Age

1
Tom
23

2
Jack
25

3
Lucy
15

4
Anay
18

5
Bobby
21


                                    表 1

  

2. 根據 where 子句中的條件( Where age>20 )篩選 記錄行,請留意, where 子句的 篩選是對每一行 from 表中的每一行進行的。

(1)       對于第 1 行

1
Tom
23


  

Age=23>20, 符合條件

  

(2)       對于第 2 行

2
Jack
25


  

Age=25>20, 符合條件

  

(3)       對于第 3 行

3
Lucy
15


  

Age=15<20, 不符合條件

  

(4)       對于第 4 行

4
Anay
18


  

Age=18<20, 不符合條件

  

(5)       對于第 5 行

5
Bobby
21


  

Age=21>20, 符合條件

  

由上述的 (1)(2)(5) 可知,最終符合條件的記錄為下表 2

  

ID
Name
Age

1
Tom
23

2
Jack
25

5
Bobby
21


                 表 2

  

4.       計算所有的表達式,即 Select name 部分,針對表 2 中的數據,最終符合條件的是 3 行,分別從每一行挑選出需要的字段值 name ,最終的結果如下表 3

Name

Tom

Jack

Bobby


                                    表 3

  

下面舉一般比較復雜的例子,有 3 個表 teacher 表, student 表, tea_stu 關系表:


teacher 表 teaID name age
student 表 stuID name age
teacher_student 表 teaID stuID


要求用一條 sql 查詢出這樣的結果
1. 顯示的字段要有老師 name, 每個老師所帶的學生人數
2 只列出老師 age 為 45 以下,學生 age 為 12 以上的記錄

  

先準備測試數據:

  

drop table if exists tea_stu;

drop table if exists teacher;

drop table if exists student;

      create table teacher(teaID int PRimary key,name varchar(50),age int);

      create table student(stuID int primary key,name varchar(50),age int);

      create table tea_stu(teaID int references teacher(teaID),stuID int references student(stuID));

insert into teacher values(1,' Tom',46), (2,' Jack',35) , (3,' Tony',36) , (4,' Lucy',37);

insert into student values(1,' Lili',11), (2,' Anay',15) , (3, 'Bobby',16) , (4, 'Jeff',17);

insert into tea_stu values(1,1), (1,2), (1,3),(2,2), (2,3), (2,4),(3,3), (3,4), (3,1),(4,4), (4,1), (4,2) , (4,3);

  

題目要求是列出 老師所帶的學生數,條件是 老師 age 為 45 以下,學生 age 為 12 以上,最理想的情況是有下面的一個表 , 如圖 1




                                  圖 1

  

如果能構造一個圖 1 的表,那么實現題目要求的 SQL 語句用下面的簡單 SQL 查詢就行:

  

select teacher.name, count(student.name)

from table

where teacher.age<45

   and student.age>12

group by teacher.name;

  

數據庫中學生的信息和老師的信息是分別存放在 student, teacher 表中的,信息的關聯只能依靠 tea_stu ,那么怎么構造圖 1 的表呢?這時候可以用到表的關聯,把這三個表的數據關聯起來, 注意:只要是表的關聯就會產生笛卡爾積,所以務必把笛卡爾積去掉。 關聯表的最小粒度關聯可以 去掉 笛卡爾積,具體的查詢語句為:

select teacher.name, teacher.age,student.name,student.age

from teacher,student,tea_stu

where teacher.teaID=tea_stu.teaID

   and student.stuID=tea_stu.stuID

  

     所以綜合以上所述,就能得出最終的查詢語句

  

select teacher.name, count(student.name) student_num

from teacher,student,tea_stu

where teacher.teaID=tea_stu.teaID

   and student.stuID=tea_stu.stuID

   and teacher.age<45

   and student.age>12

group by teacher.name;

  

結果如圖 2 所示:

  


                      圖 2

  




發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产亚洲人成网站在线观看| 欧美肥婆姓交大片| 国产精品入口福利| 欧美性猛交xxxx免费看漫画| 亚洲综合精品伊人久久| 亚洲欧美日韩图片| 国产亚洲欧洲高清一区| 精品中文字幕久久久久久| 久久精品电影网站| 亚洲xxxx3d| 欧美成人精品三级在线观看| 亚洲在线观看视频| 美女视频黄免费的亚洲男人天堂| www.亚洲男人天堂| 欧美黑人狂野猛交老妇| 中文字幕亚洲情99在线| 97精品国产97久久久久久免费| 国产精品1区2区在线观看| 国产精品一区=区| 92国产精品久久久久首页| 在线观看亚洲区| 亚洲嫩模很污视频| 亚洲视频在线观看| 久久精品国产电影| 久久激情视频久久| 亚洲午夜色婷婷在线| 国产v综合ⅴ日韩v欧美大片| 在线视频日本亚洲性| 欧美激情一区二区三区成人| 51精品国产黑色丝袜高跟鞋| 国产精品久久久久久网站| 亚洲a区在线视频| 欧美自拍视频在线观看| 91久久国产精品91久久性色| 欧美在线观看一区二区三区| xxxxx91麻豆| 国产精品影片在线观看| 日韩av电影免费观看高清| 日韩国产高清污视频在线观看| 久久久久久91| 日韩欧美亚洲国产一区| 国产精品视频导航| 成人在线观看视频网站| 色中色综合影院手机版在线观看| 国产精品第一视频| 国产欧美在线看| 国产精品v片在线观看不卡| 97热在线精品视频在线观看| 日韩高清av在线| 久久人人爽人人爽爽久久| 538国产精品视频一区二区| 国产精品久久久久久久久久| **欧美日韩vr在线| 久久视频在线观看免费| 亚洲精品mp4| 精品爽片免费看久久| 92国产精品视频| 欧美在线观看一区二区三区| 一区二区中文字幕| 国产免费一区视频观看免费| 成人午夜一级二级三级| 精品久久香蕉国产线看观看亚洲| 欧美成年人在线观看| 日韩电影在线观看中文字幕| 成人免费黄色网| 亚洲男人天堂古典| 按摩亚洲人久久| 日韩三级影视基地| 亚洲国产精品嫩草影院久久| 欧美精品免费在线观看| 亚洲永久在线观看| 亚洲女人被黑人巨大进入al| 日韩成人高清在线| 丝袜亚洲另类欧美重口| 国产精品亚洲第一区| 亚洲成人激情图| 色偷偷噜噜噜亚洲男人的天堂| 中文一区二区视频| 一区二区三区 在线观看视| 青草青草久热精品视频在线观看| 色偷偷av一区二区三区乱| 国产一区av在线| 91手机视频在线观看| 国产免费亚洲高清| 久久影院模特热| 日本精品免费观看| 美女视频黄免费的亚洲男人天堂| 欧美精品中文字幕一区| 欧美国产亚洲视频| 国产黑人绿帽在线第一区| 中文字幕综合一区| 欧美精品在线看| 亚洲一区二区三区xxx视频| 亚洲精品电影网站| 国产精品一区=区| 国产精品日韩欧美大师| 亚洲人成啪啪网站| 亚洲精品国产精品自产a区红杏吧| 国产成人精品在线播放| 欧美亚洲视频在线看网址| 亚洲午夜av电影| 国产日韩精品在线| 国内精品一区二区三区| 日韩国产一区三区| 欧美—级a级欧美特级ar全黄| 91精品国产综合久久男男| 国产91久久婷婷一区二区| 欧美精品一区二区免费| 欧美性猛交丰臀xxxxx网站| 欧美精品成人在线| 久久久久北条麻妃免费看| 日韩在线观看免费| 亚洲欧美日韩精品| 欧美亚洲免费电影| 欧美色欧美亚洲高清在线视频| 亚洲天堂av图片| 亚洲毛片在线免费观看| 色综合天天狠天天透天天伊人| 国产精品久久在线观看| 亚洲综合社区网| 日韩精品福利网站| 日本三级韩国三级久久| 亲爱的老师9免费观看全集电视剧| 日韩中文娱乐网| 成人午夜一级二级三级| 欧美日韩亚洲一区二区三区| 在线视频一区二区| 成人av在线网址| 亚洲综合一区二区不卡| 久久久91精品国产| 亚洲成人动漫在线播放| 黑人巨大精品欧美一区二区| 韩国19禁主播vip福利视频| 日韩欧美国产激情| 欧美大片免费看| 国产精品久久久久久亚洲调教| 亚洲第一国产精品| 91精品在线影院| 日韩成人中文字幕在线观看| 国产精品美女呻吟| 亚洲国产欧美一区二区三区同亚洲| 日韩成人中文字幕| 成人h片在线播放免费网站| 亚洲免费一级电影| 国产精品成人国产乱一区| 亚洲精品福利免费在线观看| 欧美日韩国产精品一区二区三区四区| 午夜欧美不卡精品aaaaa| 亚洲人成毛片在线播放| 久久久久久久久网站| 成人激情在线播放| 亚洲成人av片| 亚洲国产古装精品网站| 亚洲激情久久久| 搡老女人一区二区三区视频tv| 精品日韩中文字幕| 亚洲国产精品va在看黑人| 欧美亚洲国产精品| 日韩成人在线视频观看| 亚洲国产精品久久精品怡红院| 日韩电影中文字幕| 91久久精品国产91性色| 欧美日韩一区免费| 中文字幕久热精品视频在线|