//order 子句 对前面取得数据 来指定某个字段的大小进行排序 排序只有两种方式
//正序 :ASC (默认)
倒序 :DESC
select *from user order by age; //按照年龄从小到大
select *from user order by age desc; 倒序
//分组查询 limit 子句 用于分页查询
形式:
limit [起始行号],要取出的行号num
select *from user limit 0 ,3;
一、连接查询
解释:连接就是两个或2个以上的表("连接起来成为一个数据源").
基本含义:将两个表以"并排"的方式,连接起来,成为"更多字段"的一个新表,当然,根据连接的方式不同方式,得到的新表的行数有不同,
1.交叉连接
语法:
from 表1 jion 表2;
实例:
select *from user cross join class; //cross可以省略,也可以用inner提替代 这些数据是无意义的
2.内连法: 显示出有意义的数据
语法:
from 表1 [inner] join 表2 on 表1.字段1 = 表2.字段2;
select *from user inner join class on user.class_id=class.class_id;
3.左[外]连接:
形式:
from 表1 left [outer] join 表2 on 连接条件.
说明:
1.这里,left 是关键字.
2.连接条件和内连接一样
3.含义是:内连接的结果基础上,加上左边表中的所有不符合连接条件的数据,相应本应放右边表的字段的位置就自动补位"null"值
select *from user left join class on user.class_id=class.class_id;
4.右[外]连接
右连接跟左连接恰恰相反:
形式:
from 表1 right [outer] join 表2 on 连接条件.
1.这里,right 是关键字.
2.连接条件和内连接一样
3.含义是:内连接的结果基础上,加上右边表中的所有不符合连接条件的数据,相应本应放左边表的字段的位置就自动补位"null"值
演示:
1.找出名字含34的所属 班级名称
select class.class_name from user inner join class on user.class_id=class.class_id where user.name like "%34%";
2.找出2班的所有人 注意点 user后面的点 和where需要指定表名
select user.* from user inner join class on user.class_id=class.class_id where class.class_name="二班";
二、子查询
如果一个select查询语句中,又出现了select查询语句,此时就称为"子查询",前者就是"主查询"
形式:
select 字段或表达式或(子查询)[as 别名] from 表名或(子查询2) where 字段表达式或(子查询3的条件判断
通常:
子查询1应该是一个"数据结果".
子查询2可以是"任意结果",此位置的查询结果,通常作为数据源,可以给一个别名
子查询3可以是一个数据或一列数据甚至是一行数据
三、常见子查询及相关关键字
1.比较运算符中使用子查询
形式为: 操作数 比较运算符 (标量子查询);
操作数通常是一个字段.
含义:判断该操作数(字段)的值是否满足该比较运算符所设定的比较结果
其实就是相当于最简单的这种形式:id > 5;
需求:找出所有大于平均年龄的人
第一步:找出平均年龄:
select avg(age) as avg_age from user;
第二步:找商品:
select *from user where age >600.4 ; <====>
select *from user where age > (select avg(age) from user); //结合
2.使用in子查询
in的基本语法形式为:
where 操作数 in (值1,值2, ....)
则in子查询就是:
where 操作数 in (列子查询) ;
含义:
表示该操作数(字段值) 等于 该子查询的其中任意一个只,就算满足条件
需求:
找出所有带"43"字的人的班级
第一步:
找出所有含43的字的班级id
select class_id from user where name like "%43%";
第二部:
根据结果找出这些类别的产品:
select *from class where class_id in (1,2,3,34); <====>
select *from class where class_id in (select class_id from user where name like "%43%");//联合
2.使用any子查询 和some一样的用法
使用形式:
where 操作数 比较运算符 any ( 列子查询 );
说明:
1操作数通常仍然是字段名
2比较运算符就是常规的 > >= < <= = <>
3列子查询也可以是标量子查询,都表示"若干个数据值"
含义:
表示该操作数的值只要跟列子查询的任意一个值满足给定的比较运算,就算满足了条件——就是只要有一个成就成
考察一个特定情况:
where 操作数 = any ( 列子查询 );
则其完全相当于:
where 操作数 in ( 列子查询 );
需求:
找出所有带"43"字的人的班级
select *from class where class_id =any(select class_id from user where name like "%43%");
3.使用all子查询
使用形式:
where 操作数 比较运算符 all ( 列子查询 );
说明:
1操作数通常仍然是字段名
2比较运算符就是常规的 > >= < <= = <>
3列子查询也可以是标量子查询,都表示"若干个数据值"
含义:
表示该操作数的值必须跟列子查询的所有值都满足给定的比较运算,才算满足了条件
需求:
找出学生中,年龄最大的
方法一:
select *from user where age >=all (select age from user);
方法二:
select *from user where age = (select max(age) from user);
4.使用exists的子查询
以前所学:
if exist
或者:
if not exists
以前其含义通常是:存在某数据(通常是一个表)
现在,该词也同样用于子查询,表示同样的含义"存在"
形式:
where exists (子查询);
含义:
如果该子查询有结果数据(无论什么数,只要大于等于1行),则就是true,否则为false
例子:找出有学生的班级
select *from class where exists (select *from user where user.class_id = class.class_id);
4.使用not exists子查询
含义跟exists子查询相反
举例:
找出还没有在售商品的类别
select *from class where not exists (select *from user where user.class_id = class.class_id);
/********联合查询*******/
- 联合查询的关键字是: union
连接查询的关键字: join
但,在mysql手册中,join这个连接查询,往往都翻译为'联合查询'
但在绝大多数的中文书籍和文章中,join被翻译为'连接查询'
基本含义
联合查询就是将两个select语句的查询结果'层叠'到一起成为一个'大结果'
两个查询结果的能够进行'联合'的先觉条件是:结果字段数相等
select id, name ,age from user union (select ta_id,name,age_num from ta1);
2.联合查询的排序等操作
语法形式:
select 语句1
union [ALL | DISTINCT]
select 语句2;
说明:
1.两个select语句的输出段(结果字段)一样数目一样,应用中通常类型一样才有意义
2.结果集中的字段以第一个select语句的字段为准
3.第一个select语句的字段可以做别名,但如果做别名,则后续的where,group,order等子句应该用该别名
4.联合查询默认是会消除重复项的(DISTINCT),要想不消除,则必须明确些"ALL"
5.如果要对整个联合结果进行排序或limit,则应该对各自的select语句加括号:
(select 语句1)
union
(select 语句2)
order by ..... limit ....;
例子:
(select id, name ,age from user) union (select ta_id,name,age_num from ta1) order by age;
(select id, name ,age from user) union (select ta_id,name,age_num from ta1) order by age limit 0,4;