一、SQL 概述
1、什么是 SQL
SQL 指結構化查詢語言,全稱是 Structured Query Language。
SQL 讓您可以訪問和處理數據庫,包括數據插入、查詢、更新和刪除。
SQL 在1986年成為 ANSI(American National Standards Institute 美國國家標準化組織)的一項標準,在 1987 年成為國際標準化組織(ISO)標準。
2、SQL語言的版本歷史
在1970年代初,由IBM公司San Jose,California研究實驗室的埃德加·科德發表將數據組成表格的應用原則(Codd’s Relational Algebra)。1974年,同一實驗室的D.D.Chamberlin和R.F. Boyce對Codd’s Relational Algebra在研制關系數據庫管理系統System R中,研制出一套規范語言-SEQUEL(Structured English QUEry Language),并在1976年11月的IBM Journal of R&D上公布新版本的SQL(叫SEQUEL/2)。1980年改名為SQL。
1979年ORACLE公司首先提供商用的SQL,IBM公司在DB2 和SQL/DS數據庫系統中也實現了SQL。
1986年10月,美國ANSI采用SQL作為關系數據庫管理系統的標準語言(ANSI X3. 135-1986),后為國際標準化組織(ISO)采納為國際標準。
1989年,美國ANSI采納在ANSI X3.135-1989報告中定義的關系數據庫管理系統的SQL標準語言,稱為ANSI SQL 89, 該標準替代ANSI X3.135-1986版本。該標準為下列組織所采納:
國際標準化組織(ISO),為ISO 9075-1989報告“Database Language SQL With Integrity Enhancement”
美國聯邦政府,發布在The Federal Information Processing Standard Publication(FIPS PUB)127
目前,所有主要的關系數據庫管理系統支持某些形式的SQL, 大部分數據庫打算遵守ANSI SQL89標準。
3、SQL語句基礎語法規范
SQL(Structured Query Language)是用于管理關系型數據庫的標準語言。它的基本語法規范包括以下幾個關鍵部分:
1. SELECT 語句:這是最基本的SQL語句,用于從數據庫中選擇數據。格式通常是 `SELECT column_name(s) FROM table_name WHERE condition`,其中 `column_name(s)` 是要查詢的列,`table_name` 是數據表名,`condition` 是篩選條件。
2. INSERT INTO 語句:用于向表中插入新記錄,格式為 `INSERT INTO table_name (column1, column2,…) VALUES (value1, value2,…)`。
3. UPDATE 語句:用來更新表中的數據,格式為 `UPDATE table_name SET column = new_value WHERE condition`。
4. DELETE FROM 語句:刪除表中滿足特定條件的行,例如 `DELETE FROM table_name WHERE condition`。
5. CREATE TABLE 語句:用于創建新的表,定義列名、數據類型等信息。
6. JOIN 語句:連接兩個或多個表,如 INNER JOIN, LEFT JOIN, RIGHT JOIN 等,用于獲取多個表之間的關聯數據。
7. WHERE 子句:用于指定查詢條件,過濾返回的結果。
8. GROUP BY 和 HAVING 子句:用于對查詢結果進行分組和過濾聚合。
9. ORDER BY 子句:按照指定列對查詢結果進行排序。
10. COMMIT 和 ROLLBACK 命令:前者提交事務,后者回滾事務以撤銷更改。
二、SQL 分類:DDL、DML、DCL、DQL
01、DDL(Data Definition Languages)語句: 即數據庫定義語句,用來創建數據庫中的表、索引、視圖、存儲過程、觸發器等對象。SQLServer DLL語法是指SQL Server 數據庫定義域發的語法規則集合,主要包括創建、修改和刪除數據庫對象的語句。
常用的語句關鍵字有:
【create table 創建表】、【alter table 修改表】、【drop table 刪除表】、【truncate table 刪除表中所有行】、【create index 創建索引】、【drop index 刪除索引】、【comment 注釋】、【rename table 修改表名】
02、DML(Data Manipulation Language)語句: 指的是用于管理數據庫中數據的操作,用來查詢(Select)、添加(Insert)、更新(Update)、刪除(Delete)等
03、DCL(Data Control Language)語句: 即數據控制語句,用于授權/撤銷數據庫及其字段的權限。
常用的語句關鍵字有:
grant授權
revoke取消授權
04、DQL:(Data QueryLanguage)語句: 數據查詢語言
常用的語句關鍵字有:
selet 獲取
where、group by、having、ofder by等過濾條件
事務控制語言
SAVEPOINT 設置保存點
ROLLBACK 回滾
SET TRANSACTION
三、DDL(Data Definition Language):數據定義語言
1、基本操作
1.1操作數據庫:創建庫CREATE DATABASE,刪除庫DROP DATABASE,修改庫ALTER DATABASE。
1 2 3 | CREATE DATABASE TestDB; DROP DATABASE TestDB; ALTER DATABASE TestDB COLLATE Chinese_PRC_CI_AS; |
1.2 數據類型:數字型(int,tinyint,decimal,float等)、日期和時間類型(Date,TIME等)、字符串類型(char,varchar等)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | CREATE TABLE NumTable ( id INT , smallNum TINYINT, money DECIMAL (10, 2), size FLOAT ); CREATE TABLE DateTable ( date_column DATE , time_column TIME ); CREATE TABLE StringTable ( fixed_length_name CHAR (50), variable_length_address VARCHAR (255) ); |
1.3 操作表:創建表CREATE TABLE,刪除表DROP TABLE,修改表ALTER TABLE,重命名表 RENAME TABLE。、
1 2 3 4 5 6 7 8 9 10 | CREATE TABLE EmployeeTable ( ID int , Name varchar (255), Age int ); DROP TABLE EmployeeTable; ALTER TABLE EmployeeTable ADD Email varchar (255); ALTER TABLE EmployeeTable MODIFY COLUMN Age smallint ; ALTER TABLE EmployeeTable DROP COLUMN Age; RENAME TABLE EmployeeTable TO StaffTable; |
四、DML(Data Manipulation Language):數據操作語言
4.1 插入數據:利用INSERT INTO語句添加一條或多條記錄。
1 2 3 4 5 6 | INSERT INTO employees (id, name , department_id) VALUES (1, 'Li Ming' , 101); (向employees表中插入一條新的員工記錄,id為1, 名字是 'Li Ming' , 部門id是101) INSERT INTO employees ( name , department_id) VALUES ( 'Wang Gang' , 102); (向employees表中插入一條新的員工記錄, id將自動生成,名字是 'Wang Gang' , 部門id是102) INSERT INTO employees VALUES (3, 'Zhang San' , 103); (向employees表中插入一條新的員工記錄,id為3, 名字是 'Zhang San' , 部門id是103) |
4.2 修改數據:用UPDATE語句可以修改表中的數據。
1 2 3 4 5 6 | UPDATE employees SET department_id = 201 WHERE name = 'Li Ming' ; (修改名為 'Li Ming' 的員工的部門id為201) UPDATE employees SET name = 'Liu Yan' WHERE id = 2; (修改id為2的員工的名字為 'Liu Yan' ) UPDATE employees SET name = 'Zhu Rongji' , department_id = 202 WHERE id = 3; (修改id為3的員工的名字為 'Zhu Rongji' 和部門id為202) |
4.3 刪除數據:DELETE FROM語句用于在表中刪除一條或者多條記錄。
1 2 3 4 5 6 | DELETE FROM employees WHERE id = 1; (刪除id為1的員工記錄) DELETE FROM employees WHERE name = 'Wang Gang' ; (刪除名字為 'Wang Gang' 的員工記錄) DELETE FROM employees WHERE department_id = 202; (刪除部門id為202的所有員工記錄) |
五、DCL(Data Control Language):數據控制語言
5.1 創建用戶:使用CREATE USER語句創建新的數據庫用戶。
1 2 | CREATE USER 'newuser' @ 'localhost' IDENTIFIED BY 'password' ; (在 "localhost" 上創建一個名為 "newuser" 的新用戶,密碼是 "password" 。) |
5.2 給用戶授權:使用GRANT語句為用戶分配訪問權限。
1 2 | GRANT SELECT , INSERT , DELETE ON database_name.table_name TO 'username' @ 'localhost' ; (在localhost上給 "username" 用戶賦予運database_name數據庫中table_name表的 SELECT , INSERT 和 DELETE 權限。) |
5.3 撤銷授權:使用REVOKE語句撤銷用戶的訪問權限。
1 2 | REVOKE INSERT ON database_name.table_name FROM 'username' @ 'localhost' ; (在localhost上撤銷 "username" 用戶對database_name數據庫中table_name表的 INSERT 權限。) |
5.4 查看用戶權限:使用SHOW GRANTS語句查看用戶當前的權限列表。
1 2 | SHOW GRANTS FOR 'username' @ 'localhost' ; (顯示 "localhost" 上 "username" 用戶的所有權限。) |
5.5 刪除用戶:用DROP USER語句來刪除一個用戶。
1 2 | DROP USER 'username' @ 'localhost' ; (刪除 "localhost" 上名為 "username" 的用戶。) |
5.6 修改用戶密碼(以root身份):通過ALTER USER語句可以修改用戶的密碼。
1 2 | ALTER USER 'username' @ 'localhost' IDENTIFIED BY 'newpassword' ; (修改在 "localhost" 上username用戶的密碼為 "newpassword" 。) |
六、DQL(Data Query Language):數據查詢語言
6.1 基礎查詢:利用SELECT 語句可以查詢數據庫中的數據。
1 2 3 4 5 6 | SELECT * FROM Employee; (查詢Employees表中的所有記錄) SELECT FirstName, LastName FROM Employee; (查詢Employee表中的FirstName和LastName字段所有記錄) |
6.2 條件查詢:通過使用WHERE子句來設定查詢條件。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | SELECT * FROM Employee WHERE Salary > 5000; (查詢Employee表中Salary大于5000的所有記錄) SELECT FirstName, LastName FROM Employee WHERE Age <= 30; (查詢Employee表中年齡小于等于30的員工的firstName和lastName字段記錄) SELECT * FROM Employee WHERE Salary > 5000 AND Age <= 30; (查詢Employee表中Salary大于5000且年齡小于等于30的所有記錄) SELECT * FROM Employee WHERE Salary > 5000 OR Age <= 30; (查詢Employee表中Salary大于5000或年齡小于等于30的所有記錄) |
6.3 模糊查詢:使用LIKE子句,配合通配符%和_進行模糊查詢。
1 2 3 4 5 6 7 8 9 10 11 12 | SELECT * FROM Employee WHERE FirstName LIKE 'John%' ; (查詢Employee表中FirstName以John開頭的所有記錄) SELECT * FROM Employee WHERE FirstName LIKE '%John%' ; (查詢Employee表中FirstName包含John的所有記錄) SELECT FirstName, LastName FROM Employee WHERE LastName LIKE '%son_' ; (查詢Employee表中LastName以son+一個任意字符結束的所有記錄) |
6.4 字段控制查詢:運用DISTINCT關鍵字進行去重查詢。
1 2 3 4 5 6 7 | SELECT DISTINCT City FROM Employee; (查詢Employee表中,City字段去重之后的所有城市記錄) SELECT DISTINCT Age, Salary FROM Employee WHERE Age<50; (查詢Employee表中,Age小于50歲的員工的Age和Salary字段組合記錄,并進行去重處理) |
6.5 排序:用ORDER BY子句按照一個或多個列進行排序。
單列排序:
1 2 3 4 | SELECT * FROM Employee ORDER BY Salary; (按 '工資' 列的升序返回Employee表中的所有行。) |
多列排序:
1 2 3 4 | SELECT * FROM Employee ORDER BY Salary, Age DESC ; (首先根據 '工資' 列的升序對Employee表中的行進行排序,然后在工資相同的情況下,根據 'Age' 列的降序進行排序。) |
6.6 聚合函數:包括COUNT,SUM,MAX,MIN,AVG等函數。
COUNT:
1 2 3 | SELECT COUNT (*) FROM Employee; (返回Employee表的總行數。) |
SUM:
1 2 3 | SELECT SUM (Salary) FROM Employee; (返回Employee表中所有員工的薪水總和。) |
MAX:
1 | SELECT MAX (Age)` ` FROM Employee;``(返回Employee表中員工的最大年齡。) |
MIN:
1 | SELECT MIN (Age)` ` FROM Employee;``(返回Employee表中員工的最小年齡。) |
AVG:
1 | SELECT AVG (Salary)` ` FROM Employee;``(返回Employee表中員工的平均薪水。) |
6.7 分組查詢:GROUP BY子句是用于結合聚合函數,依據一個或多個列進行分組。
按單列分組:
1 | SELECT Department, COUNT (*)` ` FROM Employee` ` GROUP BY Department;``(返回每個部門的員工數量。) |
按多列分組:
1 | SELECT Department, JobTitle, AVG (Salary)` ` FROM Employee` ` GROUP BY Department, JobTitle;``(返回每個部門及職位下員工的平均薪水。) |
分組后過濾:
1 | SELECT Department, JobTitle, AVG (Salary)` ` FROM Employee` ` GROUP BY Department, JobTitle`` HAVING AVG (Salary) > 5000;``(返回每個部門及職位下員工的平均薪水大于5000的部分。) |
6.8 LIMIT:用來限定查詢結果的起始行,以及總行數。
簡單LIMIT:
1 | SELECT *` ` FROM Employee` ` ORDER BY Salary DESC ` `LIMIT 10;``(返回前10個工資最高的員工。) |
帶偏移量的LIMIT:
1 | SELECT *` ` FROM Employee` ` ORDER BY Salary DESC ` `LIMIT 10 OFFSET 5;``(返回工資排名第6到第15的10個員工。) |
6.9 多表連接查詢:
內連接:INNER JOIN
1 | SELECT Orders.OrderID, Customers.CustomerName`` FROM Orders`` INNER JOIN Customers`` ON Orders.CustomerID = Customers.CustomerID; |
左連接:LEFT JOIN
1 | SELECT Customers.CustomerName, Orders.OrderID`` FROM Customers`` LEFT JOIN Orders`` ON Customers.CustomerID = Orders.CustomerID; |
右連接:RIGHT JOIN
1 | SELECT Orders.OrderID, Customers.CustomerName`` FROM Orders`` RIGHT JOIN Customers`` ON Orders.CustomerID = Customers.CustomerID; |
全外連接:FULL JOIN
1 | SELECT Customers.CustomerName, Orders.OrderID`` FROM Customers`` FULL JOIN Orders`` ON Customers.CustomerID = Orders.CustomerID; |
笛卡爾積:CROSS JOIN
1 | SELECT Products.ProductName, Suppliers.SupplierName`` FROM Products`` CROSS JOIN Suppliers; |