前言
圖為知乎某答主的高分答案朝蜘,私以為很有道理假褪,于是乎奔《MySQL 必知必會(huì)的》而來~
一、基礎(chǔ)知識(shí)
1.了解數(shù)據(jù)庫
數(shù)據(jù)庫(database):保存有組織的數(shù)據(jù)的容器
表(table):某種特定類型數(shù)據(jù)的結(jié)構(gòu)化清單
模式(schema):關(guān)于數(shù)據(jù)庫和表的布局及特性的信息
列(column):表中的一個(gè)字段哪痰。所有表都是由一個(gè)或多個(gè)列組成的
數(shù)據(jù)類型((datatype):所容許的數(shù)據(jù)類型。每個(gè)列表都有相應(yīng)的數(shù)據(jù)類型久妆,它限制該列中存儲(chǔ)的數(shù)據(jù)晌杰。
行(row):表中的一個(gè)記錄
主鍵(primary key):一列(或一組列),其值能夠唯一區(qū)分表中每個(gè)行筷弦。唯一標(biāo)識(shí)表中每行的這個(gè)列稱為主鍵肋演。應(yīng)該總是定義主鍵。
表中的任何列都可以作為主鍵烂琴,只要它滿足以下條件(定義主鍵規(guī)則):
1)任意兩行都不具有相同的主鍵值
2)每個(gè)行都必須具有一個(gè)主鍵值(主鍵列不允許NULL值)
2.DBMS
DBMS可分為兩類:①基于共享文件系統(tǒng)的DBMS ②基于客戶機(jī)-服務(wù)器的DBMS爹殊。
MySQL是一個(gè)客戶機(jī)-服務(wù)器DBMS。
3.選擇數(shù)據(jù)庫
USE關(guān)鍵字奸绷,如下:
輸入U(xiǎn)SE crashcourse
輸出Database changed //表明數(shù)據(jù)庫選擇成功后顯示
4.了解數(shù)據(jù)庫和表
SHOW命令可以顯示數(shù)據(jù)庫梗夸,表,列健盒,用戶绒瘦,權(quán)限等信息
SHOW DATABASES;//返回?cái)?shù)據(jù)庫的一個(gè)列表称簿。
SHOW TABLES;//返回當(dāng)前選擇的數(shù)據(jù)庫內(nèi)可用的列表
SHOW COLUMNS FROM curtomers;//給出指定表名的列信息
SQL語句不區(qū)分大小寫
二、檢索數(shù)據(jù)
- SELECT語句
SELECT prod_name FROM products;//檢索單個(gè)列
SELECT prod_id, prod_name,prod_price FROM products;//檢索多個(gè)列
SELECT * FROM proucts惰帽;//檢索所有列
2.mysql> SELECT DISTINCT vend_id FROM products;//檢索不同的行憨降,DISTINCT關(guān)鍵字必須直接放在列名的前面。
3.使用LIMIT限制結(jié)果:
mysql> SELECT prod_name FROM products LIMIT 5;//限制輸出不多于5行
mysql> SELECT prod_name FROM products LIMIT 5,5;//從行5開始的5行
=SELECT prod_name FROM products LIMIT 5 OFFSET 5;
注意索引都是從0開始该酗,所以LIMIT1授药,1是從2行而不是第一行開始
4.完全限定的表名
SELECT products.prod_name FROM crashcourse.products;
三、排序檢索數(shù)據(jù)
1.** 排序數(shù)據(jù)**
ORDER BY
SELECT prod_name FROM products ORDER BY prod_name; //排序檢索
SELECT prod_id,prod_price,prod_name FROM products ORDER BY prod_price,prod_name;//按多個(gè)列排序
2.** 指定排序方向**
DESC降序 ** ASC升序**
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 DESC;//多個(gè)列降序
3.使用ORDER BY與LIMIT的組合能找出最高或最低值
SELECT prod_price FROM products ORDER BY prod_price DESC LIMIT 1;//獲取最昂貴的價(jià)格
四呜魄、過濾數(shù)據(jù)
1.使用WHERE子句
SELECT prod_name FROM products WHERE prod_price = 2.5;//只返回prod_price值為2.5的行
WHERE子句的位置:應(yīng)該在ORDER BY之前
2.WHERE子句操作符:
=悔叽,<>(不等于),!=(不等于), <,<=, >, >=, BETWEEN(在指定的兩個(gè)值之間)
SELECT prod_name,prod_price FROM products WHERE prod_price BETWEEN 3 AND 10;
3.空值檢查
在創(chuàng)建表時(shí),表設(shè)計(jì)人員可以指定其中的列是否可以不包含值爵嗅。在一個(gè)列不包含值時(shí)娇澎,稱其為包含空值NULL。IS NULL子句來檢查具有NULL值的列
輸入SELECT prod_name FROM products WHERE prod_price IS NULL;
輸出Empty set (0.00 sec) //說明價(jià)格必須非空
五睹晒、數(shù)據(jù)過濾
1.組合WHERE子句
MySQL允許給出多個(gè)WHERE子句趟庄,這些子句以兩種方式組合:AND和OR
1.1 AND操作符
SELECT prod_id,prod_price,prod_name FROM products WHERE vend_id=1003 AND prod_price <=10;//兩個(gè)條件都要滿足
1.2 OR操作符
SELECT prod_id,prod_price,prod_name FROM products WHERE vend_id=1003 OR vend_id = 1002;//兩個(gè)條件滿足一個(gè)就可以
1.3計(jì)算次序
SELECT prod_id,prod_price,prod_name FROM products WHERE vend_id=1003 OR vend_id = 1002 AND prod_price>=10;//AND操作符優(yōu)先級(jí)高于OR
所以上面理解為:由供應(yīng)商1002制造的任何價(jià)格為10美元以上的產(chǎn)品,或者由供應(yīng)商1003制造的任何產(chǎn)品伪很,而不管價(jià)格如何
SELECT prod_id,prod_price,prod_name FROM products WHERE (vend_id=1003 OR vend_id = 1002) AND prod_price>=10;//()優(yōu)先級(jí)最高
上面語句理解為:價(jià)格在10美元以上且有由1002或1003制造的所有產(chǎn)品
-
IN操作符
IN操作符用來指定條件范圍戚啥,其作用于OR操作符相當(dāng),但更清楚直觀锉试,而且可以包含其他SELECT語句猫十,是的能夠更動(dòng)態(tài)的建立where子句。
SELECT prod_price,prod_name FROM products WHERE vend_id IN (1001呆盖,1002,1003) ORDER BY prod_name;
3.** NOT操作符**
NOT操作符:否定它之后所跟的任何條件拖云。
SELECT prod_price,prod_name FROM products WHERE vend_id NOT IN(1002,1003,1001) ORDER BY prod_name;
六、通用配符進(jìn)行過濾
- LIKE操作符
通配符(wildcard):用來匹配值的一部分的特殊字符
搜索模式(searchpattern):由字面值絮短、通配符或兩者組合構(gòu)成的搜索條件(可以區(qū)分大小寫)
LIKE指示MySQL江兢,后跟的搜索模式利用通配符匹配而不是直接相等匹配進(jìn)行比較
1.1 百分號(hào)(%)通配符
%表示任何字符出現(xiàn)任意次數(shù),但不能匹配NULL
SELECT prod_price,prod_name FROM products WHERE prod_name LIKE'JET%';
SELECT prod_price,prod_name FROM products WHERE prod_name LIKE'%ANVIL%';
%代表搜索模式中給定位置的0個(gè)丁频、1個(gè)或者多個(gè)字符杉允。
1.2下劃線(_)通配符
下劃線只匹配單個(gè)字符
2.通配符技巧
1)不要過度使用通配符
2)把通配符放在開始處,搜索速度最慢
七席里、用正則表達(dá)式進(jìn)行搜索
正則表達(dá)式是用來匹配文本的特殊的串(字符集合)叔磷。
1.使用mysql正則表達(dá)式
基本字符匹配
SELECT prod_name FROM products WHERE prod_name REGEXP '.000' ORDER BY prod_name;
+--------------+
| prod_name |
+--------------+
| JetPack 1000 |
| JetPack 2000 |
+--------------+
上面語句使用了正則表達(dá)式.000。.是正則表達(dá)式語言中一個(gè)特殊的字符奖磁。他表示匹配任意一個(gè)字符改基,因此,1000和2000都匹配且返回咖为。
正則表達(dá)式匹配不區(qū)分大小寫秕狰,要區(qū)分大小寫可以在REGEXP后面使用BINARY關(guān)鍵字稠腊。
2.進(jìn)行or匹配
SELECT prod_name FROM products WHERE prod_name REGEXP '1000 | 2000';
這里的|是正則表達(dá)式的OR操作符
3.匹配幾個(gè)字符之一
SELECT prod_name FROM products WHERE prod_name REGEXP '[123] Ton' ORDER BY prod_name;
這里的[123]表示匹配1或2或3鸣哀。
4.匹配范圍
SELECT prod_name FROM products WHERE prod_name REGEXP '[1-5] Ton';
這里[1-5]定義了一個(gè)范圍
5.匹配特殊字符
SELECT vend_name FROM vendors WHERE vend_name REGEXP '\.' ORDER BY vend_name;
為了匹配特殊字符架忌,必須用[\為前導(dǎo)]
\-表示-
\.表示.
\\表示
\f表示換頁
\n表示換行
\r表示回車
\t表示制表
\v表示縱向制表
6.匹配字符類
7.匹配多個(gè)實(shí)例
看下面兩個(gè)例子:
SELECT prod_name FROM products WHERE prod_name REGEXP '\([0-9] sticks?\)' ORDER BY prod_name;//結(jié)果如下
+----------------+
| prod_name |
+----------------+
| TNT (1 stick) |
| TNT (5 sticks) |
+----------------+
正則表達(dá)式[\([0-9]sticks?\]需要說明一下。\(匹配(我衬,[0-9]匹配任意數(shù)字(這個(gè)例子中為1和5)叹放,sticks?匹配stick和sticks(s后的?使s可選挠羔,因?yàn)榫觯科ヅ渌懊娴娜魏巫址?次或1次出現(xiàn)),\)匹配破加。
SELECT prod_name FROM products WHERE prod_name REGEXP '[[:digit:]]{4}' ORDER BY prod_name;
+--------------+
| prod_name |
+--------------+
| JetPack 1000 |
| JetPack 2000 |
+--------------+
2 rows in set (0.00 sec)
[[:digit:]]{4}中{4}要求它前面的字符(任意數(shù)字)出現(xiàn)四次俱恶,所以[[:digit:]]{4}表示連在一起的任意4位數(shù)
8.定位符
^ 文本的開始
$ 文本的結(jié)尾
[[:<:]] 詞的開始
[[:>:]] 詞的結(jié)尾
SELECT prod_name FROM products WHERE prod_name REGEXP '^[0-9\.]' ORDER BY prod_name;
^[0-9\.]表示只在.或任意數(shù)字為串中第一個(gè)字符時(shí)才匹配它們。
^的雙重用途
①用在[]里表示否定該集合拌喉,②用來指串的開始處速那。