Mysql查询
一、基本查询语句
SELECT语句是最常用的查询语句,它的使用方式有些复杂,但功能是相当强大的。
SELECT语句的基本语法如下:
select selection_list //要查询的内容,选择哪些列
from 数据表名 //指定数据表
where primary_constraint //查询时需要满足的条件,行必须满 足的条件
group by grouping_columns //如何对结果进行分组
order by sorting_cloumns //如何对结果进行排序
having secondary_constraint //查询时满足的第二条件
limit count //限定输出的查询结果
二、单表查询
01 查询所有字段
询所有字段是指查询表中所有字段的数据。这种方式可以将表中所有字段的数据都 查询出来。在MySQL中可以使用“*”代表所有的列,即可查出所有的字段
格式如下: select * from 表名;
02 查询指定字段
查询指定字段可以使用下面的语法格式: select字段名 from 表名;
例:查询db_database09数据库tb_login表中的user和pwd两个字段
select user,pwd from tb_login;
03 查询指定数据
如果要从很多记录中查询出指定的记录,那么就需要一个查询的条件。设定查询 条件应用的是WHERE子句。通过它可以实现很多复杂的条件查询。在使用where 子句时,需要使用一些比较运算符来确定查询的条件
运算符“=”:用来判断数字、字符串和表达式等是否相等。这个符号不能判定空 值(NULL)
例:应用WHERE子句查询tb_login表,条件是user(用户名)为mr
select * from tb_login where user = 'mr';
注意
标准SQL语句中类型为字符串、文本、日期类型时必须加单引号
标准SQL语句中类型为数值型时不用加单引号
04 带IN关键字的查询
IN关键字可以判断某个字段的值是否在于指定的集合中。如果字段的值在集合中, 则满足查询条件,该记录将被查询出来;如果不在集合中,则不满足查询条件。
其语 法格式如下:SELECT * FROM 表名 WHERE 条件 [NOT] IN(元素1,元素2,…,元素n);
例:应用IN关键字查询tb_login表中user字段为mr和lx的记录
select * from tb_login where user in('mr','lx');
05带 between and 查询
between and 关键字可以判断某个字段的值是否在指定的范围内。如果字段 的值在指定范围内,则满足查询条件,该记录将被查询出来。如果不在指定范围内, 则不满足查询条件。
其语法如下: SELECT * FROM 表名 WHERE 条件 [NOT] BETWEEN 取值1 AND 取值2;
例:查询computer_stu表中成绩在65-85之间的记录
SELECT * FROM computer_stu WHERE score between 65 and 85;
06 带like的字符匹配查询
LIKE属于较常用的比较运算符,通过它可以实现模糊查询。它有两种通配符: “%”和下划线“_”;
“%”可以匹配一个或多个字符,可以代表任意长度的字符串,长度可以为0
“_”只匹配一个字符
例:查询tb_login表中user字段中包含mr字符的数据
select * from tb_login where user like '%mr%';
07 正则表达式
正则表达式是用某种模式去匹配一类字符串的一个方式。正则表达式的查询能 力比通配字符的查询能力更强大,而且更加的灵活。
在MySQL中,使用REGEXP关键字来匹配查询正则表达式。其基本形式如下: 字段名 regexp '匹配方式'
匹配指定字符中的任意一个
使用方括号([])可以将需要查询字符组成一个字符集。只要记录中包 含方括号中的任意字符,该记录将会被查询出来。
使用“*”和“+”来匹配多个字符
正则表达式中,“*”和“+”都可以匹配多个该符号之前的字符。但是, “+”至少表示一个字符,而“*”可以表示0个字符
匹配以指定的字符开头和结束的记录
正则表达式中,^表示字符串的开始位置,$表示字符串的结束位置。
08 带is null关键字查询空值
IS NULL关键字可以用来判断字段的值是否为空值(NULL)。如果字段的值是 空值,则满足查询条件,该记录将被查询出来。如果字段的值不是空值,则不满足查 询条件。
其语法格式样如下:is [not] null
例:使用关键字IS NULL查询 tb_book表中row字段的值为空的记录
SELECT books,row FROM tb_book WHERE row IS NULL;
09 带AND的多条件查询
AND关键字可以用来联合多个条件进行查询。使用AND关键字时,只有同时满 足所有查询条件的记录会被查询出来。如果不满足这些查询条件的其中一个,这样的 记录将被排除掉。
AND关键字的语法格式如下: select * from 数据表名 where 条件1 and 条件2 […AND 条件表达式n];
例:查询数据表tb_login中user字段值为mr,并且section字段值为PHP的记录
select * from tb_login where user='mr' and section='php';
10 带OR的多条件查询
OR关键字也可以用来联合多个条件进行查询,但是与AND关键字不同,OR关 键字只要满足查询条件中的一个,那么此记录就会被查询出来;如果不满足这些查询 条件中的任何一个,这样的记录将被排除掉。
OR关键字的语法格式如下: select * from 数据表名 where 条件1 OR 条件2 […OR 条件表达式n];
例:查询tb_login表中section字段的值为“PHP”或者“程序开发”的记录
select * from tb_login where section='php' or section='程序开发';
11 用DISTINCT关键字去除结果中的重复行
使用distinct关键字可以去除查询结果中的重复记录
语法格式如下: select distinct 字段名 from 表名;
例:使用关键字DISTINCT去除 tb_login表中name字段中的重复记录
select distinct name from tb_login;
12 用ORDER BY关键字对查询结果排序
使用order by可以对查询的结果进行升序(ASC)和降序(DESC)排列, 在默认情况下,ORDER BY按升序输出结果。如果要按降序排列可以使用DESC 来实现。
语法格式如下: order by 字段名 [asc|desc];
ASC表示按升序进行排序 DESC表示按降序进行排序
例:查询tb_login表中的所有信息,按照id序号进行降序排列
select * from tb_login order by id desc;
13 用GROUP BY关键字分组查询
通过group by子句可以将数据划分到不同的组中,实现对记录进行分组查询。 在查询时,所查询的列必须包含在分组的列中,目的是使查询到的数据没有矛盾。
1、使用关键字GROUP BY来分组
2、关键字GROUP BY与GROUP_CONCAT()函数一起使用,group_concat()函 数能将group by产生的同一个分组中的值连接起来,返回一个字符串结果
3、按多个字段进行分组
例:使用关键字GROUP BY对tb_book表中talk字段进行分组查询
select id,books,talk from tb_book GROUP BY talk;
例:使用关键字GROUP BY和GROUP_CONCAT()函数对tb_book表中的talk字 段进行分组查询
use db_database08; SELECT author,GROUP_CONCAT(bookname) FROM tb_bookinfo GROUP BY author;
例:对数据表tb_book表中user字段和talk字段进行分组,分组过程中,先按照 user字段进行分组,当user字段的值相等时,再按照talk字段进行分组
select id,books,talk,user from tb_book GROUP BY user,talk;
14 用LIMIT限制查询结果的数量
查询数据时,可能会查询出很多的记录。而用户需要的记录可能只是很少的一 部分。这样就需要来限制查询结果的数量。limlt是MySQL中的一个特殊关键字。 limlt子句可以对查询结果的记录条数进行限定,控制它输出的行数。
注意: LIMIT子句中的编号是从0开始的。
例:查询数据表tb_login中,按照id编号进行升序排列,显示前3条记录
select * from tb_login order by id asc limit 3;
例:查询tb_login表中,按照id编号进行升序排列,从编号1开始,查询两条记录
select * from tb_login where id order by id asc limit 1,2;
15 Having子句
对分组的数据再进行过滤,需要使用having子句
例:在school库的school表中,按照班级对学生进行分组,并查询出每个班级的学 生数,学生的平均身高,最低年龄身高
SELECT class,COUNT(class),AVG(height),MIN(height) FROM school GROUP BY class;
例:查询出存在身高低于160的班级及班级人数
SELECT class,COUNT(class),AVG(height),MIN(height) FROM school GROUP BY class HAVING MIN(height)<160;
三、聚合函数查询
01 COUNT()函数
COUNT()函数,对于除“*”以外的任何参数,返回所选择集合中非NULL值的 行的数目;对于参数“*”,返回选择集合中所有行的数目,包含NULL值的行。没有 WHERE子句的COUNT(*)是经过内部优化的,能够快速的返回表中所有的记录总数。
例:使用count()函数统计数据表 tb_login中的记录数
select count(*) from tb_login;
02 SUM()函数
SUM()函数可以求出表中某个字段取值的总和
例:使用sum()函数统计数据表 tb_book中图书的访问量字段(row)的总和
select row from tb_book;
select sum(row) from tb_book;
03 AVG()函数
AVG()函数可以求出表中某个字段取值的平均值。
例:使用AVG()函数求数据表tb_book中row字段值的平均值
select AVG(row) from tb_book;
04 MAX()函数
MAX()函数可以求出表中某个字段取值的最大值
例:使用MAX()函数查询数据表tb_book中row字段的最大值
select MAX(row) from tb_book;
05 MIN()函数
MIN()函数可以求出表中某个字段取值的最小值。
例:使用MIN()函数查询数据表tb_book中row字段的最小值
select MIN(row) from tb_book;
四、日期和时间函数
日期和时间函数是MySQL中另一最常用的函数。其主要用于对表中的日期和时 间数据的处理。
01 curdate()和current_date()函数
CURDATE()和CURRENT_DATE()函数获取当前日期。
02 curtme() 和current_time()函数
CURTIME()和CURRENT_TIME()函数获取当前时间。
03 NOW()函数
NOW()函数获取当前日期和时间。还有CURRENT_TIMESTAMP()函数、 LOCALTIME()函数、SYSDATE()函数和LOCALTIMESTAMP()函数也同样 可以获取当前日期和时间。
select NOW(),CURRENT_TIMESTAMP(),LOCALTIME(),SYSDATE();