首頁 > 軟體

一文帶你學會MySQL的select語句

2022-11-09 14:02:55

SQL概述

SQL背景知識

  • 1946 年,世界上第一臺電腦誕生,如今,藉由這臺電腦發展起來的網際網路已經自成江湖。在這幾十年裡,無數的技術、產業在這片江湖裡沉浮,有的方興未艾,有的已經幾幕興衰。但在這片浩蕩的波動裡,有一門技術從未消失,甚至“老當益壯”,那就是 SQL。

    • 45 年前,也就是 1974 年,IBM 研究員釋出了一篇揭開資料庫技術的論文《SEQUEL:一門結構化的英語查詢語言》,直到今天這門結構化的查詢語言並沒有太大的變化,相比於其他語言,SQL 的半衰期可以說是非常長了。
  • 不論是前端工程師,還是後端演演算法工程師,都一定會和資料打交道,都需要了解如何又快又準確地提取自己想要的資料。更別提資料分析師了,他們的工作就是和資料打交道,整理不同的報告,以便指導業務決策。

  • SQL(Structured Query Language,結構化查詢語言)是使用關係模型的資料庫應用語言,與資料直接打交道,由IBM上世紀70年代開發出來。後由美國國家標準局(ANSI)開始著手製定SQL標準,先後有SQL-86,SQL-89,SQL-92,SQL-99等標準。

    • SQL 有兩個重要的標準,分別是 SQL92 和 SQL99,它們分別代表了 92 年和 99 年頒佈的 SQL 標準,我們今天使用的 SQL 語言依然遵循這些標準。
  • 不同的資料庫生產廠商都支援SQL語句,但都有特有內容。

SQL語言排行榜

自從 SQL 加入了 TIOBE 程式語言排行榜,就一直保持在 Top 10。

SQL 分類

SQL語言在功能上主要分為如下3大類:

  • DDL(Data Definition Languages、資料定義語言) ,這些語句定義了不同的資料庫、表、檢視、索引等資料庫物件,還可以用來建立、刪除、修改資料庫和資料表的結構。

    • 主要的語句關鍵字包括CREATEDROPALTER等。
  • DML(Data Manipulation Language、資料操作語言) ,用於新增、刪除、更新和查詢資料庫記錄,並檢查資料完整性。

    • 主要的語句關鍵字包括INSERTDELETEUPDATESELECT等。
    • SELECT是SQL語言的基礎,最為重要。
  • DCL(Data Control Language、資料控制語言) ,用於定義資料庫、表、欄位、使用者的存取許可權和安全級別。

    • 主要的語句關鍵字包括GRANTREVOKECOMMITROLLBACKSAVEPOINT等。

因為查詢語句使用的非常的頻繁,所以很多人把查詢語句單拎出來一類:DQL(資料查詢語言)。

還有單獨將COMMITROLLBACK 取出來稱為TCL (Transaction Control Language,事務控制語言)。

SQL語言的規則與規範

基本規則

  • SQL 可以寫在一行或者多行。為了提高可讀性,各子句分行寫,必要時使用縮排

  • 每條命令以 ; 或 g 或 G 結束

  • 關鍵字不能被縮寫也不能分行

  • 關於標點符號

    • 必須保證所有的()、單引號、雙引號是成對結束的
    • 必須使用英文狀態下的半形輸入方式
    • 字串型和日期時間型別的資料可以使用單引號(' ')表示
    • 列的別名,儘量使用雙引號(" "),而且不建議省略as

SQL大小寫規範 (建議遵守)

  • MySQL 在 Windows 環境下是大小寫不敏感的

  • MySQL 在 Linux 環境下是大小寫敏感的

    • 資料庫名、表名、表的別名、變數名是嚴格區分大小寫的
    • 關鍵字、函數名、列名(或欄位名)、列的別名(欄位的別名) 是忽略大小寫的。
  • 推薦採用統一的書寫規範:

    • 資料庫名、表名、表別名、欄位名、欄位別名等都小寫
    • SQL 關鍵字、函數名、繫結變數等都大寫

註釋

可以使用如下格式的註釋結構

單行註釋:#註釋文字(MySQL特有的方式)
單行註釋:-- 註釋文字(--後面必須包含一個空格。)
多行註釋:/* 註釋文字  */

