一、外鍵爲某個表中的一列,它包含另外一個表的主鍵值,定義了兩個表之間的關係。經過外鍵查找: 函數
SELECT vend_name, prod_name, prid_price FROM vendors, products WHERE vendors.vend_id = products.vend_id ORDER BY vend_name, prod_name; 性能
在引用的列可能出現二義性,必須使用徹底限定列名。 測試
若是沒有用WHERE子句進行條件過濾則返回的結果是笛卡爾積,即兩個錶行的乘積。 spa
二、上條的語句所用的聯結是等值聯結,它基於兩個表之間的相等測試,這種聯結也成爲內部聯結。對於這種聯結可使用不一樣的語法: 排序
SELECT vend_name, prod_name, prod_price FROM vendors INNER JOIN products ON vendors.vend_id = products.vend_id; 索引
ANSI SQL規範首先INNER JOIN語法。 事務
三、SQL對一條SELECT語句中能夠聯結的表的數目沒有限制,建立聯結規則基本相同。 ip
但MySQL在運行時關聯指定的每一個表以處理聯結,這種處理可能很耗費資源,所以不要聯結沒必要要的表,聯結的表越多性能降低越厲害。 內存
四、自聯結 ci
加入想查詢ID爲DTNTR的物品相同生產廠家的其餘物品,能夠採用子查詢的方式:
SELECT prod_id, prod_name FROM products
WHERE vend_id = ( SELECT vend_id FROM products WHERE prod_id ='DTNTR');
也能夠採用自聯結的方式:
SELECT p1.prod_id, p1.prod_name FROM products AS p1, products AS p2 WHERE p1.vend_id = p2.vend_id AND p2.prod_id = 'DTNTR';
在查詢中須要的兩個表其實是相同的表,但對products的引用具備二義性,因此使用表別名。
自聯結一般做爲外部語句用來替代從相同表中檢索數據時使用的子查詢語句。雖然結果相同,但處理聯結比處理子查詢快不少。
五、外部聯結
聯結包含了那些在相關表中沒有關聯行的行:
SELECT customers.cust_id, orders.order_num
FROM customers LEFT OUTER JOIN orders
ON customers.cust_id = orders.cust_id;
在使用OUTER JOIN 時必須使用RIGHT或LEFT關鍵字指定包括沒有關聯行的表。LEFT指OUTER JOIN左側的表,以此類推。
六、組合查詢UNION
組合數條SQL查詢:
SELECT vend_id, prod_id, prod_price
FROM products
WHERE prod_price <= 5
UNION
SELECT vend_id, prod_id, prod_price
FROM products
WHERE vend_id IN (1001, 1002);
組合時列的類型必須兼容,沒必要徹底相同,可是能夠隱式的轉換。
組合結果時會自動去掉重複的行,若是不想去掉重複行需使用UNION ALL代替UNION。
對組合結果進行排序,只能使用一條ORDER BY子句,它必須出如今最後一條SELECT語句以後。
七、全文搜索
使用MATCH()和AGAINST(),MATCH()指定要搜索的列,AGAINST()指定匹配的文本。
搜索的列必須創建搜索索引,建立表時用FULLTEXT()包含列。
只有MyISAM引擎支持全文搜索,InnoDB不支持,而且漢語不具備詞分隔符,因此不能返回全文搜索的結果,因此工做中應該不多用到。
八、插入
插入完整行,不指定列名插入
INSERT INTO customers
VALUES(value1,
value2,
......
valuen);
指定列名插入
INSERT INTO 表名(列名1,
列名2,
......,
列名n)
VALUES(value1,
valuen);
若是表的定義容許,則能夠在INSERT操做中省略某些列,省略的列必須知足如下條件之一:
INSERT語句很耗時,並且可能下降等待處理的SELECT語句的性能。若是數據檢索是最重要的,則能夠經過在INSERT和INTO之間添加關鍵字LOW_PRIORITY,指示MySQL下降INSERT語句的優先級。一樣適用於UPDATE和DELETE語句。
能夠一條語句插入多行:
INSERT INTO 表名(列名1,
列名2,
......,
列名n)
VALUES(value1,
valuen),
(value1,
valuen);
九、插入檢索出的數據 INSERT SELECT
INSERT INTO 表名(列名1,
......,
列名n)
SELECT 列名1,
......,
列名n
FROM 另外一個表名;
十、更新數據UPDATE
UPDATE 表名
SET 列名1=value1,
列名2=value2
WHERE 過濾條件;
若是用UPDATE語句更新多行,而且在更新這些行中的一行出現錯誤時,則整個UPDATE操做被取消;若是想即便發生錯誤也繼續進行更新使用:UPDATE IGNORE 表名。
十一、刪除數據
DELETE FROM 表名
WHERE 過濾條件;
若是想從表中刪除全部行,不要使用DELETE。可以使用TRUNCATE TABLE語句,它完成相同的工做,但速度更快。TRUNCATE TABLE實際是刪除原來的表並從新建立一個表,而不是逐行刪除表中的數據。
在使用UPDATE或DELETE語句前,應該先用SELECT帶相同的WHERE子句進行測試,保證它過濾的是正確的記錄。
十二、建立表
CREATE TABLE customers (
cust_id int(11) NOT NULL AUTO_INCREMENT,
cust_name char(50) NOT NULL,
cust_address char(50) DEFAULT NULL,
cust_city char(50) DEFAULT NULL,
cust_state char(5) DEFAULT NULL,
cust_zip char(10) DEFAULT NULL,
cust_country char(50) DEFAULT NULL,
cust_contact char(50) DEFAULT NULL,
cust_email char(255) DEFAULT NULL,
PRIMARY KEY (`cust_id`)
) ENGINE=InnoDB AUTO_INCREMENT=10006 DEFAULT CHARSET=latin1
建立的表名必須不存在,若是存在將報錯。若是僅想在一個表不存在時建立它,應該使用CREATE TABLE IF NOT EXISTS 表名。
是否能夠爲NULL設置,NULL爲默認值。主鍵只能使用不容許爲NULL的列。
1三、AUTO_INCREMENT
每一個表只能有一個AUTO_INCREMENT列,並且它必須被索引。
若是一個列被指定爲AUTO_INCREMENT,它還能夠被賦予特殊值,在INSERT語句中指定值,而且保證它是惟一的便可。該值將被用來替代自動生成的值,後續的增量將開始使用該手工插入的值。
使用last_insert_id()函數能夠返回最後一個AUTO_INCREMENT值。
1四、經過DEFAUTL關鍵字能夠指定列的默認值。MySQL不容許使用函數做爲默認值,它只支持常量。
建議使用默認值而不是NULL。
1五、引擎類型
DBMS使用內部引擎管理和處理數據。MySQL具備多種引擎:
引擎能夠混用,不一樣的表使用不一樣的引擎。可是外鍵不能誇引擎。
1六、更新表ALERT TABLE
添加一個列:ALTER TABLE vendors ADD vend_phone CHAR(20);
刪除一個列:ALTER TABLE vendors DROP COLUMN vend_phone;
定義外鍵:ALTER TABLE orderitems ADD CONSTRAINT fk_orderitems_oders
FOREIGN KEY (order_num) REFERENCES orders(order_num);
1七、刪除表DROP TABLE 表名
1八、重命名錶 RENAME TABLE 原表名 TO 新表名;