MySQL必知必會1

1资昧、MySQL使用

  • 啟動:net start mysql(windows版)

  • 登錄:mysql -u root -p

D:\MySQL\bin>mysql -u root -p
Enter password: ******
  • 查看數(shù)據(jù)庫列表:SHOW DATABASES

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| test               |
+--------------------+
  • 使用數(shù)據(jù)庫:USE test

mysql> use test;
Database changed
  • 獲取一個數(shù)據(jù)庫內的表的列表:SHOW TABLES

mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| user           |
+----------------+
  • 獲取一個表內每個字段的信息:SHOW COLUMNS FROM user

mysql> SHOW COLUMNS FROM user;
+-------+--------------+------+-----+---------+----------------+
| Field | Type         | Null | Key | Default | Extra          |
+-------+--------------+------+-----+---------+----------------+
| id    | int(11)      | NO   | PRI | NULL    | auto_increment |
| name  | varchar(255) | NO   |     | NULL    |                |
| age   | int(11)      | YES  |     | NULL    |                |
+-------+--------------+------+-----+---------+----------------+

2啦膜、檢索數(shù)據(jù)

  • 檢索單個列 SELECT name FROM user

mysql> SELECT name FROM user;
+--------+
| name   |
+--------+
| 小明   |
| 小紅   |
| 小李   |
+--------+

注意
1懦铺、未排序數(shù)據(jù) 如果讀者自己試驗這個查詢稚晚,可能會發(fā)現(xiàn)顯示輸
出的數(shù)據(jù)順序與這里的不同。出現(xiàn)這種情況很正常缝其。如果沒有
明確排序查詢結果(下一章介紹)盗胀,則返回的數(shù)據(jù)的順序沒有特殊意義。
2、SQL語句和大小寫 請注意外遇,SQL語句不區(qū)分大小寫注簿,因此
SELECT 與 select 是相同的。習慣對所有SQL關鍵字使用大寫跳仿,而對所有
列和表名使用小寫诡渴。
3、結束SQL語句 多條SQL語句必須以分號(菲语;)分隔妄辩。

  • 檢索多個列:SELECT name, age FROM user

mysql> SELECT name, age FROM user;
+--------+------+
| name   | age  |
+--------+------+
| 小明   |   12 |
| 小紅   |   16 |
| 小李   |   18 |
+--------+------+
  • 檢索所有列:SELECT * FROM user

mysql> SELECT * FROM user;
+----+--------+------+
| id | name   | age  |
+----+--------+------+
|  1 | 小明   |   12 |
|  2 | 小紅   |   16 |
|  3 | 小李   |   18 |
+----+--------+------+
  • 檢索不同的行:使用 DISTINCT關鍵字,此關鍵字指示MySQL只返回不同的值山上。

mysql> SELECT age FROM user;
+------+
| age  |
+------+
|   12 |
|   16 |
|   18 |
|   18 |
|   16 |
+------+

mysql> SELECT DISTINCT age FROM user;
+------+
| age  |
+------+
|   12 |
|   16 |
|   18 |
+------+
  • 限制結果:使用LIMIT關鍵字

SELECT * FROM user LIMIT 3表示只獲取前面3條恩袱。
SELECT * FROM user LIMIT 2, 2表示返回從第2行開始的2條數(shù)據(jù)。
LIMIT 2 OFFSET 2效果與LIMIT 2, 2一樣胶哲。

mysql> SELECT * FROM user LIMIT 3;
+----+--------+------+
| id | name   | age  |
+----+--------+------+
|  1 | 小明   |   12 |
|  2 | 小紅   |   16 |
|  3 | 小李   |   18 |
+----+--------+------+

mysql> SELECT * FROM user LIMIT 2, 2;
+----+--------+------+
| id | name   | age  |
+----+--------+------+
|  3 | 小李   |   18 |
|  4 | 小南   |   18 |
+----+--------+------+

mysql> SELECT * FROM user LIMIT 2 OFFSET 2;
+----+--------+------+
| id | name   | age  |
+----+--------+------+
|  3 | 小李   |   18 |
|  4 | 小南   |   18 |
+----+--------+------+

