SQL 分為兩個部分:數(shù)據(jù)操作語言 (DML) 和 數(shù)據(jù)定義語言 (DDL)
查詢和更新指令構(gòu)成了 SQL 的 DML 部分:
SELECT - 從數(shù)據(jù)庫表中獲取數(shù)據(jù)
UPDATE - 更新數(shù)據(jù)庫表中的數(shù)據(jù)
DELETE - 從數(shù)據(jù)庫表中刪除數(shù)據(jù)
INSERT INTO - 向數(shù)據(jù)庫表中插入數(shù)據(jù)
SQL 中最重要的 DDL 語句:
CREATE DATABASE - 創(chuàng)建新數(shù)據(jù)庫
ALTER DATABASE - 修改數(shù)據(jù)庫
CREATE TABLE - 創(chuàng)建新表
ALTER TABLE - 變更(改變)數(shù)據(jù)庫表
DROP TABLE - 刪除表
CREATE INDEX - 創(chuàng)建索引(搜索鍵)
DROP INDEX - 刪除索引
SQL基本語句
1启盛、SELECT
SELECT 列名稱或者* FROM 表名稱
SELECT DISTINCT 列名稱 FROM 表名稱 返回唯一不同的值
SELECT LastName,FirstName FROM Persons
2、WHERE 篩選條件
SELECT 列名稱 FROM 表名稱 WHERE 列 運算符 值
SELECT * FROM Persons WHERE City='Beijing'
文本條件值周圍用單引號!
3扮休、AND/OR
SELECT * FROM Persons WHERE FirstName='Thomas' AND/OR LastName='Carter'
SELECT * FROM Persons WHERE (FirstName='Thomas' OR FirstName='William')
AND LastName='Carter'
4、ORDER BY 排序
SELECT Company, OrderNumber FROM Orders ORDER BY Company 以字母順序顯示公司名稱
SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC, OrderNumber ASC 以逆字母順序顯示公司名稱按脚,并以數(shù)字順序顯示順序號
5、INSERT INTO 插入值
INSERT INTO table_name (列1, 列2,...) VALUES (值1, 值2,....)
INSERT INTO Persons VALUES ('Gates', 'Bill', 'Xuanwumen 10', 'Beijing')
INSERT INTO Persons (LastName, Address) VALUES ('Wilson', 'Champs-Elysees') 在指定的列中插入數(shù)據(jù)
6连舍、UPDATE 更新修改數(shù)據(jù)
UPDATE 表名稱 SET 列名稱 = 新值 WHERE 列名稱 = 某值
UPDATE Person SET Address = 'Zhongshan 23', City = 'Nanjing' WHERE LastName = 'Wilson' 為 lastname 是 "Wilson" 的人修改地址授段,添加城市
7畜埋、DELETE
DELETE FROM Person WHERE LastName = 'Wilson'
DELETE * FROM table_name
SQL高級功能
1、TOP 限定前幾個
SELECT column_name(s) FROM table_name LIMIT number
SELECT * FROM Persons LIMIT 5
SELECT TOP 2 * FROM Persons
SELECT TOP 50 PERCENT * FROM Persons
2畴蒲、LIKE
SELECT * FROM Persons WHERE City LIKE 'N%'
希望從上面的 "Persons" 表中選取居住在以 "N" 開始的城市里的人
注意:"%" 可用于定義通配符(模式中缺少的字母)
SELECT * FROM Persons WHERE City LIKE '%g' 以 "g" 結(jié)尾的城市
SELECT * FROM Persons WHERE City NOT LIKE '%lon%' 不包含 "lon" 的城市
3悠鞍、通配符介紹
SQL 通配符必須與 LIKE 運算符一起使用!
SELECT * FROM Persons WHERE LastName LIKE 'C_r_er' 姓氏以 "C" 開頭模燥,然后是一個任意字符咖祭,然后是 "r",然后是任意字符蔫骂,然后是 "er"
SELECT * FROM Persons WHERE City LIKE '[ALN]%' 城市以 "A" 或 "L" 或 "N" 開頭
4么翰、IN / BETWEEN 選取多個值
SELECT * FROM Persons WHERE LastName IN ('Adams','Carter') 選取姓氏為 Adams 和 Carter
SELECT * FROM Persons WHERE LastName (NOT)BETWEEN 'Adams' AND 'Carter' 字母順序顯示介于 "Adams"(包括)和 "Carter"(不包括)
5、AS 別名
SELECT po.OrderID, p.LastName, p.FirstName
FROM Persons AS p, Product_Orders AS po
WHERE p.LastName='Adams' AND p.FirstName='John'
兩個表分別是:"Persons" 和 "Product_Orders"辽旋。我們分別為它們指定別名 "p" 和 "po"
6浩嫌、各種JOIN
JOIN = INNER JOIN、LEFT JOIN补胚、RIGHT JOIN码耐、FULL JOIN
INNER JOIN: 如果表中有至少一個匹配,則返回行
LEFT JOIN: 即使右表中沒有匹配溶其,也從左表返回所有的行
RIGHT JOIN: 即使左表中沒有匹配骚腥,也從右表返回所有的行
FULL JOIN: 只要其中一個表中存在匹配,就返回行
INNER JOIN 關(guān)鍵字在表中存在至少一個匹配時返回行瓶逃。如果 "Persons" 中的行在 "Orders" 中沒有匹配束铭,就不會列出這些行。
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons INNER JOIN Orders
ON Persons.Id_P=Orders.Id_P
ORDER BY Persons.LastName
LEFT JOIN 關(guān)鍵字會從左表 (table_name1) 那里返回所有的行厢绝,即使在右表 (table_name2) 中沒有匹配的行契沫。
RIGHT JOIN 關(guān)鍵字會從右表 (Orders) 那里返回所有的行,即使在左表 (Persons) 中沒有匹配的行昔汉。
FULL JOIN 關(guān)鍵字會從左表 (Persons) 和右表 (Orders) 那里返回所有的行懈万。如果 "Persons" 中的行在表 "Orders" 中沒有匹配,或者如果 "Orders" 中的行在表 "Persons" 中沒有匹配挤庇,這些行同樣會列出钞速。
7、UNION / UNION ALL 合并兩個結(jié)果集
默認地嫡秕,UNION 操作符選取不同的值渴语。如果允許重復(fù)的值,請使用 UNION ALL
SELECT E_Name FROM Employees_China
UNION (ALL)
SELECT E_Name FROM Employees_USA
8昆咽、SELECT INTO 創(chuàng)建表的備份復(fù)件
SELECT LastName,FirstName INTO Persons_backup FROM Persons
SELECT * INTO Persons IN 'Backup.mdb' FROM Persons 向另一個數(shù)據(jù)庫中拷貝
SELECT Persons.LastName,Orders.OrderNo
INTO Persons_Order_Backup
FROM Persons INNER JOIN Orders
ON Persons.Id_P=Orders.Id_P 創(chuàng)建一個名為 "Persons_Order_Backup" 的新表驾凶,其中包含了從 Persons 和 Orders 兩個表中取得的信息
9牙甫、CREATE DATABASE / TABLE
CREATE DATABASE my_db
CREATE TABLE Persons 創(chuàng)建數(shù)據(jù)庫中的表
(
Id_P int,
LastName varchar(255),
FirstName varchar(255),
Address varchar(255),
City varchar(255)
) Id_P 列是 int,包含整數(shù)调违。其余 4 列的數(shù)據(jù)類型是 varchar窟哺,最大長度為 255 個字符
10、約束: 限制加入表的數(shù)據(jù)的類型
寫在創(chuàng)建表的數(shù)據(jù)類型之后技肩。primary key中暗含unique約束且轨。一個表格只能有一個primary key約束,但可以有多個unique約束虚婿。
SQL Server格式:列名稱 數(shù)據(jù)類型 約束旋奢;MySQL會單列一行命令
NOT NULL 約束強制字段始終包含值。這意味著然痊,如果不向字段添加值至朗,就無法插入新記錄或者更新記錄
CREATE TABLE Persons
(
Id_P int NOT NULL, UNIQUE 這是SQL Server的寫法
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
UNIQUE (Id_P) 這是MySQL的寫法
)
如果是當表已被創(chuàng)建時,如需在 "Id_P" 列創(chuàng)建 UNIQUE 約束:
ALTER TABLE Persons ADD UNIQUE (Id_P)
ALTER TABLE Persons DROP INDEX uc_PersonID (撤銷)
11剧浸、PRIMARY / FOREIGN KEY
PRIMARY KEY 約束唯一標識數(shù)據(jù)庫表中的每條記錄锹引。每個表都應(yīng)該有一個主鍵,并且每個表只能有一個主鍵唆香。
MySQL 與Server的用法同UNIQUE嫌变,同理ADD和DROP:
CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
PRIMARY KEY (Id_P) 這是MySQL的用法
)
一個表中的 FOREIGN KEY 指向另一個表中的 PRIMARY KEY。
例子:"Orders" 中的 "Id_P" 列指向 "Persons" 表中的 "Id_P" 列袋马。
"Persons" 表中的 "Id_P" 列是 "Persons" 表中的 PRIMARY KEY初澎。
"Orders" 表中的 "Id_P" 列是 "Orders" 表中的 FOREIGN KEY秸应。
這是MySQL用法虑凛,在 "Orders" 表創(chuàng)建時為 "Id_P" 列創(chuàng)建 FOREIGN KEY:
PRIMARY KEY (Id_O),
FOREIGN KEY (Id_P) REFERENCES Persons(Id_P)
ALTER TABLE Orders ADD FOREIGN KEY (Id_P) REFERENCES Persons(Id_P)
12、CHECK約束
CHECK (Id_P>0) CHECK 約束規(guī)定 "Id_P" 列必須只包含大于 0 的整數(shù)
CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CONSTRAINT chk_Person CHECK (Id_P>0 AND City='Sandnes')
)
13软啼、DEFAULT 插入默認值
City varchar(255) DEFAULT 'Sandnes'
OrderDate date DEFAULT GETDATE() 通過使用類似 GETDATE() 這樣的函數(shù)桑谍,DEFAULT 約束也可以用于插入系統(tǒng)值
14、CREATE INDEX 創(chuàng)建索引
CREATE UNIQUE INDEX PersonIndex ON Person (LastName DESC)
創(chuàng)建一個唯一索引祸挪,名為 "PersonIndex"锣披,在 Person 表的 LastName 列,并降序索引
CREATE INDEX PersonIndex ON Person (LastName, FirstName)
刪除索引(MySQL的用法):ALTER TABLE table_name DROP INDEX index_name
15贿条、DROP 與 ALTER
DROP TABLE 表名稱 / DATABASE db
ALTER TABLE Persons ADD Birthday date 添加新列Birthday
ALTER TABLE Persons ALTER COLUMN Birthday year 修改Birthday 類型
ALTER TABLE Person DROP COLUMN Birthday
16雹仿、VIEW 可視化
視圖 "Current Product List" 會從 Products 表列出所有正在使用的產(chǎn)品:
CREATE VIEW [Current Product List] AS
SELECT ProductID,ProductName
FROM Products
WHERE Discontinued=No
SELECT * FROM [Current Product List] 查詢命令:可以查詢上面這個視圖
計算在 1997 年每個種類的銷售總數(shù)。請注意整以,這個視圖會從另一個名為 "Product Sales for 1997" 的視圖那里選取數(shù)據(jù):
CREATE VIEW [Category Sales For 1997] AS
SELECT DISTINCT CategoryName,Sum(ProductSales) AS CategorySales
FROM [Product Sales for 1997]
GROUP BY CategoryName
17胧辽、Isnull() 和 Ifnull()
由于Null本身和0不等價,所以公黑,我們需要處理null值邑商,比如設(shè)置其等于0摄咆。
SQL Server的用法:
SELECT ProductName,UnitPrice(UnitsInStock+ISNULL(UnitsOnOrder,0)) FROM Products
MySQL的用法:
SELECT ProductName,UnitPrice(UnitsInStock+IFNULL(UnitsOnOrder,0)) FROM Products
18、RDBMS 關(guān)系數(shù)據(jù)庫管理系統(tǒng)
RDBMS是SQL的基礎(chǔ)人断!
首先吭从,數(shù)據(jù)庫管理系統(tǒng)是一種可以訪問數(shù)據(jù)庫中數(shù)據(jù)的計算機程序。DBMS 使我們有能力在數(shù)據(jù)庫中提取恶迈、修改或者存貯信息涩金。不同的 DBMS 提供不同的函數(shù)供查詢、提交以及修改數(shù)據(jù)暇仲。關(guān)系數(shù)據(jù)庫管理系統(tǒng) (RDBMS) 也是一種數(shù)據(jù)庫管理系統(tǒng)鸭廷,其數(shù)據(jù)庫是根據(jù)數(shù)據(jù)間的關(guān)系來組織和訪問數(shù)據(jù)的。