上一篇我们学习了如何从数据库的表中更新数据和删除数据,本篇主要讲如何从数据库表中查询数据,包括一般查询、条件查询以及模糊查询。学习之前可以在你的数据库中先导入这个sql脚本:school.sql
检索数据需要使用的关键字:
检索单个列的语法如下:
SELECT 列名 FROM 表名;
例如:
SELECT student_name FROM t_student;
运行结果如下所示:
可以看到该sql语句将表t_student中所有行的student_name列中的数据检索出来了。
检索多个列需要在SELECT关键字后给出多个列名,每个列之间用逗号分隔,语法如下:
SELECT 列名1,列名2 FROM 表名;
例如:
SELECT student_name,age FROM t_student;
结果:
检索所有的列需要使用通配符*,语法如下:
SELECT * FROM 表名;
例如,查询学生表t_student中的所有列:
SELECT * FROM t_student;
有时候查询的时候会返回很多重复的数据,如果我们想要返回的每一条数据都没有重复,则可以使用
关键字DISTINCT 来指示mysql返回唯一不同的值,语法如下:
SELECT DISTINCT 列名 FROM 表名;
需要注意的是关键字DISTINCT只能返回它的目标字段,而无法返回其它字段。也就是说使用DISTINCT返回的是不重复的记录,而不是返回指定列不同的记录。比如:
SELECT DISTINCT id,student_name FROM t_student;
以上查询的是id和student_name都不同的数据,而不是单独id不同的数据(即id一样但是student_name不同的数据也能返回)。同时DISTINCT只能位于第一个列名前面,不能放到后面的列名前。
使用LIMIT 关键字限定返回的结果
SELECT student_name FROM t_student LIMIT 5;
SELECT student_name FROM t_student LIMIT 5,5;
注意:行0 检索出来的第一行为行0而不是行1。因此LIMIT 1,1将检索第二行而不是第一行
mysql5支持另一种语法:LIMIT 4 OFFSET 3 从行3开始取4行,等价于 LIMIT 3,4
SELECT t_student .student_name FROM t_student ;
使用ORDER BY子句,可以对一个列或者多个列进行排序
可以使用非检索的列进行排序,也就是说要排序的列不一定要检索出来。
SELECT student_name FROM t_student ORDER BY student_name
多个列排序只需要在ORDER BY 子句后指定多个列名,每个列用逗号分隔。首先按照第一个列排序,第一个列相同时才按照第二个排序。如果第一个列的数据完全不同,则不按第二个列排序
SELECT id,student_name FROM t_student ORDER BY student_name,id
SELECT student_name FROM t_student ORDER BY student_name DESC
SELECT id,student_name FROM t_student ORDER BY student_name,id DESC
ORDER BY 子句位于FROM子句之后,如果使用LIMIT,LIMIT子句应该位于ORDER BY子句之后
在SELECT语句中,数据库根据WHERE子句中指定的搜索条件进行过滤。WHERE子句在表名(FROM子句)给出之后,如下所示:
SELECT * FROM t_student WHERE student_name = "李四";
WHERE子句的操作符
操作符 | 说明 |
---|---|
= | 等于 |
<> | 不等于 |
!= | 不等于 |
< | 小于 |
<= | 小于等于 |
> | 大于 |
>= | 大于等于 |
BETWEEN | 两者之间 |
SELECT * FROM t_student WHERE age > 15;
使用!=操作符进行不匹配检查。
SELECT * FROM t_student WHERE student_name != "李四";
使用BETWEEN关键字进行范围检查。
用法:BETWEEN a AND b
在使用BETWEEN关键字的时候必须指定低端值和高端值,两者之间用AND连接
SELECT * FROM t_student WHERE age BETWEEN 15 AND 20;
使用 IS NULL子句
SELECT * FROM t_student WHERE student_name IS NULL;
这条语句返回student_name字段为空值的数据
操作符(operator)用来连接或改变WHERE子句中的子句的关键字,也称逻辑操作符(logical operator)
AND:用在WHERE子句之后的关键字,用来检索满足所有给定条件的行。
为了通过不止一个列进行过滤,可以使用AND操作符给WHERE子句附加条件。
SELECT * FROM t_student WHERE age<15 AND student_name="李四";
OR操作符指示mysql检索匹配任一条件的行
SELECT * FROM t_student WHERE age<15 OR student_name="李四";
默认计算次序AND优先于OR,也就是说 a OR b AND c 等价于a OR (b AND c)。可以使用括号改变默认顺序
IN操作符用来指定条件范围,范围中的每个值都可以进行匹配,功能与OR相当。用法如下:
IN(a,b);
检索学生年龄在15到20之间的学生
SELECT * FROM t_student WHERE age IN(15,20);
NOT操作符有且只有一个作用:否定它之后所跟的任何条件
SELECT column1_name,column2_name WHERE NOT IN(1002,1003);
检索column1_name不等于1002和1003的数据
mysql支持NOT 对IN、BETWEEN和EXIST子句取反
通配符:用来匹配值的一部分的特殊字符
搜索模式:由字面值、通配符或者两者组合构成的搜索条件
通配符必须跟在LIKE操作符后面。LIKE指示mysql,后跟的搜索模式利用通配符匹配而不是直接相等匹配进行比较
百分号表示任意字符出现任意次数,比如检索所有姓李的学生:
SELECT * FROM t_student WHERE student_name LIKE '李%';
通配符可以在搜索模式中任意位置使用,并且可以使用多个通配符,比如检索名字中间有四的学生
SELECT * FROM t_student WHERE student_name LIKE '%李%';
注意:
%可以匹配0个字符,另外尾空格会干扰通配符,也就说说’%get ‘不会匹配到get结尾的数据,因为后面有一个空格。解决办法是在末尾加一个%或者使用函数去掉空格
%不会匹配到NULL
下划线的用途和%一样,但下划线只匹配单个字符而不是多个字符,比如检索不管姓什么但是名字为宏的学生:
SELECT * FROM t_student WHERE student_name LIKE '_宏';