1、簡介
這篇博客將會非常基礎,如果有MySQL
經驗的可以跳過,寫這篇博客的原因是給初學者看的。下面將會講解如何使用select查看指定表的單個列、多個列以及全部列。
首先準備一張表,表結構如下所示:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- ---------------------------- -- Table structure for user -- ---------------------------- DROP TABLE IF EXISTS ` user `; CREATE TABLE ` user ` ( `id` bigint (20) NOT NULL AUTO_INCREMENT COMMENT '主鍵' , ` name ` varchar (255) NOT NULL COMMENT '用戶名' , `age` int (11) NOT NULL COMMENT '年齡' , `sex` smallint (6) NOT NULL COMMENT '性別' , PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8; |
表數據如下所示:
1
2
3
4
5
6
7
8
|
INSERT INTO ` user ` VALUES (1, '李子捌' , 18, 1); INSERT INTO ` user ` VALUES (2, '張三' , 22, 1); INSERT INTO ` user ` VALUES (3, '李四' , 38, 1); INSERT INTO ` user ` VALUES (4, '王五' , 25, 1); INSERT INTO ` user ` VALUES (5, '六麻子' , 13, 0); INSERT INTO ` user ` VALUES (6, '田七' , 37, 1); SET FOREIGN_KEY_CHECKS = 1; |
注意在MySQL4.1
之后,數據庫關鍵字是完全不區分大小寫;數據庫名、表名、列名默認不區分大小寫,但是可以修改(不建議修改)。
2、select
2.1 查詢單個列
首先使用use
指定需要操作的數據庫。
1
2
|
mysql> use liziba; Database changed |
接著使用select
從user
表中查詢name
列,select
緊跟著列名稱,from
后面緊跟著表名稱。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
select column_name from table_name; mysql> select name from user ; + --------+ | name | + --------+ | 李子捌 | | 張三 | | 李四 | | 王五 | | 六麻子 | | 田七 | + --------+ 6 rows in set (0.00 sec) |
2.2 查詢多個列
查詢多個列和單個列的區別在于,select后面緊跟多個列名,用英文逗號分割即可。
select column_name1,column_name2,column_name3 from table_name;
1
2
3
4
5
6
7
8
9
10
11
12
|
mysql> select name ,age from user ; + --------+-----+ | name | age | + --------+-----+ | 李子捌 | 18 | | 張三 | 22 | | 李四 | 38 | | 王五 | 25 | | 六麻子 | 13 | | 田七 | 37 | + --------+-----+ 6 rows in set (0.00 sec) |
2.3 查詢所有列
查詢所有列有兩種方式,第一種是上面兩種推導出的方式,列出所有的列名。
1
2
3
4
5
6
7
8
9
10
11
12
|
mysql> select id, name ,age,sex from user ; + ----+--------+-----+-----+ | id | name | age | sex | + ----+--------+-----+-----+ | 1 | 李子捌 | 18 | 1 | | 2 | 張三 | 22 | 1 | | 3 | 李四 | 38 | 1 | | 4 | 王五 | 25 | 1 | | 5 | 六麻子 | 13 | 0 | | 6 | 田七 | 37 | 1 | + ----+--------+-----+-----+ 6 rows in set (0.00 sec) |
第二種,也是部分程序員使用的最多的一句SQL
,使用 *** 通配符**代替表的所有列。
select * from table_name;
1
2
3
4
5
6
7
8
9
10
11
12
|
mysql> select * from user ; + ----+--------+-----+-----+ | id | name | age | sex | + ----+--------+-----+-----+ | 1 | 李子捌 | 18 | 1 | | 2 | 張三 | 22 | 1 | | 3 | 李四 | 38 | 1 | | 4 | 王五 | 25 | 1 | | 5 | 六麻子 | 13 | 0 | | 6 | 田七 | 37 | 1 | + ----+--------+-----+-----+ 6 rows in set (0.00 sec) |
提示:是程序員使用的大忌, 如果我們不需要獲取表的所有列且表的列名是移植的,就不應該使用查詢全部數據,而是應該指定數據庫列查詢,這樣可以提升查詢的性能。
3、distinct
如果需要查詢列值不重復的數據,可以使用distinct
關鍵字去重。
我們在上面的表中插入一條新的數據,數據age
和李子捌相等,sex
也相同。
1
2
|
mysql> insert into user ( name , age, sex) values ( '謝禮' , 18, 1); Query OK, 1 row affected (0.01 sec) |
此時可以看到年齡列有相等的值
1
2
3
4
5
6
7
8
9
10
11
12
13
|
mysql> select * from user ; + ----+--------+-----+-----+ | id | name | age | sex | + ----+--------+-----+-----+ | 1 | 李子捌 | 18 | 1 | | 2 | 張三 | 22 | 1 | | 3 | 李四 | 38 | 1 | | 4 | 王五 | 25 | 1 | | 5 | 六麻子 | 13 | 0 | | 6 | 田七 | 37 | 1 | | 7 | 謝禮 | 18 | 1 | + ----+--------+-----+-----+ 7 rows in set (0.00 sec) |
此時我們想獲取user
表中的用戶有哪些年齡。我們可以使用distinct
關鍵字,應用于需要去重的列前面。
1
2
3
4
5
6
7
8
9
10
11
12
|
mysql> select distinct age from user ; + -----+ | age | + -----+ | 18 | | 22 | | 38 | | 25 | | 13 | | 37 | + -----+ 6 rows in set (0.00 sec) |
這里有一個問題需要注意, distinct
關鍵字去重會作用于所有的字段,如果distinct
關鍵字后面跟了多個字段,那么多個字段的值都不相等才算不重復。
比如說user
表中不存在age
,name
同時都不重復的數據,此時distinct
關鍵字并不是沒生效,而是本身就不存在。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
mysql> select distinct age, name from user ; + -----+--------+ | age | name | + -----+--------+ | 18 | 李子捌 | | 22 | 張三 | | 38 | 李四 | | 25 | 王五 | | 13 | 六麻子 | | 37 | 田七 | | 18 | 謝禮 | + -----+--------+ 7 rows in set (0.00 sec) |
如果distinct
關鍵字后跟的字段值都不相等,那么distinct
關鍵字仍然能去重。比如李子捌和謝禮的年齡和性別均相等,此時distinct
關鍵字會過濾一條數據。
1
2
3
4
5
6
7
8
9
10
11
12
|
mysql> select distinct age,sex from user ; + -----+-----+ | age | sex | + -----+-----+ | 18 | 1 | | 22 | 1 | | 38 | 1 | | 25 | 1 | | 13 | 0 | | 37 | 1 | + -----+-----+ 6 rows in set (0.00 sec) |
4、limit
前面的查詢會返回滿足條件的所有記錄,如果我們只需要指定數量的記錄,可以使用limit
關鍵字限制返回的行;這種場景多用于數據分頁。
limit
的取值需大于等于0的整數 ,如果傳入負數和小數會報錯。
1
2
3
4
5
6
7
8
9
10
|
mysql> select * from user limit 0; Empty set (0.00 sec) mysql> select * from user limit 1; + ----+--------+-----+-----+ | id | name | age | sex | + ----+--------+-----+-----+ | 1 | 李子捌 | 18 | 1 | + ----+--------+-----+-----+ 1 row in set (0.00 sec) |
如果limit
給定的值大于表的行記錄值,那么將會返回所有數據。比如我們通過select count(1)
查詢user表的記錄數值,一共7條數據,此時我們傳入8,并不會報錯,MySQL
將會放回user
表中的所有數據。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
mysql> select count (1) from user ; + ----------+ | count (1) | + ----------+ | 7 | + ----------+ 1 row in set (0.01 sec) mysql> select * from user limit 8; + ----+--------+-----+-----+ | id | name | age | sex | + ----+--------+-----+-----+ | 1 | 李子捌 | 18 | 1 | | 2 | 張三 | 22 | 1 | | 3 | 李四 | 38 | 1 | | 4 | 王五 | 25 | 1 | | 5 | 六麻子 | 13 | 0 | | 6 | 田七 | 37 | 1 | | 7 | 謝禮 | 18 | 1 | + ----+--------+-----+-----+ 7 rows in set (0.00 sec) |
limit
可以跟兩個參數分別表示起始值和結束值,閉區間(包含起始值和結束值)。如果跟一個參數,則表示結束值,起始值默認為0。 注意MySQL
數據的索引起始值為0。
limit 2
, 4表示查詢第三條數據到第五條數據,其行號為2到4。
1
2
3
4
5
6
7
8
9
10
|
mysql> select * from user limit 2, 4; + ----+--------+-----+-----+ | id | name | age | sex | + ----+--------+-----+-----+ | 3 | 李四 | 38 | 1 | | 4 | 王五 | 25 | 1 | | 5 | 六麻子 | 13 | 0 | | 6 | 田七 | 37 | 1 | + ----+--------+-----+-----+ 4 rows in set (0.00 sec) |
到此這篇關于MySQL之select、distinct、limit的使用的文章就介紹到這了,更多相關MySQL之select、distinct、limit使用內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!
原文鏈接:https://juejin.cn/post/7028741334898835464