SQL
SQL (Structured Query Language:結構化查詢語言) 是用於管理關係資料庫管理系統(RDBMS)。SQL 的範圍包括數據插入、查詢、更新和刪除,資料庫模式創建和修改,以及數據訪問控制。
SQL對大小寫不敏感。
分號「;」是對每條SQL語句進行分隔。
單引號用來環繞文本值,對數值欄位不需要。
SELECT——從資料庫提取數據;
UPDATE——更新資料庫的數據;
DELETE——從資料庫刪除數據;
INSERT INTO——向資料庫插入新數據;
CREATE DATABASE——創建新資料庫;
ALTER DATABASE——修改資料庫;
CREATE TABLE——創建新表;
ALTER TABLE——改變資料庫表;
DROP TABLE——刪除表;
CREATE INDEX——創建索引;
DROP INDEX——刪除索引;(1)選擇部分列
SELECT col_1,col_2
FROM table_name
或者
(2)選擇全部列
SELECT *
FROM table_nameSELECT DISTINCT col_1
FROM table_nameSELECT *
FROM table_name
WHERE condition_1
常用的運算符:等於(=);不等於(<>或!=);大於(>);小於(<);大於等於(>=);小於等於(<=);在某個範圍內(BETWEEN);搜索某種模式(LIKE);指定針對某個列的多個可能值(IN)。4. ORDER BY子句
默認按照升序對記錄進行排序。如果需要按照降序對記錄進行排序,您可以使用 DESC 關鍵字。SELECT column_name,column_name
FROM table_name
ORDER BY column_name,column_name ASC|DESC;ORDER BY 多列的時候,先按照第一個column name排序,再按照第二個column name排序。
5. INSERT INTO子句
INSERT INTO 語句可以有兩種編寫形式。
第一種形式無需指定要插入數據的列名,只需提供被插入的值即可:INSERT INTO table_name
VALUES (value1,value2,value3,...);第二種形式需要指定列名及被插入的值:
INSERT INTO table_name (column1,column2,column3,...)
VALUES (value1,value2,value3,...);UPDATE table_name
SET column1=value1,column2=value2,...
WHERE some_column=some_value;
請注意 SQL UPDATE 語句中的 WHERE 子句!WHERE 子句規定哪條記錄或者哪些記錄需要更新。如果您省略了 WHERE 子句,所有的記錄都將被更新!DELETE FROM table_name
WHERE some_column=some_value;
請注意 SQL DELETE 語句中的 WHERE 子句!WHERE 子句規定哪條記錄或者哪些記錄需要刪除。如果您省略了 WHERE 子句,所有的記錄都將被刪除!
在不刪除表的情況下,刪除表中所有行。DELETE FROM table_name;高級教程
SELECT TOP/LIMIT/ROWNUM
(1)SQL Server / MS Access 語法SELECT TOP number|percent column_name(s)
FROM table_name;(2)MySQL 語法
SELECT column_name(s)
FROM table_name
LIMIT number;(3)Oracle 語法
SELECT column_name(s)
FROM table_name
WHERE ROWNUM <= number;
LIKE操作符
LIKE 操作符用於在 WHERE 子句中搜索列中的指定模式。SELECT column_name(s)
FROM table_name
WHERE column_name (NOT) LIKE pattern;通配符
(1)%——替代 0 個或多個字符;
(2)_——替代一個字符;
(3)[abcghf]——字符列中的任何單一字符;
(4)[^abcghf]或[!abcghf]——不在字符列中的任何單一字符;
(5)^——以xx開頭;
(6)$——以xx結尾。舉例:選取 name 以 "G"、"F" 或 "s" 開始的所有網站:
SELECT * FROM Websites
WHERE name REGEXP '^[GFs]';SELECT column_name(s)
FROM table_name
WHERE column_name IN (value1,value2,...);
IN和=的異同
同:在WHERE子句後作為篩選條件,都是等於的含義;
異:IN可以規定多個值,而=只能規定一個值。WHERE column_name IN (value1,value2)
等價於
WHERE column_name=value1
OR
column_name=value2
BETWEEN操作符
用於選取介於兩個值之間的數據範圍內的值。這些值可以是數值、文本或者日期。SELECT column_name(s)
FROM table_name
WHERE column_name (NOT)BETWEEN value1 AND value2;選取 name 以介於 'A' 和 'H' 之間字母開始的所有網站:
SELECT * FROM Websites
WHERE name BETWEEN 'A' AND 'H';
請注意,在不同的資料庫中,BETWEEN 操作符會產生不同的結果!(需要關注是否包含兩個測試值)(1)INNER JOIN:如果表中有至少一個匹配,則返回行;
SELECT column_name(s)
FROM table1
(INNER) JOIN table2
ON table1.column_name=table2.column_name;(2)LEFT (OUTER) JOIN:即使右表中沒有匹配(右表沒有匹配的結果為NULL),也從左表返回所有的行;
SELECT column_name(s)
FROM table1
LEFT (OUTER) JOIN table2
ON table1.column_name=table2.column_name;(3)RIGHT (OUTER) JOIN:即使左表中沒有匹配(左表沒有匹配的結果為NULL),也從右表返回所有的行;
SELECT column_name(s)
FROM table1
RIGHT (OUTER) JOIN table2
ON table1.column_name=table2.column_name;(4)FULL (OUTER) JOIN:只要其中一個表中存在匹配,則返回行,FULL OUTER JOIN 關鍵字只要左表(table1)和右表(table2)其中一個表中存在匹配,則返回行。
FULL OUTER JOIN 關鍵字結合了 LEFT JOIN 和 RIGHT JOIN 的結果。SELECT column_name(s)
FROM table1
FULL OUTER JOIN table2
ON table1.column_name=table2.column_name;
在使用JOIN時,ON和WHERE的區別
ON是在生成臨時表時使用的條件,而WHERE是臨時表生成後使用的條件。UNION操作符
用於合併兩個或多個 SELECT 語句的結果集。SELECT column_name(s) FROM table1
UNION (ALL)
SELECT column_name(s) FROM table2;默認地,UNION 操作符選取不同的值。如果允許重複的值,請使用 UNION ALL。
SELECT INTO語句
SELECT INTO 語句從一個表複製數據,然後把數據插入到另一個新表中。SELECT *
INTO newtable [IN externaldb]
FROM table1;
MySQL 資料庫不支持 SELECT ... INTO 語句,但支持 INSERT INTO ... SELECT 。INSERT INTO SELECT語句
從一個表複製數據,然後把數據插入到一個已存在的表中。目標表中任何已存在的行都不會受影響。INSERT INTO table2
SELECT * FROM table1;
或
INSERT INTO table2
(column_name(s))
SELECT column_name(s)
FROM table1;CREATE TABLE table_name
(
column_name1 data_type(size),
column_name2 data_type(size),
column_name3 data_type(size),
....
);
常見數據類型:int、archar、integer、decimal、date約束:
(1)NOT NULL - 指示某列不能存儲 NULL 值。(1.1)添加NOT NULL約束
ALTER TABLE Persons
MODIFY Age int NOT NULL;
(1.2)撤銷NOT NULL約束
ALTER TABLE Persons
MODIFY Age int NULL;(2)UNIQUE - 保證某列的每行必須有唯一的值。
(2.1)添加UNIQUE約束
ALTER TABLE Persons
ADD UNIQUE (P_Id)
或
ALTER TABLE Persons
ADD CONSTRAINT uc_PersonID UNIQUE (P_Id,LastName)
(2.2)撤銷UNIQUE約束
ALTER TABLE Persons
DROP INDEX uc_PersonID(3)PRIMARY KEY - NOT NULL 和 UNIQUE 的結合。確保某列(或兩個列多個列的結合)有唯一標識,有助於更容易更快速地找到表中的一個特定的記錄。
(3.1)添加PRIMARY KEY約束
ALTER TABLE Persons
ADD PRIMARY KEY (P_Id)
或
ALTER TABLE Persons
ADD CONSTRAINT pk_PersonID PRIMARY KEY (P_Id,LastName)
註:如果您使用 ALTER TABLE 語句添加主鍵,必須把主鍵列聲明為不包含 NULL 值(在表首次創建時)
(3.2)撤銷PRIMARY KEY約束
ALTER TABLE Persons
DROP PRIMARY KEY
或
ALTER TABLE Persons
DROP CONSTRAINT pk_PersonID(4)FOREIGN KEY - 保證一個表中的數據匹配另一個表中的值的參照完整性。用於預防破壞表之間連接的行為,也能防止非法數據插入外鍵列,因為它必須是它指向的那個表中的值之一。
(4.1)添加FOREIGN KEY約束
ALTER TABLE Orders
ADD FOREIGN KEY (P_Id)
REFERENCES Persons(P_Id)
或
ALTER TABLE Orders
ADD CONSTRAINT fk_PerOrders
FOREIGN KEY (P_Id)
REFERENCES Persons(P_Id)
(4.2)撤銷FOREIGN KEY約束
ALTER TABLE Orders
DROP FOREIGN KEY fk_PerOrders
或
ALTER TABLE Orders
DROP CONSTRAINT fk_PerOrders(5)CHECK - 保證列中的值符合指定的條件。
(5.1)添加CHECK約束
ALTER TABLE Persons
ADD CHECK (P_Id>0)
或
ALTER TABLE Persons
ADD CONSTRAINT chk_Person CHECK (P_Id>0 AND City='Sandnes')
(5.2)撤銷CHECK約束
ALTER TABLE Persons
DROP CONSTRAINT chk_Person
或
ALTER TABLE Persons
DROP CHECK chk_Person(6)DEFAULT - 規定沒有給列賦值時的默認值。
MySQL:
(6.1)添加DEFAULT約束
ALTER TABLE Persons
ALTER City SET DEFAULT 'SANDNES'
(6.2)撤銷DEFAULT約束
ALTER TABLE Persons
ALTER City DROP DEFAULT
注意:
UNIQUE 和 PRIMARY KEY 約束均為列或列集合提供了唯一性的保證;
PRIMARY KEY 約束擁有自動定義的 UNIQUE 約束;
每個表可以有多個 UNIQUE 約束,但是每個表只能有一個 PRIMARY KEY 約束。添加約束的方式
(1)在創建表時設置;
(2)使用ALTER語句進行添加。CREATE INDEX語句
在不讀取整個表的情況下,索引使資料庫應用程式可以更快地查找數據。
更新一個包含索引的表需要比更新一個沒有索引的表花費更多的時間,這是由於索引本身也需要更新。因此,理想的做法是僅僅在常常被搜索的列(以及表)上面創建索引。創建索引:
CREATE INDEX PIndex
ON Persons (LastName)
或
CREATE INDEX PIndex
ON Persons (LastName, FirstName)
DROP語句
通過使用 DROP 語句,可以輕鬆地刪除索引、表和資料庫。DROP DATABASE database_name
DROP TABLE table_name
DROP INDEX index_name如果我們僅僅需要刪除表內的數據,但並不刪除表本身,那麼我們該如何做呢?
TRUNCATE TABLE table_name
或
DELETE (*) FROM table_name
ALTER語句
ALTER TABLE 語句用於在已有的表中添加、刪除或修改列。添加列
ALTER TABLE table_name
ADD column_name datatype
刪除列
ALTER TABLE table_name
DROP COLUMN column_name
AUTO INCREMENT欄位
希望在每次插入新記錄時,自動地創建主鍵欄位的值。CREATE TABLE Persons
(
ID Integer PRIMARY KEY AUTOINCREMENT,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)
視圖View
視圖是虛擬表,視圖中的欄位就是來自一個或多個資料庫中的真實的表中的欄位。CREATE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE conditionCREATE OR REPLACE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition撤銷視圖:
DROP VIEW view_name
NULL
無法使用比較運算符來測試 NULL 值,比如 =、< 或 <>。我們必須使用 IS NULL 和 IS NOT NULL 操作符。NULL函數
ISNULL() 函數用於規定如何處理 NULL 值。NVL()、IFNULL() 和 COALESCE() 函數也可以達到相同的結果。SQL Server / MS Access舉例:
SELECT ProductName,UnitPrice*(UnitsInStock+ISNULL(UnitsOnOrder,0))
FROM Products
Oracle舉例:
SELECT ProductName,UnitPrice*(UnitsInStock+NVL(UnitsOnOrder,0))
FROM Products
MySQL舉例:
SELECT ProductName,UnitPrice*(UnitsInStock+IFNULL(UnitsOnOrder,0))
FROM Products
或
SELECT ProductName,UnitPrice*(UnitsInStock+COALESCE(UnitsOnOrder,0))
FROM Products
一些常用的知識庫
日期函數:https://www.runoob.com/sql/sql-dates.html
通用數據類型:https://www.runoob.com/sql/sql-datatypes-general.html