注意
1畔塔、行 0 檢索出來的第一行為行0而不是行1。因此鸯屿, LIMIT 1, 1
將檢索出第二行而不是第一行澈吨。
2、在行數(shù)不夠時 LIMIT 中指定要檢索的行數(shù)為檢索的最大行
數(shù)寄摆。如果沒有足夠的行(例如谅辣,給出 LIMIT 10, 5 ,但只有13行)婶恼,MySQL將只返回它能返回的那么多行桑阶。

  • 使用完全限定的表名或數(shù)據(jù)庫名

這條語句在功能上等于SELECT name FROM user。(假定都在test數(shù)據(jù)庫中調用)

mysql> SELECT user.name FROM test.user;
+--------+
| name   |
+--------+
| 小明   |
| 小紅   |
| 小李   |
| 小南   |
| 小狼   |
+--------+

排序檢索數(shù)據(jù)

  • 排序數(shù)據(jù):SELECT * FROM user ORDER BY age

根據(jù)年齡從小到大排序

mysql> SELECT * FROM user ORDER BY age;
+----+--------+------+
| id | name   | age  |
+----+--------+------+
|  1 | 小明   |   12 |
|  2 | 小紅   |   16 |
|  5 | 小狼   |   16 |
|  3 | 小李   |   18 |
|  4 | 小南   |   18 |
+----+--------+------+
  • 按多個列排序: SELECT * FROM user ORDER BY age, name

先根據(jù)年齡排序勾邦,再根據(jù)名稱排序

mysql> SELECT * FROM user ORDER BY age, name;
+----+--------+------+
| id | name   | age  |
+----+--------+------+
|  1 | 小明   |   12 |
|  5 | 小狼   |   16 |
|  2 | 小紅   |   16 |
|  4 | 小南   |   18 |
|  3 | 小李   |   18 |
+----+--------+------+
  • 倒序:DESC關鍵字

mysql> SELECT * FROM user ORDER BY age DESC;
+----+--------+------+
| id | name   | age  |
+----+--------+------+
|  3 | 小李   |   18 |
|  4 | 小南   |   18 |
|  2 | 小紅   |   16 |
|  5 | 小狼   |   16 |
|  1 | 小明   |   12 |
+----+--------+------+

過 濾 數(shù) 據(jù)

  • 使用where子句

檢索所需數(shù)據(jù)需要指定搜索條件蚣录,根據(jù) WHERE 子句中指定的搜索條件能夠對數(shù)據(jù)進行過濾。

mysql> SELECT * FROM user WHERE age = 18;
+----+--------+------+
| id | name   | age  |
+----+--------+------+
|  3 | 小李   |   18 |
|  4 | 小南   |   18 |
+----+--------+------+
  • WHERE子句操作符

操 作 符 說 明
= 等于
!= 不等于
> 大于
>= 大于等于
< 小于
<= 小于等于
BETWEEN 在指定的兩個值之間
  • 檢查單個值

mysql> SELECT * FROM user WHERE name = '小李';
+----+--------+------+
| id | name   | age  |
+----+--------+------+
|  3 | 小李   |   18 |
+----+--------+------+

mysql> SELECT * FROM user WHERE age > 16;
+----+--------+------+
| id | name   | age  |
+----+--------+------+
|  3 | 小李   |   18 |
|  4 | 小南   |   18 |
+----+--------+------+
  • 不匹配檢查

SELECT * FROM user WHERE age != 16;
+----+--------+------+
| id | name   | age  |
+----+--------+------+
|  1 | 小明   |   12 |
|  3 | 小李   |   18 |
|  4 | 小南   |   18 |
+----+--------+------+
  • 范圍檢查

mysql> 
SELECT * FROM user WHERE age BETWEEN 14 AND 18;
+----+--------+------+
| id | name   | age  |
+----+--------+------+
|  2 | 小紅   |   16 |
|  3 | 小李   |   18 |
|  4 | 小南   |   18 |
|  5 | 小狼   |   16 |
+----+--------+------+
  • 空值檢查

