Sql介紹 與 Sql基礎查詢
SQL
SQL也稱為結構化查詢語言(Structure Query Language),是一種用於管理和操作關係型資料庫的標準化計算機語言,SQL語言廣泛應用於各種關係型資料庫系統(RDBMS)如Mysql,Oracle,Microsoft SQL Server等等
SQL對資料庫的操作
- 資料查詢:透過
SELECT
語句從資料庫中檢索資料 - 資料定義(DDL):其中包括
CREATE,ALTER,DROP
對資料庫進行定義和修改資料庫結構 - 資料操控(DML):包括
INSERT,UPDATE,DELETE
語句插入,更新,刪除資料 - 資料控制:透過
GRANT,REVOKE
語句管理使用者許可權和範圍控制
SQL的特點
- 標準化:SQL是一個標準化的語言,各大資料庫廠商都支援SQL語言
- 高度非過程化:與過程化的與語言不同,SQL不需要指定特點演算法或步驟完成任務.SQL語句更專注描述所需結果,而非如何得到所需結果
- 集合操作:SQL支援集合操作,即一次可以處理多行資料.一個
SELECT
語句就可以返回多條記錄,INSERT,UPDATE
也可以一次影響多行資料 - 事務支援:SQL支援事務處理,允許將一組相關資料,作為一個完整的單元來執行.事務具有:原子性(Atomicity),一致性(Consistency),隔離性(Isolation),永續性(Durability)(關於這些性質在之後的事務章節會詳細講解),ACID,這四個性質確保了資料的一致性與可靠性
- 整合能力:SQL可以與其他 程式語言相互整合,使得開發者能夠在應用程式中嵌入SQL程式碼,實現高效操作,其中典型的屬Java開發者可以使用JDBC來執行SQL查詢
SQL基礎查詢
語法結構
SELECT 查詢列表 FORM 表名
其中查詢列表可以是表中的欄位,常量值,表示式,函式等等
如SELECT * FORM emplyees;
其中*
表示查詢表中所有資料
查詢表中單個欄位
-
SELECT 欄位名 FORM 表名
eg:查詢員工的所有姓名
SELECT e_name FORM emplyees;
查詢表中多個欄位
使用逗號將每個欄位分隔開來
-
SELECT 欄位1,欄位2,欄位3 FORM 表名;
eg:示例:查詢所有員工的姓名,郵箱,電話號碼
SELECT e_name,e_email,e_phone_num FORM emplyees;
為欄位起別名
在實際的資料庫表結構中,有些欄位名過長,或者不好理解,我們可以對欄位名起個表明,在後續呼叫中直接使用其別名即可,在多表查詢中,有些欄位名會出現重複,這時我們可以對相應的欄位其別名,不宜混淆
- 使用AS關鍵字
- 在將要其別名欄位後使用
AS
關鍵字SELECT 欄位名 AS 別名 FORM 表名;
- 在將要其別名欄位後使用
- 直接使用空格隔開
- 即在欄位和別名之間用空格隔開即可
SELECT 欄位名 別名 FORM 表名;
- 即在欄位和別名之間用空格隔開即可
去重
對查詢出的語句可能會出先欄位名重複的結果,這時,我們可以使用去重功能
-
使用
DISTINCT
關鍵字:SELECT DISTINCT 要去重的欄位 ,其他欄位… FORM 表名;
eg:查詢部門表中的部門ID,對於每個部門ID出現一次即可,因此我們可以使用去重
SELECT DISTINCT d_id FORM department;
+號操作
Mysql中
+
號只有一個功能:作為運算子,不能作為連線符
- 若
+
號兩側都是數值型,視為正常的加法運算 - 若
+
號兩側出現了字元,這嘗試將字元轉化為數值型別,若轉化成功,則繼續執行加法操作,失敗則轉化為數值0;轉化規則為:從首部開始將所有數值型字元進行轉化直到遇到字元型字元,如’11’⇒11;’1a’⇒1;’abc’⇒0;’11a1’⇒11 - null值與任何數值型別進行
+
操作都為null
SELECT 1 + 1; //2
SELECT '1' + '1';//2
SELECT 'a' + 1;//1
SELECT 'a' + 'b';//0
SELECT '1a' + '1b';//2
SELECT '11a11' + '11b11'//22;
SELECT 1 + null;//null
CONCAT()操作
既然
+
號只能作為運算子,那如何連線字元呢?→CONCAT()
函式
-
CONCAT()
:使用SELECT呼叫CONCAT();SELECT CONCAT(str1,str2,…);
eg:查詢員工姓名和郵箱,按固定格式(姓名[xxx@xx.com])要求輸出,比如:張三[123@qq.com]
SELECT CONCAT(e_name,’[’,e_email,’]’)FORM employees;
IFNULL()函式
-
IFNULL():若查詢出的值存在NULL值,使用替代值替代
SELECT IFNULL(欄位名,代替值) FROM 表名;
eg:查詢員工的姓名和部門ID,如果該員工沒有部門資訊,顯示未知
SELECT e_name,IFNULL(d_id,’未知’) FORM employees;
條件查詢
條件查詢,允許在查詢資料時,指定某些條件,從而篩選出符合條件的記錄
WHERE關鍵字
WHERE關鍵字是條件查詢的核心;
-
語法結構:
SELECT 查詢列表 //執行順序3 FORM 表名 //執行順序 1 WHERE 條件表示式;//執行順序2
eg:查詢 d_id 為 10 的所有員工
SELECT d_id FORM employees WHERE d_id=10;
表示式篩選
SQL中包含了條件運算子:>, <,>=,<=, =, !=,<>;<>與!=的作用相同都表示不等於,條件運算子是應用於條件表示式中的
-
eg.1:查詢工資大於8000的員工資訊
SELECT *FROM employees WHERE salary>8000;
-
eg.2查詢部門編號不等於3的員工資訊
SELECT *FORM employees WHERE d_id ! =3;
邏輯運算
邏輯運算子也是一般在WHERE表示式中使用,可幫助在查詢中指定多個條件或改變條件邏輯關係
-
邏輯運算子包括:
&&,||,!
,分別對應and,or,not
-
eg1:查詢工資在8000到10000之間的員工資訊→使用AND運算子連線
SELECT * FORM employees WHERE salary>8000 AND salary<100000;
-
eg2:查詢工資大於8000或者部門3的員工資訊→使用OR運算子連線
SELECT * FORM employees WHERE salary >8000 OR d_id=3;
模糊查詢
LIKE關鍵字
SQL中常用的是
LIKE
關鍵字,其配合萬用字元來實現模糊查詢
-
常用萬用字元
-
%
:代表可匹配度多個字元,包括0個,1個 -
_
:代表只能匹配一個字元SELECT 查詢列表 FROM 表名 WHERE 列名 LIKE '模式';
-
-
eg1:查詢姓名中包含【微】字的員工資訊
SELECT * FORM employees WHERE e_name LIKE ‘%微%’;
-
eg2:查詢姓名中第二個字是【可】字的員工資訊
SELECT * FORM employees WHERE e_name LIKE ’_微%’;
BETEWEEN…AND
查詢在某段範圍值內的資料,包含臨界值,即BETEWEEN 8000 AND 100000⇒[8000,10000]
-
eg1:查詢工資在8000到10000之間的員工資訊
SELECT * FORM employees WHERE salary BETWEEN 8000 AND 10000;
-
eg2:查詢入職時間在2018-01-01到2022-01-01之間的員工資訊
SELECT * FORM employees WHERE hiredate BETWEEN ‘2018-01-01’ AND ’2022-01-01’;
IN關鍵字
IN運算子用於檢測欄位值是否在一個指定的值列表中,使用IN運算子可以簡化查詢語句,特別在需要處理多個值情況下
-
eg:查詢在部門2或者部門3的員工資訊
SELECT *FORM employees WHERE d_id IN(2,3);
等價於SELECT * FORM employees WHERE d_id=2 OR d_id=3;
IS NULL/IS not NULL
用於檢測一個值是否NULL的運算子
-
eg1:查詢沒有部門的員工資訊
SELECT * FORM employees WHRER d_id is NULL;
-
eg2:查詢有部門的員工資訊
SELECT * FROM emplyees WHERE d_id is not NULL;
排序查詢
查詢出來的資料預設按照表格的儲存順序查詢,我們如果需要修改查詢結果展示的順序,可以使用排序查詢,
ORDER BY關鍵字
在SQL中ORDER BY實現排序,ASC代表升序,DESC代表降序
-
語法結構
SELECT 查詢列表 FROM 表 [WHERE 篩選列表] ORDER BY 排序列表 [ASC升序|DESC降序] -- ASC|DESC不寫預設是ASC
實現單欄位排序
-
ORDER BY 排序欄位 [ASC升序|DESD降序];
-
eg:查詢員工資訊按工資高低排序
- 按照工資升序 SELECT * FROM emplyees ORDER BY salary ASC -- ASC可以不寫 - 按照工資降序 SELECT * FROM emplyees ORDER BY salary DESC -- DESC不能省略
使用多個欄位排序
-
eg:查詢員工資訊,先按部門ID降序,再按工資升序
SELECT * FROM emplyees ORDER BY department_id DESC,salary ASC;