MySQL SELECT 基本语法
MySQL 从数据表中查询数据的基本语句为 SELECT 语句,基本格式如下:
SELECT [DISTINCT] *丨字段名1,字段名2,字段名3,…
FROM 表1,表2
[WHERE 条件表达式1]
[GROUP BY 字段名 [HAVING 条件表达式2]]
[ORDER BY 字段名[ASC丨DESC]
[LIMIT [偏移量,] 记录数]; or [LIMIT 记录数 [OFFSET 偏移量] ];
[DISTINCT]
是可选参数,用于剔除查询结果中重复的数据。*丨字段名1,字段名2,字段名3,…
包含星号通配符的字段列表,表示查询的字段,其中字段列至少包含一个字段名称,如果要查询多个字段,多个字段之间要用逗号隔开,最后一个字段后不要加逗号。FROM 表1,表2
表 1 和表 2 表示查询数据的来源,可以是单个或多个。WHERE 条件表达式1
可选项,如果选择该项,将限定查询行必须满足的查询条件。[GROUP BY 字段名 [HAVING 条件表达式2]]
,GROUP BY 字段名
如何显示查询出来的数据,并按照指定的字段分组,HAVING
也是可选参数,用于对分组后的结果进行过滤。[ORDER BY 字段名[ASC丨DESC]
该子句告诉 MySQL 按什么样的顺序显示查询出来的数据,可以进行的排序有升序(ASC
)和降序(DESC
)。若不指定参数,默认为升序排列。[LIMIT [OFFSET] 记录数]
:LIMIT
是可选参数用于限制查询结果的数量。LIMIT
后面可以跟两个参数,第一个参数OFFSET
表示偏移量,如果偏移量为0则从查询结果的第一条记录开始,偏移量为1则从查询结果中的第二条记录开始…以此类推。OFFSET
为可选值,如果不指定其默认值为0。第二个参数记录数表示返回查询记录 的条数。
语句1:select * from student limit 9,4
语句2:slect * from student limit 4 offset 9
// 语句1和2均返回表student的第10、11、12、13行
//语句2中的4表示返回4行,9表示从表的第十行开始
在使用条件查询前,我们需要测试数据:
CREATE TABLE student (
sid CHAR(6),
sname VARCHAR(50),
age INT,
gender VARCHAR(50) DEFAULT 'male'
);
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1001', 'lili', 14, 'male');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1002', 'wang', 15, 'female');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1003', 'tywd', 16, 'male');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1004', 'hfgs', 17, 'female');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1005', 'qwer', 18, 'male');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1006', 'zxsd', 19, 'female');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1007', 'hjop', 16, 'male');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1008', 'tyop', 15, 'female');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1009', 'nhmk', 13, 'male');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1010', 'xdfv', 17, 'female');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1012', 'lili', 14, 'male');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1013', 'wang', 15, 'female');
- 使用IN关键字进行条件查询
SELECT *丨字段名1,字段名2,…
FROM 表名
WHERE 字段名 [NOT] IN (元素1,元素2,...);
三个例子
mysql> SELECT sid,sname FROM student WHERE age IN (14,17);
+--------+-------+
| sid | sname |
+--------+-------+
| S_1001 | lili |
| S_1004 | hfgs |
| S_1010 | xdfv |
| S_1012 | lili |
+--------+-------+
4 rows in set (0.09 sec)
mysql> SELECT sid,sname FROM student WHERE age NOT IN (14,17);
+--------+-------+
| sid | sname |
+--------+-------+
| S_1002 | wang |
| S_1003 | tywd |
| S_1005 | qwer |
| S_1006 | zxsd |
| S_1007 | hjop |
| S_1008 | tyop |
| S_1009 | nhmk |
| S_1013 | wang |
+--------+-------+
8 rows in set (0.05 sec)
mysql> SELECT * FROM student WHERE age NOT IN (14,17);
+--------+-------+-----+--------+
| sid | sname | age | gender |
+--------+-------+-----+--------+
| S_1002 | wang | 15 | female |
| S_1003 | tywd | 16 | male |
| S_1005 | qwer | 18 | male |
| S_1006 | zxsd | 19 | female |
| S_1007 | hjop | 16 | male |
| S_1008 | tyop | 15 | female |
| S_1009 | nhmk | 13 | male |
| S_1013 | wang | 15 | female |
+--------+-------+-----+--------+
8 rows in set (0.05 sec)
- 使用BETWEEN AND关键字进行查询
SELECT *丨字段名1,字段名2,…
FROM 表名
WHERE 字段名 [NOT] BETWEEN 值1 AND 值2;
- 使用空值查询
SELECT *丨字段名1,字段名2,…
FROM 表名
WHERE 字段名 IS [NOT] NULL;
- 使用DISTINCT关键字进行查询
出于对数据的分析需要过滤掉查询记录中重复的值。在SELECT语句中可使用DISTINCT关键字来实现该功能。
SELECT DISTINCT 字段名 FROM 表名;
- 使用AND关键字进行条件查询
SELECT *丨字段名1,字段名2,…
FROM 表名
WHERE 条件表达式1 AND 条件表达式2 … AND 条件表达式n;
- 使用OR关键字进行条件查询
SELECT *丨字段名1,字段名2,…
FROM 表名
WHERE 条件表达式1 OR 条件表达式2 … OR 条件表达式n;
- 使用LIKE关键字进行字符串条件查询
SELECT *丨字段名1,字段名2,…
FROM 表名
WHERE 字段名 [NOT] LIKE '匹配字符串'
含有%通配的字符串
查询学生姓名以wan开始的记录:SELECT sname,age,gender FROM student WHERE sname LIKE 'wan%';
查询学生姓名以w开始且以g结尾的记录:SELECT sname,age,gender FROM student WHERE sname LIKE 'w%g';
查询学生姓名中包含n的记录:SELECT sname,age,gender FROM student WHERE sname LIKE '%n%';
查询学生姓名中不包含a的记录:SELECT sname,age,gender FROM student WHERE sname NOT LIKE '%a%';
含有_通配的字符串
下划线通配符只匹配单个字符,如果要匹配多个字符,需要连续使用多个下划线通配符。例如,字符串“ab_”匹配以字符串“ab”开始长度为3的字符串,如abc、abp等等;字符串“a__d”匹配在字符“a”和“d”之间包含两个字符的字符串,如"abcd"、"atud"等等。
查询学生姓名以wan开头且长度为4的记录:SELECT sname,age,gender FROM student WHERE sname LIKE 'wan_';
查询学生姓名以er结尾且长度为4的记录:SELECT sname,age,gender FROM student WHERE sname LIKE '__er';
- 使用ORDER BY 对查询结果进行排序
查出来的数据是无序的并不是我们需要的,我们需要对他们进行排序。
SELECT 字段名1,字段名2,…
FROM 表名
ORDER BY 字段名1 [ASC 丨 DESC],字段名2 [ASC | DESC];
查询所有学生并按照年纪大小升序排列:SELECT * FROM student ORDER BY age ASC;
查询所有学生先按照年纪大小升序排列再按照姓名降序排列:SELECT * FROM student ORDER BY age ASC,sname DESC;
两个限制条件的话,是从左到有一次满足
- 使用LIMIT限制查询数量
SELECT 字段名1,字段名2,…
FROM 表名
LIMIT [偏移量,] 记录数]; or [LIMIT 记录数 [OFFSET 偏移量] ;
语句1:select * from student limit 9,4
语句2:slect * from student limit 4 offset 9
// 语句1和2均返回表student的第10、11、12、13行
//语句2中的4表示返回4行,9表示从表的第十行开始
查询学生表中的前5位同学:SELECT * FROM student LIMIT 5;
查询学生表所有学生,并按照age升序排序,再按照sid升序排序,显示从第五条到第九条记录:
mysql> SELECT * FROM student ORDER BY age ASC, sid ASC LIMIT 4,5;
+--------+-------+-----+--------+
| sid | sname | age | gender |
+--------+-------+-----+--------+
| S_1001 | lili | 14 | male |
| S_1001 | lili | 14 | male |
| S_1001 | lili | 14 | male |
| S_1001 | lili | 14 | male |
| S_1012 | lili | 14 | male |
+--------+-------+-----+--------+
5 rows in set (0.05 sec)
- 设置别名
<表名> [AS] <别名>
<表名>:数据中存储的数据表的名称。
<别名>:查询时指定的表的新名称。
AS:关键字为可选参数。
<列名> [AS] <列别名>
<列名>:为表中字段定义的名称。
<列别名>:字段新的名称。
AS:关键字为可选参数。