mysql> SELECT * FROM user WHERE age IS NULL;
+----+--------+------+
| id | name   | age  |
+----+--------+------+
|  6 | 空我   | NULL |
+----+--------+------+

注意:
1眷篇、在創(chuàng)建表時萎河,表設計人員可以指定其中的列是否可以不包含值。在
一個列不包含值時蕉饼,稱其為包含空值 NULL 虐杯。
2、NULL 無值(no value)昧港,它與字段包含 0 擎椰、空字符串或僅僅包含
空格不同。
3创肥、NULL 與不匹配 在通過過濾選擇出不具有特定值的行時达舒,你
可能希望返回具有 NULL 值的行值朋。但是,不行休弃。因為未知具有
特殊的含義,數(shù)據(jù)庫不知道它們是否匹配圈膏,所以在匹配過濾或不匹配過濾時不返回它們塔猾。

  • 組合 WHERE 子句

邏輯操作符(logical operator),用來聯(lián)結或改變 WHERE 子句中的子句的關鍵
字稽坤。
1丈甸、AND操作符
篩選出年齡大于16并且姓名不等于"小南"的數(shù)據(jù)

mysql> SELECT * FROM user WHERE age > 16 AND name != '小南';
+----+--------+------+
| id | name   | age  |
+----+--------+------+
|  3 | 小李   |   18 |
|  7 | 大飛   |   23 |
+----+--------+------+

2、OR操作符
篩選出年齡等于16或18的數(shù)據(jù)

mysql> SELECT * FROM user WHERE age = 16 or age = 18;
+----+--------+------+
| id | name   | age  |
+----+--------+------+
|  2 | 小紅   |   16 |
|  3 | 小李   |   18 |
|  4 | 小南   |   18 |
|  5 | 小狼   |   16 |
|  9 | 杰瑞   |   16 |
+----+--------+------+

計算次序
AND操作符的優(yōu)先級高于OR尿褪,使用圓括號明確地分組相應的操作符睦擂。

mysql> SELECT * FROM user WHERE age = 16 or age = 18 AND age > 16;
+----+--------+------+
| id | name   | age  |
+----+--------+------+
|  2 | 小紅   |   16 |
|  3 | 小李   |   18 |
|  4 | 小南   |   18 |
|  5 | 小狼   |   16 |
|  9 | 杰瑞   |   16 |
+----+--------+------+

mysql> SELECT * FROM user WHERE (age = 16 or age = 18) AND age > 16;
+----+--------+------+
| id | name   | age  |
+----+--------+------+
|  3 | 小李   |   18 |
|  4 | 小南   |   18 |
+----+--------+------+

3、IN 操作符
下面語句等同于SELECT * FROM user WHERE age = 18 OR age = 30杖玲。

mysql> SELECT * FROM user WHERE age in (18, 30) ;
+----+--------+------+
| id | name   | age  |
+----+--------+------+
|  3 | 小李   |   18 |
|  4 | 小南   |   18 |
+----+--------+------+

4顿仇、NOT 操作符

mysql> SELECT * FROM user WHERE age NOT IN (18, 16);
+----+--------+------+
| id | name   | age  |
+----+--------+------+
|  1 | 小明   |   12 |
|  7 | 大飛   |   23 |
|  8 | 杰克   |   15 |
+----+--------+------+

用通配符進行過濾

LIKE 操作符

通配符(wildcard) 用來匹配值的一部分的特殊字符。

1摆马、百分號( % )通配符

  • 最常使用的通配符是百分號( % )臼闻。% 表示任何字符出現(xiàn)任意次數(shù)(包括0次)。
  • SELECT * FROM user WHERE name LIKE 'to%'囤采。此例子使用了搜索模式 'to%'述呐。在執(zhí)行這條子句時,將檢索任意以 to 起頭的詞蕉毯。 % 告訴MySQL接受 to 之后的任意字符乓搬,不管它有多少字符。
  • 搜索模式'%uc%' 表示匹配任何位置包含文本uc的值代虾,而不論它之前或之后出現(xiàn)什么字符进肯。
