MySQL 基礎學習筆記

一、關鍵字DISTINCT是做用在全部列上的而不只僅是前置它的列。mysql

二、DESC關鍵字:若是想在多個列中進行降序排列,必須對每一個列指定DESC關鍵字。 如:正則表達式

SELECT * FROM table t ORDER BY t.a DESC, t.b DESC, t.c DESC;

三、MySQL在執行匹配時不區分大小寫。如WHERE t.name=」fuses」,能夠找到fuses、Fuses、fUses等。sql

四、MySQL在搜索匹配(用LIKE和通配符搜索匹配)時,區分大小寫。好比:LIKE ’jet%’ 不能匹配到 JetP、jEtPAAA等。安全

五、BETWEEN AND 是開區間。函數

六、SQL中,AND關鍵字的優先級比OR要高,因此會優先計算,要改變優先級,能夠用小括號。sqlserver

七、MySQL中的NOT : MySQL支持使用NOT對IN、BEWTEEN 和 EXSTS 字句取反,這與大多數其它DBMS容許使用NOT對各類條件取反有很大區別。性能

八、AVG()、COUNT()、MIN()、 MAX()忽略NULL行。code

九、爲在搜索子句中使用通配符,必須使用LIKE關鍵字。LIKE指示MySQL後面的搜索模式利用通配符匹配而不是直接相等匹配進行比較。server

十、通配符 (1) % :匹配任何字符出現任意次數。注意%匹配不了NULL;即便使用:select * from user where password LIKE '%',也匹配不了NULL,這個能夠語句會報錯。 (2) _ (下劃線):匹配一個字符(不能多也不能少)。排序

十一、MySQL與正則表達式結合使用,使用關鍵字REGEXP,如:

select * from user where password REGEXP '0';

十二、LIKE和REGEXP的區別: (1)LIKE匹配整個列; (2)REGEXP在列值內進行匹配; (3)LIKE匹配整個串而REGEXP匹配子串;

1三、注意:MySQL 中的正則表達式匹配(自從3.23.4後)不區分大小寫!!爲了區分大小寫,可使用BINARY關鍵字,如WHERE p.a REGEXP BINARY ‘hiSaaS’;

1四、多數正則表達式實現使用單個反斜槓(\)轉義特殊字符,以便能使用這些字符自己。但MySQL中要求使用兩個反斜槓(MySQL解析一個,正則表達式解析另一個)。

1五、正則中「^」有兩種用途: (1)用在「[ ]」裏面,表示對裏面的集合的否認; (2)不然,用做定位符,表示串的開始處。

1六、GROUP BY: (1)若是分組中有NULL值,則將NULL做爲一個分組; (2)GROUP BY必須在WHERE以後,ORDER BY以前分組。

1七、WHERE 和 HAVING的區別: (1)WHERE過濾行,HAVING過濾分組,全部的WHERE均可以由HAVING支持; (2)WHERE在數據分組前過濾,HAVING在數據分組後過濾。

1八、SELECT子句的順序: SELECT、 FROM、 WHERE、 GROUNP BY、 HAVING、 ORDER BY、 LIMIT

1九、應該保證全部聯結(如WHERE:a.id = b.id )都有WHERE子句,不然返回的是笛卡爾積的鏈接類型。

20、聯結(如WHERE:a.id = b.id )的表越多,性能越低。

2一、組合查詢: (1)有兩種兩狀況須要使用組合查詢的:

  • 在單個查詢中從不一樣的表返回相似結構的數據;
  • 對單個表執行多個查詢,按單個查詢返回數據; (2)UNION幾乎老是完成與多個WHERE條件相同的工做。 (3)UNION是默認對總結果去重的,若是須要返回全部不去重的結果,可使用UNION ALL。 (4)UNION的使用規則:
  • UNION必須由兩條或者兩條以上的SELECT語句組成,語句之間用關鍵字UNION分隔。
  • UNIION中的每一個查詢必須包含相同的列、表達式或者聚合函數,不過各個列不須要以相同的次序出列出。
  • 列數據必須兼容:類型沒必要徹底相同,但必須是DBMS能夠隱含的轉換的類型(例如:不一樣的數值類型或 不一樣的日期類型)。
  • 用UNION組合查詢時,只能用一條ORDER BY 對總結果排序(不能單獨對某個SELECT語句排序),ORDRE BY必須出如今最後一條SELECT語句以後。

2二、如何在使用AUTO_INCREMENT列時得到這個值?可以使用last_insert_id()函數得到這個值,如 SELECT last_insert_id();

2三、外鍵不能跨引擎。外鍵(用於強制實施引用完整性)不能跨引擎,即便用同一個引擎的表不能引用具備使用不一樣引擎的表的外鍵。

2四、全文本搜索 引擎MyISAM支持全文本搜索,而InnoDB不支持。 (1)啓動全文搜索支持,使用FULLTEXT:

