MySQL快速入門

繼惡補了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; //關閉自動提交行爲
相關文章
相關標籤/搜索