mysql> SELECT * FROM user WHERE name LIKE 'to%';
+----+------+------+
| id | name | age  |
+----+------+------+
| 10 | tom  |   22 |
| 12 | tony |   31 |
+----+------+------+

mysql> SELECT * FROM user WHERE name LIKE '%uc%';
+----+------+------+
| id | name | age  |
+----+------+------+
| 11 | duck |   13 |
| 13 | puck |   11 |
+----+------+------+

** 注意NULL** 雖然似乎 % 通配符可以匹配任何東西,但有一個例外棉磨,即 NULL 坷澡。

下劃線_通配符

另一個有用的通配符是下劃線_。下劃線的用途與 % 一樣含蓉,但下劃
線只匹配單個字符而不是多個字符频敛。

mysql> SELECT * FROM user WHERE name LIKE 'to__';
+----+------+------+
| id | name | age  |
+----+------+------+
| 12 | tony |   31 |
+----+------+------+

mysql> SELECT * FROM user WHERE name LIKE 'to_';
+----+------+------+
| id | name | age  |
+----+------+------+
| 10 | tom  |   22 |
+----+------+------+

用正則表達式進行搜索

  • 基本字符匹配

.) 是正則表達式語言中一個特殊的字符。它表示匹配任意一個字符馅扣。

mysql>  SELECT * FROM user WHERE name REGEXP 'duc';
+----+------+------+
| id | name | age  |
+----+------+------+
| 11 | duck |   13 |
+----+------+------+

mysql> SELECT * FROM user WHERE name REGEXP '.uc';
+----+------+------+
| id | name | age  |
+----+------+------+
| 11 | duck |   13 |
| 13 | puck |   11 |
+----+------+------+
  • 進行OR匹配

mysql> SELECT * FROM user WHERE name REGEXP 'duc|puc';
+----+------+------+
| id | name | age  |
+----+------+------+
| 11 | duck |   13 |
| 13 | puck |   11 |
+----+------+------+
  • 匹配幾個字符之一

mysql> SELECT * FROM user WHERE name REGEXP '[p|o]ple';
+----+--------+------+
| id | name   | age  |
+----+--------+------+
| 14 | apple  |   31 |
| 15 | people |   12 |
+----+--------+------+

mysql> SELECT * FROM user WHERE name REGEXP '[po]ple';
+----+--------+------+
| id | name   | age  |
+----+--------+------+
| 14 | apple  |   31 |
| 15 | people |   12 |
+----+--------+------+

[] 是另一種形式的 OR 語句斟赚。事實上,正則表達式 [po]ple[p|o]ple的縮寫差油,也可以使用后者拗军。

  • 匹配范圍

集合可用來定義要匹配的一個或多個字符任洞。例如,下面的集合將匹配數(shù)字0到9:[0123456789]发侵。為簡化這種類型的集合交掏,可使用 - 來定義一個范圍。[0-9]上等同于上述數(shù)字列表刃鳄。
此外盅弛,范圍不一定只是數(shù)值的, [a-z] 匹配任意字母字符叔锐。

mysql> SELECT * FROM user WHERE name REGEXP '路人[A-Z]';
+----+---------+------+
| id | name    | age  |
+----+---------+------+
| 16 | 路人A   |   42 |
| 17 | 路人B   |   42 |
| 18 | 路人C   |   42 |
+----+---------+------+

匹配特殊字符

\\為轉義字符挪鹏。如.表示匹配任意一個字符。若想匹配.本身愉烙,則需要轉移字符讨盒,即\\.表示匹配.。正則表達式內具有特殊意義的所有字符都必須以這種方式轉義步责。

匹配\ 為了匹配反斜杠(\)字符本身返顺,需要使用 \\\

  • 匹配字符類

