[TOC]
## 查詢數據表的結構和名稱
#### 首先介紹二個查詢語句:
1. 查詢表結構:`DESC 表名;`
2. 查詢當前庫中所有數據表:`SHOW TABLES;`
#### 查看表結構實例:
~~~
DESC staff;
~~~
結果如下:

#### 查詢當前庫中所有數據表實例:
~~~
SHOW TABLES;
~~~
結果如下:

#### <span style="color:forestgreen">下面是本節課重點:</span>
* * * * *
## 數據表查詢技術
### 主要介紹單表查詢技術,多表查詢后面有專門課程講解
### 基本語法
~~~
SELECT 字段列表 WHERE 數據表
[GOURP BY 分組字段] [HAVING 分組查詢條件]
[ORDER BY 排序字段] [LIMIT [起始索引],顯示數量]
~~~
#### <span style="color:red">注意:</span>
>[danger] * 字段列表最好將需要顯示字段名稱寫出來,盡可能不要用'*'星號替代;
>* GROUP BY 與 HAVING 配對使用,常用于統計查詢,字段常用聚合函數;
>* ORDER BY 默認為升序ASC,常與LIMIT聯合使用;
>* 在書寫時,GROURP 語句一定寫在ORDER 語句之前,最后才是LIMIT語句,否則會執行錯誤,切記!
#### 下面用實例講解詳細用法:
#### 1、[單條件]查詢工資大于3000元的員工姓名,部門和入職時間
* 分析:
>[info] * 顯示字段:姓名、部門、入職時間,使用[AS]別名,讓結果看上去再直觀;
> * 查詢條件:工資大于3000元;
#### 語句:
~~~
SELECT id AS '編號', name AS '姓名', dept AS '部門', hiredate AS '入職時間'
FROM staff
WHERE salary > 3000;
~~~
* 運行結果:

* * * * *
#### 2、[復合條件]查詢工資大于3000元的開發部員工姓名,部門和入職時間
* 分析:
>[info] * 顯示字段:姓名、部門、入職時間,使用[AS]別名,讓結果看上去再直觀;
> * 查詢條件:復合查詢[AND]工資大于3000元,并且部門名稱是開發部;
#### 語句:
~~~
SELECT id AS '編號', name AS '姓名', dept AS '部門', hiredate AS '入職時間'
FROM staff
WHERE (salary > 3000) AND (dept = '開發部');
~~~
復合條件中,各個子條件推薦用括號包起來,顯示結構清晰!
* 運行結果:

* * * * *
#### 3、[分組查詢]查詢每個部門的最高、最低和平均工資
* 關于分組查詢字段的說明
>[info] 1、結果集的字段列表(SELECT 后面),必須包括分組字段,或者聚合函數。
2 、當然也可以包括其它字段,但是沒有意義,因為這些無關字段僅取分組中第一條記錄的值。
3、舉例:計算每個部門,最高工資是多少?如果在結果列字段中,出現員工姓名name,其實他不一定是工資最高的那個員工,他只是分組中第一個出現的記錄對應的name字段。真正的最高工資的員工有可能出現在第二或第三個位置上。
* 聚合函數:也叫統計函數,指僅返回一個值的函數,常用的有以下五個:
|序號| 聚合函數 | 說明 |
|---| --- | --- |
|1| COUNT() | 返回滿足條件的記錄數量,如COUNT( * ) |
|2| SUM() | 參數為數值型字段,返回一列總和 |
|3| AVG | 參數為數值型字段或表達式,返回一列平均值 |
|4| MAX | 參數為數值型、字符串或表達式,返回一列中最大值 |
|5| MIN | 參數為數值型、字符串或表達式,返回一列中最小值 |
* 查詢語句:
~~~
SELECT dept AS 部門 , MAX(salary) AS 最高工資,MIN(salary) AS 最低工資,AVG(salary) AS 平均工資
FROM tp5_staff
GROUP BY dept ;
~~~
* <span style="color:red;">注意:</span>
>[success] 查詢結果集中,不要出現除分組字段和聚合函數以外的字段名稱。
* 運行結果:

* * * * *
#### 4、[多條件分組查詢]按性別查詢每個部門的最高、最低和平均工資
* 分析:根據任務,要先按性別進行分組,然后再按部門查詢各個數據
* 查詢流程是:
* 先按性別分組,此處分為二個大組,男性(值為1)組、女性(值為0)組;
* 在性別分組中,再按部門進一步分組,如:開發部、市場部、財務部等。
* 查詢語句:
~~~
SELECT sex AS 性別, dept AS 部門 , MAX(salary) AS 最高工資,MIN(salary) AS 最低工資,AVG(salary) AS 平均工資
FROM tp5_staff
GROUP BY sex ,dept ;
~~~
* <span style="color:red;">注意:</span>
* 查詢結果集中,分組字段必須全部出現,并且順序與group by 完全一致。
* 運行結果:

