整理自菜鳥教程
基礎概念要知道一些:
- 創建數據庫
CREATE DATABASE dbname;
- 創建表
CREATE TABLE Persons ( PersonID int, LastName varchar(255), FirstName varchar(255), Address varchar(255), City varchar(255) );
3.NOT NULL 約束 約束強制字段始終包含值。這意味着,如果不向字段添加值,就無法插入新記錄或者更新記錄
CREATE TABLE Persons ( P_Id int NOT NULL, LastName varchar(255) NOT NULL, FirstName varchar(255), Address varchar(255), City varchar(255) )
- UNIQUE 約束唯一標識數據庫表中的每條記錄。
UNIQUE 和 PRIMARY KEY 約束均爲列或列集合提供了唯一性的保證。
PRIMARY KEY 約束擁有自動定義的 UNIQUE 約束。
請注意,每個表可以有多個 UNIQUE 約束,但是每個表只能有一個 PRIMARY KEY 約束。
- 在 “Persons” 表創建時在 “P_Id” 列上創建 UNIQUE 約束
CREATE TABLE Persons ( P_Id int NOT NULL, LastName varchar(255) NOT NULL, FirstName varchar(255), Address varchar(255), City varchar(255), UNIQUE (P_Id) )
- 命名 UNIQUE 約束,並定義多個列的 UNIQUE 約束
CREATE TABLE Persons ( P_Id int NOT NULL, LastName varchar(255) NOT NULL, FirstName varchar(255), Address varchar(255), City varchar(255), CONSTRAINT uc_PersonID UNIQUE (P_Id,LastName) )
- 表已被創建時,如需在 “P_Id” 列創建 UNIQUE 約束,請使用下面的 SQL:
ALTER TABLE Persons ADD UNIQUE (P_Id)
- 如需命名 UNIQUE 約束,並定義多個列的 UNIQUE 約束,請使用下面的 SQL 語法:
ALTER TABLE Persons ADD CONSTRAINT uc_PersonID UNIQUE (P_Id,LastName)
- 撤銷 UNIQUE 約束,請使用下面的 SQL
ALTER TABLE Persons DROP INDEX uc_PersonID
- PRIMARY KEY 約束唯一標識數據庫表中的每條記錄。
主鍵必須包含唯一的值。
主鍵列不能包含 NULL 值。
每個表都應該有一個主鍵,並且每個表只能有一個主鍵。
- 在 “Persons” 表創建時在 “P_Id” 列上創建 PRIMARY KEY 約束:
CREATE TABLE Persons ( P_Id int NOT NULL, LastName varchar(255) NOT NULL, FirstName varchar(255), Address varchar(255), City varchar(255), PRIMARY KEY (P_Id) )
- 如需命名 PRIMARY KEY 約束,並定義多個列的 PRIMARY KEY 約束,請使用下面的 SQL 語法:
CREATE TABLE Persons ( P_Id int NOT NULL, LastName varchar(255) NOT NULL, FirstName varchar(255), Address varchar(255), City varchar(255), CONSTRAINT pk_PersonID PRIMARY KEY (P_Id,LastName) )
- 當表已被創建時,如需在 “P_Id” 列創建 PRIMARY KEY 約束,請使用下面的 SQL:
ALTER TABLE Persons ADD PRIMARY KEY (P_Id)
- 如需命名 PRIMARY KEY 約束,並定義多個列的 PRIMARY KEY 約束,請使用下面的 SQL 語法:
ALTER TABLE Persons ADD CONSTRAINT pk_PersonID PRIMARY KEY (P_Id,LastName)
如果您使用 ALTER TABLE 語句添加主鍵,必須把主鍵列聲明爲不包含 NULL 值(在表首次創建時)。 - 如需撤銷 PRIMARY KEY 約束,請使用下面的 SQL:
ALTER TABLE Persons DROP PRIMARY KEY
- 在 “Orders” 表創建時在 “P_Id” 列上創建 FOREIGN KEY 約束
CREATE TABLE Orders ( O_Id int NOT NULL, OrderNo int NOT NULL, P_Id int, PRIMARY KEY (O_Id), FOREIGN KEY (P_Id) REFERENCES Persons(P_Id) )
如需命名 FOREIGN KEY 約束,並定義多個列的 FOREIGN KEY 約束,請使用下面的 SQL 語法
CREATE TABLE Orders ( O_Id int NOT NULL, OrderNo int NOT NULL, P_Id int, PRIMARY KEY (O_Id), CONSTRAINT fk_PerOrders FOREIGN KEY (P_Id) REFERENCES Persons(P_Id) )
當 “Orders” 表已被創建時,如需在 “P_Id” 列創建 FOREIGN KEY 約束,請使用下面的 SQL:
ALTER TABLE Orders ADD FOREIGN KEY (P_Id) REFERENCES Persons(P_Id)
如需命名 FOREIGN KEY 約束,並定義多個列的 FOREIGN KEY 約束,請使用下面的 SQL 語法:
ALTER TABLE Orders ADD CONSTRAINT fk_PerOrders FOREIGN KEY (P_Id) REFERENCES Persons(P_Id)
撤銷 FOREIGN KEY 約束,請使用下面的 SQL:
ALTER TABLE Orders DROP FOREIGN KEY fk_PerOrders
一、數據庫表
- use RUNOOB; 命令用於選擇數據庫。
- set names utf8; 命令用於設置使用的字符集。
- SELECT * FROM Websites; 讀取數據表的信息。
- SQL 對大小寫不敏感:SELECT 與 select 是相同的
- 分號是在數據庫系統中分隔每條 SQL 語句的標準方法,這樣就可以在對服務器的相同請求中執行一條以上的 SQL 語句。
二、SELECT
- 從 “Websites” 表中選取 “name” 和 “country” 列:
SELECT name,country FROM Websites;
三、SELECT DISTINCT
在表中,一個列可能會包含多個重複值,有時您也許希望僅僅列出不同(distinct)的值。DISTINCT 關鍵詞用於返回唯一不同的值
- 僅從 “Websites” 表的 “country” 列中選取唯一不同的值,也就是去掉 “country” 列重複值:
SELECT DISTINCT country FROM Websites;
四、WHERE
提取那些滿足指定條件的記錄
- 從 “Websites” 表中選取國家爲 “CN” 的所有網站
SELECT * FROM Websites WHERE country='CN';
五、文本字段 vs. 數值字段
SQL 使用單引號來環繞文本值(大部分數據庫系統也接受雙引號)。
在上個實例中 ‘CN’ 文本字段使用了單引號。
如果是數值字段,請不要使用引號。
SELECT * FROM Websites WHERE id=1;
六、AND & OR
-
從 “Websites” 表中選取國家爲 “CN” 且alexa排名大於 “50” 的所有網站:
SELECT * FROM Websites WHERE country=‘CN’ AND alexa >50;
-
從 “Websites” 表中選取國家爲 “USA” 或者 “CN” 的所有客戶
SELECT * FROM Websites WHERE country='CN' OR country='USA';
-
把 AND 和 OR 結合起來(使用圓括號來組成複雜的表達式)。
下面的 SQL 語句從 “Websites” 表中選取 alexa 排名大於 “15” 且國家爲 “CN” 或 “USA” 的所有網站:SELECT * FROM Websites WHERE alexa>15 AND (country='CN' OR country='USA');
七、ORDER BY
1. 升序
- 從 “Websites” 表中選取所有網站,並按照 “alexa” 列排序:
SELECT * FROM Websites ORDER BY alexa;
2.降序
- 從 “Websites” 表中選取所有網站,並按照 “alexa” 列降序排序
SELECT * FROM Websites ORDER BY alexa DESC;
3. 多列
- 從 “Websites” 表中選取所有網站,並按照 “country” 和 “alexa” 列排序:
SELECT * FROM Websites ORDER BY country,alexa;
八、INSERT INTO
INSERT INTO 語句可以有兩種編寫形式。
第一種形式無需指定要插入數據的列名,只需提供被插入的值即可:
INSERT INTO table_name
VALUES (value1,value2,value3,...);
第二種形式需要指定列名及被插入的值:
INSERT INTO table_name (column1,column2,column3,...)
VALUES (value1,value2,value3,...);
-
向 “Websites” 表中插入一個新行
INSERT INTO Websites (name,url,alexa,country) values ('百度','http://baidu.com','4','CN');
-
在指定的列插入數據。
下面的 SQL 語句將插入一個新行,但是隻在 “name”、“url” 和 “country” 列插入數據(id 字段會自動更新):
INSERT INTO Websites(name,url,country) values ('stackoverflow','http://stackoverflow.com/','IND');
九、UPDATE
- 把 “菜鳥教程” 的 alexa 排名更新爲 5000,country 改爲 USA。
在更新記錄時要格外小心!在上面的實例中,如果我們省略了 WHERE 子句,如下所示:
UPDATE Websites
SET alexa=‘5000’, country=‘USA’
執行以上代碼會將 Websites 表中所有數據的 alexa 改爲 5000,country 改爲 USA。
執行沒有 WHERE 子句的 UPDATE 要慎重,再慎重。
十、DELETE
- 從 “Websites” 表中刪除網站名爲 “百度” 且國家爲 CN 的網站
DELETE FROM Websites WHERE name='百度' AND country='CN';
2. 刪除所有數據
可以在不刪除表的情況下,刪除表中所有的行。這意味着表結構、屬性、索引將保持不變:
DELETE FROM table_name;
或
DELETE * FROM table_name;