繼惡補了C++基礎以後,又來惡補MySQL了,花了將近一天的時間啃完了<MySQL必知必會>這本書,整理了有點糙的讀書筆記。正則表達式
1.SHOW語句的使用:sql
SHOW DATABASES; //顯示存在的數據庫列表 SHOW TABLES; //顯示當前數據庫裏存在的表 SHOW COLUMNS FROM user; //顯示錶user中的全部列(字段)信息,效果同DESCRIBE user SHOW GRANTS; //顯示受權用戶
2.SELECT查詢語句:數據庫
SELECT name FROM products; //查詢單列 SELECT name,id FROM products; //查詢多列 SELECT * FROM products; //查詢全部列 SELECT DISTINCT id FROM products; //查詢一列返回不一樣的行 SELECT products.name FROM factory.products; //使用徹底限定的代表和數據庫名
3.LIMIT子句限定顯示結果行數:安全
SELECT name FROM products LIMIT 5; //查詢一列返回從開始的5行 SELECT name FROM products LIMIT 5,5; //查詢一列返回從第5行開始的5行
4.ORDER BY子句對查詢結果進行排序:函數
SELECT name FROM products ORDER BY name; //經過單一列對查詢結果排序,排序子句中的列名不必定是查詢結果中的列明。 SELECT id,price,name FROM products ORDER BY price,name;//經過多列對結果排序,即當第一個列值相同時按照第二個再排,不然只按第一個排。 SELECT id,price,name FROM products ORDER BY price DESC,name;//同上,只不過先按price降序排列,再按name升序排列(沒寫ASC關鍵字是由於默認升序) SELECT price FROM products ORDER BY price DESC LIMIT 1; //利用排序子句和LIMIT子句檢索價格最大值
5.WHERE子句用於過濾行數據:spa
SELECT name,price FROM products WHERE price = 2.5; //過濾價格等於2.5的數據 SELECT name,price FROM products WHERE price BETWEEN 5 AND 10; //過濾價格在5到10之間的數據 SELECT id FROM customers WHERE email IS NULL //過濾表中email爲空值得數據
WHERE子句可使用的基本操做符有: =、!= 、< 、> 、<= 、>= 、> 、 BETWEEN。還能夠配合以下特殊操做符(AND \ OR \ IN \ NOT):code
SELECT id,price,name FROM products WHERE id = 1000 AND price <=10; //AND操做符 SELECT name,price FROM products WHERE id = 1000 OR id = 1002; //OR操做符 SELECT name,price FROM products WHERE id IN(1002,1003) ORDER BY name; //IN操做符 SELECT name,price FROM products WHERE id NOT IN(1002,1003) ORDER BY name;//NOT操做符用於對後面子句取反
6.LIKE子句:排序
SELECT id,name FROM products WHERE name LIKE 'jet%'; //%通配符表示任何字符出現任意次數,這裏表示以jet開頭的詞,jet後不管出現多少個任意字符。 SELECT id,name FROM products WHERE name LIKE '_ ton'; //_通配符表示單個任意字符。
7.REGEXP子句用於使用正則表達式進行搜索。詳參照正則表達式。索引
8.拼接函數Concat():事務
SELECT Concat(name, '(' , country , ')') AS title FROM vendors ORDER BY name; 查詢結果顯示name 和(country)拼接起來的結果,而且顯示的列標題經過AS起別名爲title
9.SELECT中執行算術計算:
SELECT id,quantity,price*item_price AS price FROM order WHERE order_num = 2005; //讓結果顯示算術運算後的結果並起別名
10.數據處理函數:A.文本處理函數
B.日期和時間處理函數:
C.數值處理函數:
11.彙集函數:
12.GROUP BY子句用於分組數據:
SELECT id, COUNT(*) AS num_prods FROM products GROUP BY id; //按照id進行分組,其中SELECT中出現的出彙集函數之外的列名必須出如今GROUP BY子句中,且GROUP BY不能使用別名。
13.HAVING 子句用於過濾分組:
SELECT id,COUNT(*) AS order FROM order WHERE id > 10 GROUP BY id HAVING COUNT(*) >= 2; //查詢語句先回執行WHERE過濾行數據,再經過GROUP BY分組,接着是HAVING來過濾分組後的組
14.SELECT相關子句書寫順序:SELECT -> FROM -> [WHERE] -> [GROUP BY] -> [HAVING] -> [ORDER BY] -> [LIMIT],其中括號括起來的是非必需的。
15.子查詢,經常使用yu過濾子句中和SELECT的計算字段:
SELECT cust_id FROM orders WHERE order_num IN (SELECT order_num FROM orderitems WHERE pro_id = 'TNT2'); //這裏在WHERE過濾子句中嵌套了一個子查詢,執行順序是先是子查詢查到order_num,而後經過子查詢的order_num過濾外層查詢數據 SELECT cust_name, cust_state, (SELECT COUNT(*) FROM orders WHERE orders.cust_id = customers.cust_id) AS orders FROM customers ORDER BY cust_name; //這裏顯示結果的第三列是來自另一個表的子查詢,而且指定了在子查詢中過濾id等於當前表id的數據。
16.外鍵是某個表中的一列,包含另外一個表的主鍵值,定義了兩個表之間的關係。
17.INNER JOIN內部聯結(也稱等值聯結)實現查詢多個表的數據,來自多個表的數據經過必定的聯結條件聯結起來:
SELECT ven_name , prod_name , prod_price FROM vendors , products WHERE vendors.vend_id = products.vend_id ORDER BY vend_name , prod_name; //查詢來自兩個表vendors和products的數據,而且將數據經過WHERE子句中id相等條件內聯起來,這裏id必定要寫限定全名區分,若不使用內聯結會出現笛卡兒積的結果 SELECT vend_name,prod_name,prod_price FROM vendors INNER JOIN products ON vendors.vend_id = products.vend_id; //查詢效果同上,只不過這裏經過INNER JOIN內聯結,ON後爲內聯結條件。
18.自聯結,即經過當前表和當前表自己進行聯結進行查詢數據:
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';//將同一張表區別名p1和p2,經過vend_id爲條件進行自聯結,因爲追加了p2.prod_id = 'DTNTR'使得p2只有一條數據,所以在自聯結時p1只會過濾爲只含有p2那條數據ven_id的數據。
19.OUTER JOIN外聯結,與內聯結相似,區別就是包括了沒有進行關聯的行:
SELECT customers.cust_id , order.order_num FROM customer LEFT OUTER JOIN orders ON customers.cust_id = orders.cust_id; //在外聯結關鍵字OUTER JOIN前面加LEFT和RIGHT標誌指定包括OUTER JOIN左邊或者右邊的全部行(包括沒進行關聯的,沒進行關聯的數據爲NULL)。
20.UNION組合查詢,將多個查詢語句的結果按行進行組合:
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) ORDER BY vend_id , prod_price; //組合的要求是多個查詢結果的列數量和類型是相兼容的,而且組合會去重複行,要包括重複行使用UNION ALL,組合的結果只能用一個ORDER BY
21.全文本搜索:
//啓用全文搜索 CREATE TABLE productnotes( note_id int NOT NULL AUTO_INCREMENT, prod_id char(10) NOT NULL, note_date datetime NOT NULL, note_text text NULL, PRIMARY KEY(note_id), FULLTEXT(note_text) //對note_text字段開啓全文本搜索支持 )ENGINE = MyISAM //使用MyISAM引擎,由於此引擎支持全文本搜索 //使用全文本搜索 //Match(note_text)即對note_text字段進行全文本搜索,Against('rabbit')指出搜索的關鍵字是'rabbit' SELECT note_text FROM productnotes WHERE Match(note_text) Against('rabbit ');
22.INSERT語句用於插入數據:
INSERT INTO customers VALUES(NULL,'Test','Test1','Test2',99,NULL);//直接插入完整的數據,數據按位入座。但容易寫漏,不安全 INSERT INTO customers (cust_address , cust_city , cust_state , cust_zip , cust_country,cust_contact , cust_email) VALUES('Test','TEST','TEST','TEST','TEST','TEST',NULL,NULL); //插入一行數據的指定列的數據,沒指定的列爲默認爲NULL或默認值。 INSERT INTO customers(cust_id , cust_contact , cust_email , cust_name , cust_address, cust_city , cust_state , cust_zip , cust_country)SELECT cust_id , cust_contact , cust_email , cust_name , cust_address, cust_city , cust_state , cust_zip , cust_country FROM custnew;//將查詢的數據插入
23.UPDATE語句更新數據:
UPDATE customers SET cust_name = 'The Fudds',cust_email = 'elmer@fudd.com' WHERE cust_id 1005; //修改指定行的數據。若不加WHERE會更新全部行的數據
24.DELETE語句刪除數據:
DELETE FROM customers WHERE cust_id = 1005; //刪除指定行的數據,若不加WHERE則刪除全部行數據。
25.CREATE TABLE語句建立表:
//建表關鍵字CREATE TABLE,後面接表名,括號內爲各列的名稱及屬性 CREATE TABLE orderitems( //NOT NULL執行這一列不能爲空,設爲NULL則能夠爲空,DEFAULT指出若這一列若沒賦值則使用默認值,AUTO_INCREMENT指出這一列的數據若沒賦值會根據上一個值自動增長。 order_num int NOT NULL, AUTO_INCREMENT, order_item int NOT NULL, prod_id char(10) NOT NULL DEFAULT 1, quantity int NOT NULL, item_price decimal(8.2) NOT NULL, //設置主鍵 PRIMARY KEY (order_num , order_item) )ENGINE = InnoDB;//選擇使用引擎
26.ALTER TABLE語句更新表:
ALTER TABLE vendors ADD vend_phone CHAR(20) ; //在表中添加一列 ALTER TABLE orders ADD CONSTAINT fk_orders_customers FOREIGN KEY(cust_id) REFERENCES customers(cust_id); //更新表經常使用來添加外鍵約束,這裏添加約束列fk_orders_customers,指出是外鍵cust_id,引用於customers的cust_id列 ALTER TABLE Vendors DROP COLUMN vend_phone; //刪除表中的一列
27.DROP TABLE 刪除表:
DROP TABLE customers2;
28.RENAME TABLE重命名錶:
RENAME TABLE customers2 TO customers;
29.VIEW視圖能夠看做虛擬的表自己不包含任何數據,不能使用索引和觸發器,自己保存一個SQL查詢語句,用於以後的SELECT,簡化查詢操做,複用SQL代碼。
//建立視圖 CREATE VIEW productcustomers AS SELECT cust_name , cust_contact , prod_id FROM customers , orders , orderitems WHERE customers.cust_id = order.cust_id AND orderitems.order_num = orders.order_num; //AS後面保存的就是一個SQL查詢,此視圖就是基於此查詢得出來的虛擬表 //從視圖查詢,直接得出結果而不用在敲上面那麼多代碼 SELECT * FROM productcustomers //刪除視圖 DROP VIEW viewname;
能夠對視圖中的數據進行插入、更新、刪除操做,操做完會修改本來的基類表。
30.存儲過程暫時沒看以後補上
31.遊標暫時沒看以後補上
32.TRIGGER觸發器即某些語句被執行時自動執行一些操做,可使用出發語句有INSERT\DELETE\UPDATE,包括其以前和以後觸發所以一個表最多含有6個觸發器:
CREATE TRIGGER newproduct AFTER INSERT ON products FOR EACH ROW SELECT 'Product added'; //建立的觸發器名是newproduct,出發條件在插入表以後,FOR EACH ROW指出每次插入都觸發,觸發內容就是顯示'Product added'行 CREATE TRIGGER neworder AFTER INSERT ON orders FOR EACH ROW SELECT NEW.order_num; //這裏的NEW.order_num指的是新插入的記錄的order_num字段 CREATE TRIGGER deleteorder BEFORE DELETE ON orders FOR EACH ROW BEGIN INSERT INTO archive_orders(order_num,order_date,cust_id) VALUES(OLD.order_num,OLD.order_date,OLD.cust_id); END; //這裏使用BEGIN和END使得能夠執行多條語句。 DROP TRIGGER newproduct; //刪除觸發器
33.事務處理保證SQL操做要麼執行,要麼徹底不執行:
START TRANSACTION;//開啓事務 ROLLBACK; //回滾操做到開啓事務處,只能在一個事務處理內使用 COMMIT; //提交整個事務操做 SAVEPOINT pos; //使用保留點 ROLLBACK TO pos; //回滾到保留點 SET autocommit = 0; //關閉自動提交行爲