命名規則(暫時瞭解)

  • 資料庫、表名不得超過30個字元,變數名限制為29個
  • 必須只能包含 A–Z, a–z, 0–9, _共63個字元
  • 資料庫名、表名、欄位名等物件名中間不要包含空格
  • 同一個MySQL軟體中,資料庫不能同名;同一個庫中,表不能重名;同一個表中,欄位不能重名
  • 必須保證你的欄位沒有和保留字、資料庫系統或常用方法衝突。如果堅持使用,請在SQL語句中使用`(著重號)引起來
  • 保持欄位名和型別的一致性,在命名欄位併為其指定資料型別的時候一定要保證一致性。假如資料型別在一個表裡是整數,那在另一個表裡可就別變成字元型了

舉例:

#以下兩句是一樣的,不區分大小寫
show databases;
SHOW DATABASES;

#建立表格
#create table student info(...); #表名錯誤,因為表名有空格
create table student_info(...); 

#其中order使用``飄號,因為order和系統關鍵字或系統函數名等預定義識別符號重名了
CREATE TABLE `order`(
    id INT,
    lname VARCHAR(20)
);

select id as "編號", `name` as "姓名" from t_stu; #起別名時,as都可以省略
select id as 編號, `name` as 姓名 from t_stu; #如果欄位別名中沒有空格,那麼可以省略""
select id as 編 號, `name` as 姓 名 from t_stu; #錯誤,如果欄位別名中有空格,那麼不能省略""

資料匯入指令

在命令列使用者端登入mysql,使用source指令匯入

mysql> source d:mysqldb.sql
mysql> desc employees;
+----------------+-------------+------+-----+---------+-------+
| Field          | Type        | Null | Key | Default | Extra |
+----------------+-------------+------+-----+---------+-------+
| employee_id    | int(6)      | NO   | PRI | 0       |       |
| first_name     | varchar(20) | YES  |     | NULL    |       |
| last_name      | varchar(25) | NO   |     | NULL    |       |
| email          | varchar(25) | NO   | UNI | NULL    |       |
| phone_number   | varchar(20) | YES  |     | NULL    |       |
| hire_date      | date        | NO   |     | NULL    |       |
| job_id         | varchar(10) | NO   | MUL | NULL    |       |
| salary         | double(8,2) | YES  |     | NULL    |       |
| commission_pct | double(2,2) | YES  |     | NULL    |       |
| manager_id     | int(6)      | YES  | MUL | NULL    |       |
| department_id  | int(4)      | YES  | MUL | NULL    |       |
+----------------+-------------+------+-----+---------+-------+
11 rows in set (0.00 sec)

基本的SELECT語句

SELECT...

SELECT 1; #沒有任何子句
SELECT 9/2; #沒有任何子句

SELECT ... FROM

  • 語法:
SELECT   標識選擇哪些列
FROM     標識從哪個表中選擇
  • 選擇全部列:
SELECT *
FROM   departments;

一般情況下,除非需要使用表中所有的欄位資料,最好不要使用萬用字元‘*’。使用萬用字元雖然可以節省輸入查詢語句的時間,但是獲取不需要的列資料通常會降低查詢和所使用的應用程式的效率。萬用字元的優勢是,當不知道所需要的列的名稱時,可以通過它獲取它們。

在生產環境下,不推薦你直接使用SELECT *進行查詢。

  • 選擇特定的列:
SELECT department_id, location_id
FROM   departments;

MySQL中的SQL語句是不區分大小寫的,因此SELECT和select的作用是相同的,但是,許多開發人員習慣將關鍵字大寫、資料列和表名小寫,讀者也應該養成一個良好的程式設計習慣,這樣寫出來的程式碼更容易閱讀和維護。

列的別名

  • 重新命名一個列

  • 便於計算

  • 緊跟列名,也可以在列名和別名之間加入關鍵字AS,別名使用雙引號,以便在別名中包含空格或特殊的字元並區分大小寫。

  • AS 可以省略

  • 建議別名簡短,見名知意

  • 舉例

    SELECT last_name AS name, commission_pct comm
    FROM   employees;

SELECT last_name "Name", salary*12 "Annual Salary"
FROM   employees;

去除重複行

預設情況下,查詢會返回全部行,包括重複行。

SELECT department_id
FROM   employees;

在SELECT語句中使用關鍵字DISTINCT去除重複行

SELECT DISTINCT department_id
FROM   employees;

針對於:

SELECT DISTINCT department_id,salary 
FROM employees;

這裡有兩點需要注意:

  • DISTINCT 需要放到所有列名的前面,如果寫成SELECT salary, DISTINCT department_id FROM employees會報錯。
  • DISTINCT 其實是對後面所有列名的組合進行去重,你能看到最後的結果是 74 條,因為這 74 個部門id不同,都有 salary 這個屬性值。如果你想要看都有哪些不同的部門(department_id),只需要寫DISTINCT department_id即可,後面不需要再加其他的列名了。

空值參與運算

  • 所有運運算元或列值遇到null值,運算的結果都為null
SELECT employee_id,salary,commission_pct,
12 * salary * (1 + commission_pct) "annual_sal"
FROM employees;

這裡你一定要注意,在 MySQL 裡面, 空值不等於空字串。一個空字串的長度是 0,而一個空值的長度是空。而且,在 MySQL 裡面,空值是佔用空間的。

著重號

  • 錯誤的
mysql> SELECT * FROM ORDER;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'ORDER' at line 1
  • 正確的
mysql> SELECT * FROM `ORDER`;
+----------+------------+
| order_id | order_name |
+----------+------------+
|        1 | shkstart   |
|        2 | tomcat     |
|        3 | dubbo      |
+----------+------------+
3 rows in set (0.00 sec)

mysql> SELECT * FROM `order`;
+----------+------------+
| order_id | order_name |
+----------+------------+
|        1 | shkstart   |
|        2 | tomcat     |
|        3 | dubbo      |
+----------+------------+
3 rows in set (0.00 sec)
  • 結論

我們需要保證表中的欄位、表名等沒有和保留字、資料庫系統或常用方法衝突。如果真的相同,請在SQL語句中使用一對``(著重號)引起來。

查詢常數

SELECT 查詢還可以對常數進行查詢。對的,就是在 SELECT 查詢結果中增加一列固定的常數列。這列的取值是我們指定的,而不是從資料表中動態取出的。

你可能會問為什麼我們還要對常數進行查詢呢?

SQL 中的 SELECT 語法的確提供了這個功能,一般來說我們只從一個表中查詢資料,通常不需要增加一個固定的常數列,但如果我們想整合不同的資料來源,用常數列作為這個表的標記,就需要查詢常數。

比如說,我們想對 employees 資料表中的員工姓名進行查詢,同時增加一列欄位corporation,這個欄位固定值為“abc”,可以這樣寫: SELECT 'abc' as corporation, last_name FROM employees;

總結

到此這篇關於MySQL的select語句的文章就介紹到這了,更多相關MySQL select語句內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com