CREATE TABLE `productnotes` (
  `note_id` int(11) NOT NULL AUTO_INCREMENT,
  `prod_id` int(11) DEFAULT NULL,
  `note_date` datetime DEFAULT NULL,
  `note_text` text,
  PRIMARY KEY (`note_id`),
  FULLTEXT KEY `note_text` (`note_text`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

(2)能夠在建立表時指定全文搜索(FULLTEXT),也能夠在建好後稍後指定數據。不要在導入數據時使用FULLTEXT,由於更新索引須要花時間。 (3)全文搜索不區分大小寫。 (4)使用方式:

SELECT
	note_text,
	MATCH (note_text) AGAINST ('rabbit') AS rank
FROM
	productnotes;

(5)查詢擴展:利用查詢擴展能夠找出可能相關的結果,即便它們並不精確包括所查找的詞,用法:

SELECT
	note_text,
	MATCH (note_text) AGAINST ('rabbit' WITH QUERY EXPANSION) AS rank
FROM
	productnotes;

(6)布爾文本搜索方式(更加細緻的查找控制):

SELECT
	note_text,
	MATCH (note_text) AGAINST ('rabbit' IN BOOLEAN MODE) AS rank
FROM
	productnotes;

2五、插入語句: (1)能夠在INSERT INTO之間添加關鍵字LOW_PRIORITY,指示MySQL下降INSERT語句的優先級,以提升總體性能,以下:

INSERT  LOW_PRORITY INTO

(2)INSERT SELECT 語句用法(插入檢索出的數據):

INSERT INTO productnotes(prod_id) SELECT product.code FROM product;

2六、更新語句: (1)在UPDATE語句中使用SELECT子查詢:

UPDATE productnotes p, (SELECT product.num, product.id FROM product ) temp SET p.note_text=temp.num WHERE temp.id = p.prod_id;
  •  注意點:
  • 在mysql中更新時不能將更新的表做爲查詢的表。
  • update 時,更新的表不能在set和where中用於子查詢;
  • update 時,能夠對多個表進行更新(sqlserver不行);          如:update ta a,tb b set a.Bid=b.id ,b.Aid=a.id;  
  • update 後面能夠作任意的查詢,這個做用等同於from; (2)在用UPDATE語句更新多行,而且更新這些行的一行或者多行時出現一個錯誤,則整個UPDATE操做被取消(錯誤發生前更新的全部行被恢復到它們原來的值)。但若是使用了IGNORE關鍵字,即便發生錯誤,也能夠繼續更新,以下使用:
UPDATE IGNORE product SET ……

2七、刪除語句DELECT:

  • 刪除行,但不刪除表自己;
  • 更快的刪除:TRUNCATE table:它實際上刪除了原來的表,並從新建立一個表,而不是逐條刪除,速度更快;

2八、ALTER TABLE的一種常見用途是定義外鍵,如:

ALTER TABLE orderitems ADD CONSTRAINT fk_orderitems_products FOREIGN KEY( order_num ) REFERENCES orders(order_num);

2九、視圖的規則和限制 (1)與表同樣,視圖必須惟一命名(且不能與表名相同)。 (2)對於能夠建立的視圖數目沒有限制。 (3)爲了建立視圖,必須具體足夠的訪問權限。 (4)視圖能夠嵌套,便可以利用從其它視圖中檢索數據的查詢來構造一個視圖。 (5)ORDER BY能夠在視圖中,但若是從該視圖檢索數據的SELECT語句中也含有ORDER BY,那麼該視圖中的ORDER BY將被覆蓋。 (6)視圖不能索引,也不能有關聯的觸發器或者默認值。 (7)視圖能夠和表一塊兒使用。

30、存儲過程

  • 優勢: (1)經過把處理封裝在容易使用的單元中,簡化複雜的操做。 (2)因爲不要求反覆創建一系列處理步驟,保證了數據的完整性。 (3)簡化對變更的管理。若是表名、列名或者業務邏輯有變化,只須要更改存儲過程的代碼。使用它的人不須要知道它的變化。 (4)提升性能。由於使用存儲過程比使用單獨的SQL語句要快。 (5)存在一些只能用在單個請求中的MySQL元素和特性,存儲過程可使用它們來編寫功能更靈活的代碼。
  • 缺點: (1)存儲過程的編寫比基本SQL語句複雜,編寫存儲過程須要更高的技能,更豐富的經驗。 (2)建立存儲過程須要安全訪問權限。須要管理員授予權限。

3一、不像大多的DBMS,MySQL遊標只能用於存儲過程(和函數)。

3二、一個使用觸發器後的實際例子:在插入數據後,返回剛插入數據的id。 觸發器的寫法例子:

CREATE TRIGGER neworder_tri ALTER INSERT ON orders FOR EACH ROW SELECT NEW.order_num;
3三、MySQL是默認自動提交全部更改的,若是須要修改則使用:SET autocommit = 0;

3四、校對在對用ORDER BY子句檢索出來的數據排序時起重要的做用。若是你須要用與建立表時不一樣的校對順序排序特定的SELECT語句,能夠在SELECT語句自身中進行:

SELECT * FROM customers ORDER BY lastname, firstname COLLATE latin1_general_cs;

解釋:latin1_general_cs是一種檢驗,其中COLLATE是使用校驗的關鍵字。

3五、COLLATE除了使用在SELECT裏面,還能夠用於GROUP BY、HAVING、彙集函數、別名等。

3六、建立用戶帳戶: CREAT USER ben IDENTIFIED BY ‘password’; 解釋:IDENTIFIED BY ‘password’表示給用戶一個口令。

3七、官網資料:https://dev.mysql.com/doc/

相關文章
相關標籤/搜索