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