学会Mysql第三天

2020-04-16 14:54:55 浏览数 (1)

常规查询

基本语法:

代码语言: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;

0 人点赞