Mysql学习笔记(四:单表查询与多表查询)

七、单表查询

1、select

select 内容(数据/值) as 别名; 可以把别名理解成是新的字段名,一般不这么用

2、from

select * from 表名1,表名2; 一次性查询多张表时,结果是这些表做笛卡尔乘运算。(一般情况下不会一次性查询多张表,没啥实际用处)

3、dual

select 内容 as 别名 from dual; 一般情况下没啥用,dual是一个伪表,from dual一般省略不写,知道即可

4、where

select * from 表名 where 字段名+限制条件(也就是要查找的范围,限制条件可以是与、或、非、等于、不等于、大于等逻辑运算与关系运算...例如age>=18); 有范围的查询,查询某字段值在给定范围内的数据

5、in

select * from 表名 where 字段名 in (条件); 查询某字段值是...的数据

select * from 表名 where 字段名 not in (条件);

6、between...and

select * from 表名 where 字段名 between A and B; 查询某字段值在A与B之间(包含A与B)的数据

select * from 表名 where 字段名 not between A and B;

7、is null

select * from 表名 where 字段名 is null; 查询某字段值是null的数据

select * from 表名 where 字段名 is not null;

8、聚合函数

select sum(字段名) from 表名; 求某表中某字段所有值的和

select avg(字段名) from 表名; 求某表中某字段所有值的平均

select max(字段名) from 表名; 求某表中某字段所有值的最大值

select min(字段名) from 表名; 求某表中某字段所有值的最小值

select count(字段名) from 表名; 求某表中某字段所有值的个数

9、like模糊查询

select * from 表名 where 字段名 like '大概要查询的%(_)'; 查询某表中某字段值大概为''的数据(%代表多个字符,短下划线只代表一个字符)

eg:

select * from student where name='张%'; 查询student表里name字段中值是张...的数据

10、order by 排序查询

select * from 表名 order by 字段名 desc; 查询某表,按某字段的值降序排列显示

select * from 表名 order by 字段名 asc; 查询某表,按某字段的值升序排列显示

11、group by 分组查询

select 字段1 as '别名1',字段2 as '别名2' from 表名 group by 字段2(1); 把某表中字段1和字段2中的数据按照字段2(1)来分组,一般情况我们习惯字段1处写聚合函数,字段2处写分组类别

eg:

select avg(age) as '年龄', address as '地区' from 表名 group by address; 按照地区分类求不同地区的平均年龄

12、group_concat

select group_concat(字段1),字段2 from 表名 group by 字段2; group_concat的意思就是把分类结果进行同类整合(同一类的在同一行显示)

13、having

having是对查询之后的结果(也就是虚拟的表)进行查询,where是对数据库里的数据(也就是原始表)进行查询

select 字段1 as '别名1',字段2 as '别名2' from 表名 group by 字段2(1) having 别名1+限制条件(也就是要查找的范围,限制条件可以是与、或、非、等于、不等于、大于等逻辑运算与关系运算...);

eg:

select avg(age) as '年龄', address as '地区' from 表名 group by address having 年龄>24; 按照地区分类求不同地区的平均年龄大于24的地区

14、limit

select * from 表名 limit num1,num2; 查询某表中第num1个数据开始,共查num2个数据

num1与num2都是数字,num1是指起始位置(就是从第几个数开始显示),num2是指跨度(就是从起始位置开始要显示几个数)。num1可以省略不写,默认起始位置是第0个数据,也就是从第0个数据开始

15、distinct

select distinct 字段名 from 表名; 查询某表中某字段去除重复值的所有值

扫描二维码关注公众号,回复: 15207794 查看本文章

八、多表查询

1、union联合查询

select 字段1,字段2... from 表名1 union select 字段3,字段4... from 表名2; 一次性查询多张表的多个字段的数据(多张表的字段名可以不一样,但查询的字段个数必须相同)

select 字段1,字段2... from 表名1 union distinct select 字段3,字段4... from 表名2; 一次性查询多张表的多个字段的去重数据

2、inner join(内连接,要有公共字段)

select 字段1,字段2 from 表名1 inner join 表名2 on 表名1.字段A=表名2.字段B; 字段1(表1的字段)和字段2(表2的字段)是两张表里的字段,通过字段A和字段B将两张表关联起来,查询关联后字段1与字段2的数据

select 字段1,字段2,字段3 from 表名1 inner join 表名2 on 表名1.字段A=表名2.字段B inner join 表名3 on 表名1.字段A=表名3.字段C;

内连接只能显示两(多)张表里关联字段相等的数据

3、left join(左连接)

select 字段1,字段2 from 表名1 left join 表名2 on 表名1.字段A=表名2.字段B; 左连接以左表为基准,也就是表1字段1中的所有数据都得出现,若是字段1有数据而对应的字段2没数据时,字段2的数据补为NULL(表1为左表,表2为右表)

4、right join(右连接)

select 字段1,字段2 from 表名1 right join 表名2 on 表名1.字段A=表名2.字段B; 右连接以右表为基准(表1为左表,表2为右表)

5、cross join(交叉连接)

select * from 表名1 cross join 表名2; 将表1和表2做笛卡尔积,没什么实际用处

6、natural join(自然内连接)

select * from 表名1 natural join 表名2; 根据两张表中字段名相同的字段关联两张表(两张表中若是没有相同字段名的字段,结果会返回笛卡尔积)

自然左连接、自然右连接分别是natural left join与natural right join,与上面的左右连接同理,实际中很少用自然连接

7、using

若是多张表查询时出现多个相同字段名的字段,需要用using指定以哪个相同字段名的字段为基准。用来指定连接的字段。

using的语法就在SQL语句最后加using(基准字段名)即可,但using会降低整个SQL语句的可读性,实际中也是用的不多。

eg:

select * from 表名1 natural join 表名2 using(id);

多表查询时要用什么连接还是得看项目实际需求,合适的才是最好的

猜你喜欢

转载自blog.csdn.net/weixin_63268005/article/details/128638005