常规查询
基本语法:
代码语言:javascript复制select 字段名 from 表名
select * from my_stu;
select name from my_stu;
条件查询
基本语法:
代码语言:javascript复制select 字段 from 表名 where 条件
例:查询id为2的学生姓名:
代码语言:javascript复制select name from my_stu where id =1;
where使用时注意事项:
- where 子句可以指定任何条件
- where 字句条件可以是一个,也可以是多个:这些条件可以用and和or连接
- where 子句类似if条件。
例:查询25~25之间的学生用between
代码语言:javascript复制select * from my_stu where age between 15 and 25;
联合查询
union 操作符用于合并两个或多个select 语句的结果集
代码语言:javascript复制select 字段 from 表1
union
select 字段 from 表2;
union 和union all 的区别:
union all 显示所有的查询结果
union 显示删除重复后的结果
不重复查询
代码语言:javascript复制select distinct 字段 from 表名;
模糊查询
模糊查询,使用like关键字,基本语法:
代码语言:javascript复制select 字段 from 表名 where 字段 like 值;
这里的值是模糊的,需要用到通配符:
1、“%”的使用
用来匹配0个或者多个字符,可以匹配任意类型和长度的字符,对长度没有限制。
例如:查询名字中带有e的学生信息
代码语言:javascript复制select * from my_stu where name like '%e%';
2、“_”的使用
“_”用来匹配任意单个字符,常用来限制表达式的字符长度。
例如:查询学生姓名以T开头,后面有2个字符的记录:
代码语言:javascript复制select * from my_stu where name like 'T__';
having 语句
1、having 是在 group by 子句之后:可以针对分组数据进行统计筛选。
查询班级人数大于等于个的班级:
代码语言:javascript复制select class_id,count(*) from my_student group by class_id having count(*)>=4
排序查询
用order by 关键字来进行排序
代码语言:javascript复制select 字段名 from 表名 where 条件 order by field1 desc/asc ,field2 desc/asc,...;
代码语言:javascript复制desc:降序
asc:升序--默认
限制查询
用limit 关键字进行限制查询
代码语言:javascript复制select 字段 limit 起始偏移量,行数
聚合
基本语法:
代码语言:javascript复制select 字段 聚合函数 from 表名 where 条件 group by 分组条件 having 条件;
一些聚合函数
count() 统计字段数量,不统计NULL。 avg() 求平均值 sum() 求和 max() 求最大值 min() 求最小值
统计公司所有员工的工资(sal),以及最高和最低工资
代码语言:javascript复制select sum(sal),max(sal),min(sal) from emp;
查询班级人数小于2的班级:
代码语言:javascript复制select count(*) as num ,cid from student group by cid having num<2;
group by 一旦执行:结果就是只返回一行记录:第一行
子查询
子查询是嵌套查询下层的程序模块。当一个查询是另一个查新的条件时,成为子查询
指在一条select语句中,嵌入另外一条select语句,那么被嵌入的select语句称为子查询
主查询
主查询指的是主要查询的查询对象,第一条select语句,确定了用户所有获取的数据目标
标量子查询
子查询得到的结果是一个数据(一行一列)
基本语法:
代码语言:javascript复制select * from 数据源 where 条件判断 =/<> (select 字段名 from 数据源 where 条件判断)
知道一个学生的名字:小猪,想知道他在哪个班级(班级名字)
代码语言:javascript复制select * from my_class where class_id=(select class_id from my_student where stu_name ='小猪');
行子查询
得到的结果是一行多列
行元素:字段元素是指一个字段对应的值,行元素对应的是多个字段:多个字段合起来作为一个元素参与运算,称之为行元素
基本语法:
主查询 where 条件[(构造一个行元素)]=(行子查询);
获取班级上年龄最大,且身高最高的学生:
代码语言:javascript复制select * from my_student where (stu_age,stu_height) = (select max(stu_age),max(stu_heigh)from my_student);
列子查询
得到的结果是一列数据(一列多行)
基本语法:
主查询 where 条件 in (列子查询);
获取已经有学生在班的所有的班级名字
代码语言:javascript复制select name from my_class where class_id in (select class_id from my_student);
表子查询
得到结果是多行多列。
行子查询用于where条件判断:where子查询
表子查询是用于from数据源:from 子查询
基本语法:
select 字段表 from (表子查询)as 别名 [where/group by/having/order by/limit]
获取每个班上最高身高的学生(一个)
代码语言:javascript复制select * from (select * from my_student order by stu_height desc) as temp group by class_id;
子查询中特定关键字的使用
in
主查询 where 条件 in (列子查询);
代码语言:javascript复制select * from my_student where class_id in (select classs_id from my_class);
any
任意一个:
=any(列子查询):条件在查询结果中有任意一个匹配即可,等价于in
<>any (列子查询):条件在查询结果中不等于任意一个。
代码语言:javascript复制select * from my_student where class_id any (select classs_id from my_class);
代码语言:javascript复制select * from my_student where class_id <> any (select classs_id from my_class);
some
与any完全一样.
all
全部:
=all(列子查询):等于里面所有
<>all(列子查询):不等于里面所有
代码语言:javascript复制select * from my_student where class_id = all (select classs_id from my_class);
代码语言:javascript复制select * from my_student where class_id <> all (select classs_id from my_class);
如果对应的匹配字段有null,那么不参与匹配
总结:
常见的三个子查询:
标量子查询、列子查询和行子查询:都属于where子查询
在select语句中,如果from子句引用了多个表源或试图,则可以用join关键字连接
1、内连接
内连接:inner join,从一张表中取出所有的记录去另外一张表中匹配,利用匹配条件
进行匹配。
基本语法:
代码语言:javascript复制表1[inner] join 表2 on 匹配条件
1、如果内连接没有条件(允许),那么就是交叉连接
2.使用匹配条件进行匹配
3、因为表的设计通常容易产生同名字段,尤其是ID,为了避免重名出现错误,通常
使用表名.字段名,确保唯一性.
代码语言:javascript复制select * from my_student inner join my_class on my_student.class_id=my_class
4、通常,如果条件中使用对应的表名,而表名通常比较长,所以可以通过表别名来简化
5、内连接匹配的时候,必须保证匹配到才保存
6、内连接可以在数据匹配完成后,使用where条件来限制,效果与on一样(推荐使用on).
using 关键字
是在连接查询中用来代替对应的on关键字的,进行条件匹配
1、在连接查询时,使用on的地方用using代替
2、使用using的前提是对应的两张表连接的字段是同名
3、如果using关键字,那么对应的同名字段,最终在结果中只会保留一个
基本语法:
代码语言:javascript复制表1[inner,left,right] join 表2 using (同名字段列表)//连接字段
代码语言:javascript复制select * from my_student a left join my_class b on a.class_id=b.class_id;
select * from my_student left join my_class using(class_id)
交叉连接
交叉连接:将两张表的数据与另外一张表彼此交叉。
基本语法:
代码语言:javascript复制表1 cross join 表2;
外连接
outer join,按照某一张表作为主表(表中所有记录在最后都会保留),根据条件去连接另外一张表
外连接分为两
种:左外连接(left join),右连接(right join)
左连接:左表是主表有连接:有表是主表
1、确定连接主表:左连接就是 left join 左边的表为主表;right join 就是右边为主表
2、拿主表的每一条记录,去匹配另外一张表的每一条记录
3、如果满足匹配条件:保留;不满足不保留。
4、如果主表记录在从表中一条都没有匹配成功,那么也要保留该记录,从表对应的字段值都为null;
基本语法:
代码语言:javascript复制左连接:主表 left join 从表 on 连接条件;
右连接: 主表 right join 从表 On 连接条件;
左连接对应的主表数据在左边;右连接对应的主表数据在右边;
代码语言:javascript复制select * from my_stydent as s lefy join my_clas c on s.class_id =c.class_id;