数据库查询
一、基本查询语句
Select
{* |<字段列表>}
[
From <table1>,<table2>……
[where <expr>]
[group by <group by definition>] //显示出来按字段分组
[having <expression> {{<operator><expression>}......}]
[order by <order by definition>] //显示出来的顺序ASC,DESC
[limit [<offset>,]<row count>] //每次显示查询出来的数据条数
]
Select [字段1,字段2,……,字段n]
From [表或视图]
Where [查询条件];
二、单表查询
1、select语句查询所有字段(用*、自己指定所有字段)
Select * from table_name;
Select 字段1,字段2,……,字段n from table_name;
一般情况下不用*,因为在指定的情况下可以节省输入查询语句的时间,只有在不知道字段名的情况下才用*
2、查询单个、或多个字段
Select 字段1 from table_name;
Select 字段1,字段2, from table_name;
3. 查询指定纪录
Select 字段1,字段2,字段3……
From table_name
Where 查询条件
其中查询条件判断符有:=/<>/!=/</<=/>/>=/between
3、带有in的关键字
in用来查询指定范围内的条件记录,所有检索调价用括号括起来,用逗号隔开
Select s_id,f_name,f_price from fruits where s_id in(101,102) order by f_name;
Not in 用来检索不再指定范围内的记录
4、带between and 的范围查询
5、带Like的查询
1)百分号通配符‘%’匹配任意长度的字符,甚至包括零字符
Select f_id,f_name from fruits where f_name like’b%’;//以b开头的字符
Like ‘%g%’——含有g的
2) 下划线通配符’_’,一次只能匹配任意一个字符
Select f_id,f_name from fruits where f_name like’_____b’;//匹配长度为5且以b为结尾的字符
6、查询空字符
Select * from table_name where 字段名 is null
Select * from table_name where 字段名 is not null //查找不为空的
7、带有and的多条件查询
8、带有or的多条件查询
9、对查询结果进行排序
1)单列排序 select * from table_name order by 字段名;
2)多列排序 select * from table_name order by 字段1,字段2;——首先排序的是第一列,如果第一列相同再按第二列进行排序
3)指定排序方向——默认情况下是升序,ASC,DESC是降序
10、分组查询
分组查询是对数据按照某个或者多个字段进行分组,group by
[Group by 字段] [having <条件表达式>]
1)创建分组
Group by通常和集合函数一起使用,如max(),min(),count(),sum(),avg();
Select s_id,count(*) as total from fruits group by s_id;
2)使用having过滤分组
Select s_id,group_concat(f_name) as names from fruits group by s_id having count(f_name)>1;
Having和where都是用来过滤数据,二者区别:
Having是在数据分组之后进行过滤来选择分组,where是分组之前用来选择记录的
3)在group by子句中使用with rollup(with rollup用于统计记录数量)
4)多字段分组
5)Group by和order by一起使用
需要注意的是group by中使用rollup时,不能使用order by子句对结果进行排序。Rollup和order by是互相排斥的
11、limit限制查询结果数量
Limit [位置偏移量,] 行数
Select * from table_name 4;//查询表中的前四条记录
Select * from table_name 3,5;//查询从第4条记录开始5条记录
三、使用聚合函数查询
1、Avg():返回某列的平均值
2、Count():返回某列的行数
count(*):返回表中总的行数,不管某列有数值或为空值
count(字段名):计算指定列的总行数,计算忽略空值的行
3、Max():返回某列的最大值
4、Min():返回某列的最小值
5、Sum():返回某列值的和:在计算时忽略列值为null的行
四、连接查询
连接是关系数据库模型中的主要特点,连接查询是关系数据库中的主要查询,主要包括内连接、外连接等,通过连接运算符可以实现多个表查询。
1、内连接查询(inner join)
使用比较运算符进行表间某些列数据的比较操作,并列出这些表中与连接条件相匹配的数据行组合成新的记录。
2、外连接查询(left join/right join)
1)左连接:返回左表中的所有记录和右表中连接字段相等的记录
2)右连接:返回右表中的所有记录和左表中连接字段相等的记录
3)复合条件连接查询:在连接的基础上,添加过滤条件。
连接比较及其区别:(下图来自网络,侵权删)
五、子查询
子查询指一个查询语句嵌套在另一个查询语句内部的查询,子查询的操作符all(some),all,in,exists.
1)带有any/all/关键字的查询。
Select num1 form table1 where num1>any(select num2 from table2);——any:只要大于子查询结果中的任意一个就行。
Select num1 form table1 where num1>all(select num2 from table2);——all:大于子查询的所有结果。
2)exists关键字查询
Exists关键字后面的参数是任意一个子查询,系统对子查询运算判断它是否返回行,如果至少返回一行,那么结果为true,此时外层查询语句进行查询。
Not exists关键字与exists 返回结果相反,如果至少返回一行,那么结果为false,外层语句不再进行查询。
Exists、not exists的结果只取决于是否会返回行,而不取决于这些行的内容,成功与否决定是否进行外层查询。
3)带in关键字的子查询
内层查询语句仅仅返回一个数据列,这个数据列里的值将提供外层查询语句进行比较操作。
4)带有比较运算符的子查询
6、合并查询结果
Union关键字可以合并多条select语句。
Union不适用关键字all,执行时会删掉重复的记录,所有的返回结果唯一的
Union使用关键字all,执行时不会删掉重复的记录也不会对结果进行自动排序。
Select s_id,f_name,f_price from fruits where f_price<5.2
Union all
Select s_id,f_name,f_price from fruits where s_id in(103,101);
7、为表或字段取别名
1)为表取别名 table_name as tablename1;
2)为字段名取别名 列名 as 列名1
8、使用正则表达式regexp
1)‘^’查询以特定的字符或字符串开头的记录
Select * from fruits where f_name regexp ‘^b’;//查询以b开头
2)’$’查询以特定的字符或字符串结尾的记录
Select * from fruits where f_name regexp ‘y$’;//查询以y结尾
3)使用’.’来匹配任何一个字符
4)使用‘*’、‘+’来匹配多个字符
5)匹配指定的字符串 regexp ‘指定的字符串’
Like和regexp的区别:like匹配的字符串在文本中间出现这找不到它,而regexp在文本内部进行匹配,如果被匹配的字符在文本内部出现也能找到。
6)匹配指定字符中的任意一个
[字符集合]——只匹配字符集合中任何一个字符,即为所查找的文本
7)匹配指定字符以外的
[^字符集合]——匹配在字符集合之外的字符
8)使用{n,}/{n,m}来制定字符串连续出现的次数
n至少匹配n次前面的字符,
{n,m}——不少于n次,不多于m次
Select * from fruits where f_name regexp ‘ba{1,3}’;
解惑:
1、Distinct 应用于所有的列
2、Order by可以和limit使用吗?——可以使用,但是limit必须在order by后面使用。
3、什么时候使用引号?——单引号是用来限定字符串,如果将值与字符串类型列进行比较,则需要限定引号,而用来与数值进行比较则不需要限定引号。
4、在where子句中必须使用圆括号吗?——任何时候使用and和or操作符的where子句,都应该使用圆括号明确操作顺序。
5、为什么使用通配符格式正确,却没有查找出符合条件的记录?——MySQL在存储字符串时可能不小心把两端带有空格字符串保存到记录中,解决方法是使用trim函数将空格符号删除再进行匹配。