說明
[:alnum:] 任意字母和數(shù)字(同[a-zA-Z0-9])
[:alpha:] 任意字符(同[a-zA-Z])
[:blank:] 空格和制表(同[\t])
[:digit:] 任意數(shù)字(同[0-9])
[:lower:] 任意小寫字母(同[a-z])
[:upper:] 任意大寫字母(同[A-Z])
[:space:] 包括空格在內的任意空白字符(同[\f\n\r\t\v])
  • 匹配多個實例

元字符 說明
* 0個或多個匹配
+ 1個或多個匹配(等于{1,})
? 0個或1個匹配(等于{0,1}
{n} 指定數(shù)目的匹配
{n,} 不少于指定數(shù)目的匹配
{n,m} 匹配數(shù)目的范圍(m不超過255)
mysql> SELECT * FROM user WHERE name REGEXP '數(shù)字[0-9]{5}';
+----+-------------+------+
| id | name        | age  |
+----+-------------+------+
| 19 | 數(shù)字12133   |   12 |
+----+-------------+------+

mysql> SELECT * FROM user WHERE name REGEXP '數(shù)字[:digit:]*';
+----+-------------+------+
| id | name        | age  |
+----+-------------+------+
| 19 | 數(shù)字12133   |   12 |
| 20 | 數(shù)字422     |   12 |
+----+-------------+------+
  • 定位符

元字符 說明
^ 文本的開始
$ 文本的結尾
mysql> SELECT * FROM user WHERE name REGEXP '[0-9]+';
+----+-------------+------+
| id | name        | age  |
+----+-------------+------+
| 19 | 數(shù)字12133   |   12 |
| 20 | 數(shù)字422     |   12 |
| 21 | 13131       |   31 |
| 22 | 3636ABC     |   32 |
+----+-------------+------+

mysql> SELECT * FROM user WHERE name REGEXP '^[0-9]+$';
+----+-------+------+
| id | name  | age  |
+----+-------+------+
| 21 | 13131 |   31 |
+----+-------+------+

^ 的雙重用途 ^ 有兩種用法蔓肯。在集合中(用 [ 和 ] 定義)创南,用它來否定該集合,否則省核,用來指串的開始處稿辙。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市气忠,隨后出現(xiàn)的幾起案子邻储,更是在濱河造成了極大的恐慌,老刑警劉巖旧噪,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吨娜,死亡現(xiàn)場離奇詭異,居然都是意外死亡淘钟,警方通過查閱死者的電腦和手機宦赠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來米母,“玉大人勾扭,你說我怎么就攤上這事√鳎” “怎么了妙色?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長慧耍。 經(jīng)常有香客問我身辨,道長丐谋,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任煌珊,我火速辦了婚禮号俐,結果婚禮上,老公的妹妹穿的比我還像新娘定庵。我一直安慰自己吏饿,他們只是感情好,可當我...
    茶點故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布洗贰。 她就那樣靜靜地躺著找岖,像睡著了一般陨倡。 火紅的嫁衣襯著肌膚如雪敛滋。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天兴革,我揣著相機與錄音绎晃,去河邊找鬼。 笑死杂曲,一個胖子當著我的面吹牛庶艾,可吹牛的內容都是我干的。 我是一名探鬼主播擎勘,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼咱揍,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了棚饵?” 一聲冷哼從身側響起煤裙,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎噪漾,沒想到半個月后硼砰,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡欣硼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年题翰,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片诈胜。...
    茶點故事閱讀 40,137評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡豹障,死狀恐怖,靈堂內的尸體忽然破棺而出焦匈,到底是詐尸還是另有隱情沼填,我是刑警寧澤,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布括授,位于F島的核電站坞笙,受9級特大地震影響岩饼,放射性物質發(fā)生泄漏。R本人自食惡果不足惜薛夜,卻給世界環(huán)境...
    茶點故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一籍茧、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧梯澜,春花似錦寞冯、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至咆疗,卻和暖如春漓帚,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背午磁。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工尝抖, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人迅皇。 一個月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓昧辽,卻偏偏與公主長得像,于是被迫代替她去往敵國和親登颓。 傳聞我的和親對象是個殘疾皇子搅荞,可洞房花燭夜當晚...
    茶點故事閱讀 45,086評論 2 355