1. 程式人生 > >SELECT語句詳解

SELECT語句詳解

mysql- efault char 字母 order 加載數據 ike phone 長度

來源: 整理自實驗樓

鏈接: https://www.shiyanlou.com/courses/9

CREATE DATABASE school;

use school;

CREATE TABLE department
(
  dpt_name   CHAR(20) NOT NULL,
  people_num INT(10) DEFAULT ‘10‘,
  CONSTRAINT dpt_pk PRIMARY KEY (dpt_name)
 );

CREATE TABLE user_info
(
  id      INT(10) PRIMARY KEY,
  name    CHAR(20),
  age     INT(10),
  salary  INT(10) NOT NULL,
  phone   INT(12) NOT NULL,
  in_dpt  CHAR(20) NOT NULL,
  UNIQUE  (phone),
  CONSTRAINT emp_fk FOREIGN KEY (in_dpt) REFERENCES department(dpt_name)
 );
 
CREATE TABLE project
(
  proj_num   INT(10) NOT NULL,
  proj_name  CHAR(20) NOT NULL,
  start_date DATE NOT NULL,
  end_date   DATE DEFAULT ‘2015-04-01‘,
  of_dpt     CHAR(20) REFERENCES department(dpt_name),
  CONSTRAINT proj_pk PRIMARY KEY (proj_num,proj_name)
 );

1.1 SELECT 基本語法:

數學符號條件

AND OR IN

通配符

排序

SQL 內置函數和計算

子查詢與連接查詢

1.2 加載數據庫文件並插入數據:

加載文件中的數據,需要在 MySQL 控制臺中輸入命令,搭建數據庫:

source /home/w/MySQL-01-01.sql

向數據庫插入數據:

source /home/w/MySQL-01-02.sql

2.1 實驗步驟

在數據庫操作語句中,使用最頻繁,也被認為最重要的是 SELECT 查詢語句。我們已經在不少地方用到了 SELECT * FROM table_name; 這條語句用於查看一張表中的所有內容。 而 SELECT 與各種限制條件關鍵詞搭配使用,具有各種豐富的功能。

3.1 基本的SELECT語句:

SELECT 語句的基本格式為:

SELECT 要查詢的列名 FROM 表名字 WHERE 限制條件;

如果要查詢表的所有內容,則把 要查詢的列名 用一個星號 * 號表示,代表要查詢表中所有的列。 而大多數情況,我們只需要查看某個表的指定的列,比如要查看 user_info 表的 name 和 age:

SELECT name,age FROM user_info;

3.2 數學符號條件
SELECT 語句常常會有 WHERE 限制條件,用於達到更加精確的查詢。WHERE限制條件可以有數學符號 (=,<,>,>=,<=) ,剛才我們查詢了 name 和 age,現在稍作修改:

SELECT name,age FROM user_info WHERE age>25;
篩選出 age 大於 25 的結果:
或者查找一個名字為 Mary 的學生的 name,age 和 phone:

SELECT name,age,phone FROM user_info WHERE name=‘Mary‘;

3.3 “AND”與“OR”

從這兩個單詞就能夠理解它們的作用。

WHERE 後面可以有不止一條限制,而根據條件之間的邏輯關系,可以用 [條件一 OR 條件二]] 和 [條件一 AND 條件二] 連接:

例如,篩選出 age 小於 25,或 age 大於 30

SELECT name,age FROM employee WHERE age<25 OR age>30;
#篩選出 age 大於 25,且 age 小於 30
SELECT name,age FROM user_info WHERE age>25 AND age<30;
而剛才的限制條件 age>25 AND age<30 ,如果需要包含25和30這兩個數字的話,可以替換為 age BETWEEN 25 AND 30 :

3.4 IN 和 NOT IN

關鍵詞 IN 和 NOT IN 的作用和它們的名字一樣明顯,用於篩選“在”或“不在”某個範圍內的結果;

比如說我們要查詢在 dpt3 或 dpt4 的人:

SELECT name,age,phone,in_dpt FROM user_info(表) WHERE in_dpt(列名) IN (‘dpt3‘,‘dpt4‘);

而 NOT IN 的效果則是,如下面這條命令,查詢出了不在 dpt1 也不在 dpt3 的人:

SELECT name,age,phone,in_dpt FROM employee WHERE in_dpt NOT IN (‘dpt1‘,‘dpt3‘);

