SELECT prod_name,prod_id FROM products;複製代碼
SELECT * FROM products;複製代碼
SELECT DISTINCT vend_id FROM products;複製代碼
SELECT prod_name FROM products LIMIT 5;複製代碼
// 第1種方式
SELECT prod_name FROM products LIMIT 5,10;
// 第2中方式
SELECT prod_name FROM products LIMIT 10 OFFSET 6;複製代碼
SELECT products.prod_name FROM carshcourse.products;複製代碼
排序規則說明:默認按照字母排序,不區分大小寫(如要區分大小寫,須要在數據庫中設置,經過SQL語句設置不了)git
SELECT prod_id,prod_price,prod_name FROM products ORDER BY prod_price,prod_name;複製代碼
SELECT prod_id,prod_price,prod_name FROM products ORDER BY prod_price DESC;複製代碼
SELECT prod_id,prod_price,prod_name FROM products ORDER BY prod_price DESC,prod_name;複製代碼
SELECT prod_price FROM products ORDER BY prod_price DESC LIMIT 1; 複製代碼
SELECT prod_price,prod_name FROM products WHERE prod_price = 2.50; 複製代碼
SELECT prod_price,prod_name FROM products WHERE prod_price BETWEEN 5 AND 10; 複製代碼
SELECT prod_name FROM products WHERE prod_price IS NULL; 複製代碼
SELECT prod_price,prod_name FROM products WHERE vend_id = 1003 AND prod_price = 10; 複製代碼
SELECT prod_price,prod_name FROM products WHERE vend_id = 1002 OR vend_id = 1003; 複製代碼
SELECT prod_price,prod_name FROM products WHERE (vend_id = 1002 OR vend_id = 1003) AND prod_price >= 10;; 複製代碼
// 在使用長的合法選項清單時, IN操做符的語法更清楚且更直觀
// 在使用IN時,計算的次序更容易管理(由於使用的操做符更少)
// IN操做符通常比OR操做符清單執行更快
// IN的最大優勢是能夠包含其餘SELECT語句,使得可以更動態地創建WHERE子句
SELECT prod_price,prod_name FROM products WHERE vend_id IN (1002,1003);複製代碼
SELECT prod_price,prod_name FROM products WHERE vend_id NOT IN (1002,1003);複製代碼
// 例:檢索任意以jet起頭的詞
SELECT prod_price,prod_name FROM products WHERE product_name LIKE 'jet%';
// 例:匹配任何位置包含文本anvil的值
SELECT prod_price,prod_name FROM products WHERE product_name LIKE '%anvil%';
// 例:找出以s起頭以e結尾的全部產品
SELECT prod_price,prod_name FROM products WHERE product_name LIKE 's%e';複製代碼
下劃線(_)通配符 - 用途與%同樣,但下劃線只匹配單個字符而不是多個字符。
正則表達式
// a jet , b jet * jet 這些均可以匹配
SELECT prod_price,prod_name FROM products WHERE product_name LIKE '_ jet';複製代碼
SELECT prod_name FROM products WHERE product_name REGEXP '1000';複製代碼
SELECT prod_name FROM products WHERE product_name REGEXP '1000|2000';複製代碼
// 1 Ton, a Ton, b Ton均可以被匹配
SELECT prod_name FROM products WHERE product_name REGEXP '[1ab] Ton';
// 等價於
SELECT prod_name FROM products WHERE product_name REGEXP '[1|a|b] Ton';複製代碼
SELECT prod_name FROM products WHERE product_name REGEXP '[^1ab] Ton';複製代碼
SELECT prod_name FROM products WHERE product_name REGEXP '[0-9] Ton';複製代碼
SELECT prod_name FROM products WHERE product_name REGEXP '\\.';複製代碼
SELECT prod_name FROM products WHERE product_name REGEXP '.';複製代碼
SELECT prod_name FROM products WHERE product_name REGEXP '[[:digit:]]{4}';
// 等價於
SELECT prod_name FROM products WHERE product_name REGEXP '[0-9]{4}';
// 等價於
SELECT prod_name FROM products WHERE product_name REGEXP '[0-9][0-9][0-9][0-9]';複製代碼
SELECT Concat(vend_name,'(',vend_country,')') FROM vendors;複製代碼
SELECT Concat(RTrim(vend_name),'(',Trim(vend_country),')') FROM vendors;複製代碼
SELECT Concat(RTrim(vend_name),'(',Trim(vend_country),')') AS vend_title FROM vendors;複製代碼
SELECT prod_id,quantity,item_price,quantity*item_price AS expanded_price FROM orderitems WHERE order_num = 20005;複製代碼
SELECT vend_name, Upper(vend_name) AS vend_name_upcase FROM vendors複製代碼
SELECT prod_name, LEFT(prod_description, 50) summary FROM products; 複製代碼
// 檢索出一個訂單記錄,該訂單記錄的order_date爲2005-09-01。
SELECT cust_id,order_num FROM orders WHERE Date(order_date) = '2005-09-01';
// 檢索出2005年9月下的全部訂單
SELECT cust_id,order_num FROM orders WHERE Date(order_date) BETWEEN '2005-09-01' AND '2005-09-30';
// 檢索出2005年9月下的全部訂單(不須要記住每月中有多少天或不須要操心閏年2月)
SELECT cust_id,order_num FROM orders WHERE Year(order_date)= 2005 AND Month(order_date) = 9;
複製代碼
SELECTAVG(prod_price) AS avg_price FROM products;複製代碼
// 統計全部行數
SELECT COUNT(*) AS num_cust FROM custormers;
// 只對具備電子郵件地址的客戶計數
SELECT COUNT(cust_email) AS num_cust FROM custormers;複製代碼
// 例:按vend_id分組數據,並統計相同vend_id的產品有多少個
SELECT vend_id, COUNT(*) AS num_prods FROM products GROUP BY vend_id;複製代碼
// 例:按vend_id分組數據,並統計相同vend_id的產品有多少個,而且只須要大於兩條的數據
SELECT vend_id, COUNT(*) AS num_prods FROM products GROUP BY vend_id HAVING COUNT(*)>=2;
// 組合HAVING和WHERE,例:它列出具備2個(含)以上、價格爲10(含)以上的產品的供應商
SELECT vend_id, COUNT(*) AS num_prods FROM products WHERE prod_price >= 10 GROUP BY vend_id HAVING COUNT(*)>=2;複製代碼
例子:(利用子查詢進行過濾)數據庫
(1) 檢索包含物品TNT2的全部訂單的編號。bash
(2) 檢索具備前一步驟列出的訂單編號的全部客戶的ID。函數
(3) 檢索前一步驟返回的全部客戶ID的客戶信息。 性能
上述每一個步驟均可以單獨做爲一個查詢來執行。能夠把一條SELECT語句返回的結果用於另外一條SELECT語句的WHERE子句。也可使用子查詢來把3個查詢組合成一條語句。
測試
在SELECT語句中,子查詢老是從內向外處理。
SELECT cust_name,cust_contact FROM customers WHERE cust_id IN (
SELECT cust_id FROM orders WHERE order_num IN (
SELECT order_num FROM orderitems WHERE prod_id = 'TNT2'));
// 使用聯結方式性能更好-聯結在後面介紹
SELECT cust_name,cust_contact FROM customers,orders,orderitems WHERE
customers.cust_id = orders.cust_id AND
orderitems.order_num = orders.order_num AND
prod_id = 'TNT2';複製代碼
例子:(利用子查詢做爲計算字段使用)spa
(1) 從customers表中檢索客戶列表。設計
(2) 對於檢索出的每一個客戶,統計其在orders表中的訂單數目。 code
SELECT cust_name,cust_state,
(SELECT COUNT(*) FROM orders WHERE orders_cust_id = customers.cust_id) AS orders
FORM customers ORDER BY cust_name;複製代碼
一條SELECT語句中能夠聯結的表的數目沒有限制
若是數據存儲在多個表中,怎樣用單條SELECT語句檢索出數據?
子查詢雖然也能夠解決問題,可是性能並非最好。
SELECT vend_name, prod_name, prod_price FR複製代碼
SELECT vend_name,prod_name,prod_price FROM vendors INNER JOIN
products
ON vendors.vend_id = products.vend_id;複製代碼
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';複製代碼
SELECT cust_name,cust_contact FROM customers AS c WHERE c.cust_id = 1;複製代碼
SELECT c.*, o.order_num FROM customers AS c,orders AS o WHERE c.cust_id = o.cust_id; 複製代碼
// 左外聯結
SELECT customers.cust_id, orders.order_num FROM customers
LEFT OUTER JOIN orders ON
customers.cust_id = orders.cust_id;
// 右外聯結
SELECT customers.cust_id, orders.order_num FROM customers
RIGHT OUTER JOIN orders ON
orders.cust_id = customers.cust_id;複製代碼
有兩種基本狀況,其中須要使用組合查詢:
使用UNION
// 返回的數據會自動去除查詢語句中都出現的重複的行
SELECT vend_id,prod_id,prod_privice FROM products WHERE prod_price <=5
UNION
SELECT vend_id,prod_id,prod_price FROM products WHERE vend_id IN (1001,1002);複製代碼
包含或取消重複的行(UNION AL)
使用UNION返回的數據會自動去除查詢語句中都出現的重複的行
使用UNION ALL, MySQL不取消重複的行
MySQL支持幾種基本的數據庫引擎。並不是全部的引擎都支持本書所描述的全文本搜索。兩個最常使用的引擎爲MyISAM和InnoDB,前者支持全文本搜索,然後者不支持。 默認MySQL建立的表都是InnoDB模式,若是須要用到全文搜索,則該表要建立爲MyISAM模式
在使用全文本搜索時, MySQL不須要分別查看每一個行,不須要分別分析和處理每一個詞。MySQL建立指定列中各詞的一個索引,搜索能夠針對這些詞進行。這樣, MySQL能夠快速有效地決定哪些詞匹配(哪些行包含它們),哪些詞不匹配,它們匹配的頻率,等等。
爲了進行全文本搜索,必須索引被搜索的列,並且要隨着數據的改變不斷地從新索引。在對錶列進行適當設計後, MySQL會自動進行全部的索引和從新索引。
在索引以後, SELECT可與Match()和Against()一塊兒使用以實際執行搜索。
下面的CREATE語句演示了FULLTEXT子句的使用:
CREATE TABLE productnotes
(
note_id int NOT NULL AUTO_INCREMENT,
prod_id char(10) NOT NULL,
note_text text NOT NULL,
PRIMARY KEY(note_id),
FULLTEXT(note_text)
) ENGINE = MyISAM;複製代碼
爲了進行全文本搜索,MySQL根據子句FULLTEXT(note_text)的指示對它進行索引 這裏的FULLTEXT索引單個列,若是須要也能夠指定多個列。
在定義以後, MySQL自動維護該索引。在增長、更新或刪除行時,索引隨之自動更新。
在索引以後,使用兩個函數Match()和Against()執行全文本搜索,其中Match()指定被搜索的列, Against()指定要使用的搜索表達式。
SELECT note_text FROM productnotes WHERE Match(note_text) Against('rabbit');複製代碼
傳 遞 給 Match() 的 值 必 須 與FULLTEXT()定義中的相同。若是指定多個列,則必須列出它們(並且次序正確)
查詢擴展用來設法放寬所返回的全文本搜索結果的範圍
SELECT note_text FROM productnotes WHERE Match(note_text) Against('rabbit' WITH QUERY EXPANSION);複製代碼
例:匹配包含heavy但不包含任意以rope開始的詞的行, 可以使用如下查詢:
SELECT note_text FROM productnotes WHERE Match(note_text) Against('rabbit -rope' IN BOOLEAN MODE);複製代碼
例:搜索匹配包含詞rabbit和bait的行
SELECT note_text FROM productnotes WHERE Match(note_text) Against('+rabbit +bait' IN BOOLEAN MODE);複製代碼
例:搜索匹配包含rabbit和bait中的至少一個詞的行。
SELECT note_text FROM productnotes WHERE Match(note_text) Against('rabbit bait' IN BOOLEAN MODE);複製代碼
例:匹配短語rabbit bait而不是匹配兩個詞rabbit和bait
SELECT note_text FROM productnotes WHERE Match(note_text) Against('"rabbit bait"' IN BOOLEAN MODE);複製代碼
註釋事項
插入一條包含全部記錄的行
INSERT INTO Customers VALUES(NULL,
'Pep E. LaPew',
'100 Main Street',
'CA',
'90047',
NULL,
NULL);複製代碼
INSERT INTO Customers(cust_name,cust_contact,cust_email) VALUES(
'Pep E. LaPew',
NULL,
NULL);複製代碼
沒有輸出 INSERT語句通常不會產生輸出
各個列必須以它們在表定義中出現的次序填充。第一列cust_id也爲NULL。這是由於每次插入一個新行時,該列由MySQL自動增量。
插入多行
INSERT INTO Customers(cust_name,cust_contact,cust_email) VALUES(
'Pep E. LaPew',
NULL,
NULL),(
'Peo L',
NULL,
NULL);複製代碼
更新一行
UPDATE Customers SET cust_email = 'elmer@fudd.com' WHERE cust_id = 10005;複製代碼
更新多行
UPDATE Customers SET cust_email = 'elmer@fudd.com',cust_name='THe Fudds' WHERE cust_id = 10005;複製代碼
UPDATE語句中可使用子查詢,使得能用SELECT語句檢索出的數據更新列數據
若是用UPDATE語句更新多行,而且在更新這些 行中的一行或多行時出一個現錯誤,則整個UPDATE操做被取消 (錯誤發生前更新的全部行被恢復到它們原來的值)。爲即便是發 生錯誤,也繼續進行更新,可以使用IGNORE關鍵字,以下所示: UPDATE IGNORE customers…
刪除一行:
DELETE FROM customers WHERE cust_id = 10005;複製代碼
DELETE語句從表中刪除行,甚至是刪除表中全部行。可是, DELETE不刪除表自己。
若是想從表中刪除全部行,不要使用DELETE。可以使用TRUNCATE TABLE語句,它完成相同的工做,但速度更快
在對UPDATE或DELETE語句使用WHERE子句前,應該先用SELECT進行測試,保證它過濾的是正確的記錄,以防編寫的WHERE子句不正確
CREATE TABLE `t_bas_user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '用戶id',
`account` varchar(128) NOT NULL COMMENT '帳戶',
`password` varchar(128) NOT NULL COMMENT '密碼',
`name` varchar(128) NOT NULL COMMENT '帳戶角色名稱(如:管理員)',
`phone` varchar(20) NOT NULL COMMENT '手機號碼',
`status` tinyint(1) NOT NULL DEFAULT 1 COMMENT '帳號狀態,默認1(0:禁用,1:啓用)',
`meta_created` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '建立時間',
`meta_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '最後一次修改時間',
`meta_logic_flag` tinyint(1) NOT NULL DEFAULT 0 COMMENT '邏輯刪除標識,默認0(0:否,1:是)',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;複製代碼
默認時間:
// 數據庫中datetime默認保存的格式爲'2019-06-03 15:26:51'
`meta_created` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '建立時間';
複製代碼
InnoDB是一個可靠的事務處理引擎,它不支持全文本搜索;
MEMORY在功能等同於MyISAM, 但因爲數據存儲在內存(不是磁盤)中,速度很快(特別適合於臨時表);
MyISAM是一個性能極高的引擎,它支持全文本搜索,但不支持事務處理。
給表添加一列
ALTER TABLE vendors ADD vend_phone CHAR(20);複製代碼
刪除一列
ALTER TABLE vendors DROP COLUMN vend_phone;複製代碼
RENAME TABLE vendors TO vendors1;複製代碼