七、单表查询
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 表名; 查询某表中某字段去除重复值的所有值
八、多表查询
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);
多表查询时要用什么连接还是得看项目实际需求,合适的才是最好的