3.5 通配符:

關鍵字 LIKE 可用於實現模糊查詢,常見於搜索功能中。

和 LIKE 聯用的通常還有通配符,代表未知字符。

SQL中的通配符是 _ 和 % 。其中 _ 代表一個未指定字符,% 代表不定個未指定字符;

比如,要只記得電話號碼前四位數為1101,而後兩位忘記了,則可以用兩個 _ 通配符代替:

SELECT name,age,phone FROM user_info WHERE phone LIKE ‘1101__‘;
這樣就查找出了 1101開頭的6位數電話號碼:
另一種情況,比如只記名字的首字母,又不知道名字長度,則用 % 通配符代替不定個字符:
SELECT name,age,phone FROM employee WHERE name LIKE ‘J%‘;
這樣就查找出了首字母為 J 的人:

3.6 對結果排序

為了使查詢結果看起來更順眼,我們可能需要對結果按某一列來排序,這就要用到 ORDER BY 排序關鍵詞。
默認情況下,ORDER BY 的結果是升序排列,而使用關鍵詞 ASC 和 DESC 可指定升序或降序排序。

比如,我們按 salary 降序排列,SQL語句為:

SELECT name,age,salary,phone FROM user_info ORDER BY salary DESC;
#如果後面不加 DESC 或 ASC 將默認按照升序排列。應用場景:博客系統中按時間先後順序顯示博文。

3.7 SQL 內置函數和計算:

SQL 允許對表中的數據進行計算。
對此,SQL 有 5 個內置函數,這些函數都對 SELECT 的結果做操作:

函數名:    COUNT       SUM     AVG     MAX     MIN
作用:    計數       求和    求平均值    最大值    最小值
其中 COUNT 函數可用於任何數據類型(因為它只是計數),而 SUM 、AVG 函數都只能對數字類數據類型做計算,MAX 和 MIN 可用於數值、字符串或是日期時間數據類型。
具體舉例,比如計算出 salary 的最大、最小值,用這樣的一條語句:

SELECT MAX(salary) AS max_salary,MIN(salary) FROM user_info;
有一個細節你或許註意到了,使用 AS 關鍵詞可以給值重命名,比如最大值被命名為了 max_salary:

3.8 子查詢:

上面討論的 SELECT 語句都僅涉及一個表中的數據,然而有時必須處理多個表才能獲得所需的信息。

例如:想要知道名為 "Tom" 的員工所在部門做了幾個工程。員工信息儲存在 user_info 表中,但工程信息儲存在 project 表中。

對於這樣的情況,我們可以用子查詢:

SELECT of_dpt,COUNT(proj_name) AS count_project FROM project GROUP BY of_dpt
HAVING of_dpt IN
(SELECT in_dpt FROM user_info WHERE name=‘Tom‘);

上面代碼包含兩個 SELECT 語句,第二個 SELECT 語句將返回一個集合的數據形式,然後被第一個 SELECT 語句用 in 進行判斷。

HAVING 關鍵字可以的作用和 WHERE 是一樣的,都是說明接下來要進行條件篩選操作。

區別在於 HAVING 用於對分組後的數據進行篩選

子查詢還可以擴展到 3 層、4 層或更多層。

3.9 連接查詢:

在處理多個表時,子查詢只有在結果來自一個表時才有用。

但如果需要顯示兩個表或多個表中的數據,這時就必須使用連接 (join) 操作。

連接的基本思想是把兩個或多個表當作一個新的表來操作,如下:

SELECT id,name,people_num
FROM user_info,department
WHERE user_info.in_dpt = department.dpt_name
ORDER BY id;
這條語句查詢出的是,各員工所在部門的人數,其中員工的 id 和 name 來自 user_info 表,people_num 來自 department 表:
另一個連接語句格式是使用 JOIN ON 語法,剛才的語句等同於:

SELECT id,name,people_num
FROM user_info JOIN department
ON user_info.in_dpt = department.dpt_name
ORDER BY id;
結果也與剛才的語句相同。

四、實驗總結
本節實驗中學習了 SELECT 語句的常用方法:

基本語法
數學符號條件
AND OR IN
模糊查詢
對查詢結果排序
SQL 內置函數和計算
子查詢與連接查詢

SELECT語句詳解