* * * * *
#### 5、[分組條件查詢]查詢各部門平均工資大于2000的人數
##### 掌握HAVING 語句的用法(僅用于GROUP BY 分組篩選)
* 分析:根據任務,必須對分組中的統計數據進行條件篩選。
* 查詢流程是:
* 先按部門分組, 如:開發部、市場部、財務部、客服服等;
* 再統計各部門的平均工資,只查詢平均工資大于2000元;
* 最后,只有符合條件的部門才會出現在查詢結果中。
* 查詢語句:
~~~
SELECT dept AS 部門 , COUNT(*) AS 人數
FROM tp5_staff
GROUP BY dept HAVING AVG(salary) > 2000;
~~~
>[warning] * <span style="color:red;">注意:</span>
> * 查詢結果集中, 只會顯示符合條件的記錄,除分組和聚合字段外,其它字段不要有;
> * HAVING 分組條件只能是聚合函數 或者 常量 或來自子查詢。
* 運行結果:

* 這里簡單擴展一下:
* 再查詢一個平均工資大于1500元的部門員工人數
* 查詢語句修改一個HAVING 條件
~~~
SELECT dept AS 部門 , COUNT(*) AS 人數
FROM tp5_staff
GROUP BY dept HAVING AVG(salary) > 1500;
~~~
* 查詢結果如下:

* * * * *
### 6、[排序查詢]<br>
### 查詢工資最高的三個員工的編號、姓名、工資\部門和入職時間
#### 關鍵字:ORDER BY 排序字段 LIMIT [偏移量,]顯示數量
* 該實例比較簡單,我們直接上代碼:
~~~
SELECT id AS 編號,name AS 姓名 , ROUND(salary,0) AS 工資 , dept AS 部門, hiredate AS 入職時間
FROM tp5_staff
ORDER BY salary DESC LIMIT 3;
~~~
* 運行結果如下:

* * * * *
### 7、[綜合實例]查詢各部門最高工資,并按降序排序
* 降序:指由高到低排序,系統默認是升序,即由低到高。
* 分析:本案例用到了:GROUP BY 和 ORDER BY 操作
* 先查詢出每個部門的最高工資金額;
* 再按最高工資金額字段進行降序排序。
* 語句如下:
~~~
SELECT dept AS 部門, ROUND(MAX(salary),0) AS 最高工資
FROM tp5_staff
GROUP BY dept
ORDER BY salary DESC;
~~~
* 運行結果:

- 前言[隨時更新]
- ThinkPHP 5數據庫重構
- 開發環境
- 1.ThinkPHP5開發環境(Mac版)
- 2.ThinkPHP5開發環境(Win版)
- MySQL快速復習
- 1.數據庫操作
- 2.數據表操作
- 1.創建數據表 (重點)
- 2.添加數據表記錄
- 3.查詢數據表(重點)
- 4.更新數據表
- 5.編輯數據表結構(重點)
- 6_復制數據表
- 7.刪除數據和表
- 連接數據庫
- 1.數據庫配置文件database.php
- 2.Db類靜態方法connect()
- 3.模塊中的配置文件config.php
- MySQL原生查詢
- 1.讀操作query
- 2.寫操作execute
- 選擇數據表
- 1.table與setTable方法
- 2.name方法
- 3.db助手函數
- 4.alias方法
- 結果集查詢
- 1.find方法
- 2.select方法
- 3.fetchSql方法
- 4.value方法
- 5.column方法
- 6.field方法
- 新增數據
- 1.insert_單條添加
- 2.insertAll_批量添加
- 3_db_助手函數添加
- 更新數據
- 1.update方法
- 2.setField更新字段
- 3_自增自減與延時更新
- 刪除數據
- 1.delete方法
- 查詢方法
- 1.getTableInfo方法
- 2.where方法
- 3.whereOr方法
- 4.混合查詢(閉包實現)
- 表達式查詢
- 1.表達式查詢(重點)
- 2.exp通用查詢
- 分組查詢
- 1.group方法
- 2.having方法
- 排序分頁查詢
- 1.order方法
- 2.limit方法
- 3.page方法
- 聚合查詢
- 時間查詢
- 1.where方法
- 2.whereTime方法
- 高級查詢
- 1.快捷查詢
- 2.區間查詢
- 3.批量查詢
- 4.Query對象查詢
- 5.混合查詢
- 視圖查詢
- view方法
- 子查詢
- 1.select方法
- 2.fetchSql方法
- 3.buildSql方法
- 4.閉包子查詢
- 總結/參考
- 1.方法參數類型總結
- 2.查詢/子查詢/連接查詢