目录
1、left join、right join、full join、inner join的区别;
2、distinct与group by的区别;
3、union 和union all的区别
4、limit 限制呈现条数
5、like 返回包含某个字符串的结果
6、SQL OR和 AND
7、count(*)、count(1)、count(列名)的区别和时间性说明
8 group by 用法
9 between and
10、不等于
11、where和having
12、or、in
13、case when
14、多表查询之from和join
15、并表时出现笛卡尔积怎么处理;
16、可以允许多个字段主键吗?
17、SQL语句执行顺序
18、SQL常用函数说明
19、SQL视图与表的区别
20、SQL索引
1、left join、right join、full join、inner join的区别;
1)left join:以表A数据为基础连接表B,查询表B数据,如果搜索不到,则返回null;
2)right:以表B为基础连接表A,查询表A数据,如果搜索不到,则返回null;
3)inner join(即join):返回表A与表B有共同交集字段的数据
4)full join(mysql不支持):返回表A与表B的所有数据,mysql通过左连接 union 右连接实现;
2、distinct与group by的区别;
1)distinct 支持单列、多列去重;
2)group by 用于聚合统计;
3)单纯去重统计使用distinct效率更高;
A、distinct单列去重
//distinct单列去重
select distinct useId from user_msg;
B、group by单列去重
//group by单列去重
select * from user_msg group by userId;
C、distinct多列去重
select distinct useId,brand,type from use_phone
D、group by多列去重
select *from use_phone group by useId,type
3、union 和union all的区别
union和union all均是对多个查询结果进行并集操作,要求查询结果列数一致,其中union对结果进行去重操作,同时进行默认规则的排序,union all则将结果全部呈现。
4、limit 限制呈现条数
其中limit X表示限制呈现X行;
limit Y,X表示从第Y行后显示X行;
//限制呈现1行
select *
from student
limit 1
//从第2行后呈现1行
select *
from student
limit 2,1
5、like 返回包含某个字符串的结果
1)使用 like进行模糊匹配,使用like的时候尽量采用固定字词开头的方式,这样的话可以通过索引搜索,避免全局搜索。
select *
from student
where user_name like '王%'
6、SQL OR和 AND
SQL语言中,or代表或连接,返回符合A条件或者B条件的情况。AND代表与连接,返回同时符合A条件及B条件的情况。
AND的优先级高于OR,查询语句中同时存在and和or语句时,会优先执行and语句,再执行or语句
在有索引的表格里面,尽量避免执行or语句,会导致索引失效
可以通过union all替代 or语句。
时间对比
7、count(*)、count(1)、count(列名)的区别和时间性说明
count()统计包括所有列,统计结果包含列值为null的行;
count(1)忽略所有列,用1指代代码行,统计结果包含值为null的行;
count(列名)统计列名所在那一列的数量,统计结果不包含列值为null的数量
执行耗时:count()>count(1)>count(列)【无索引】>count(列)【带索引】
即在带索引的列上面进行搜索的效率最高
8 group by 用法
group by主要用于分组统计,类似EXCEL中的数据透视图,需要配合相关聚合函数使用(如sum()、count()等),group by可以根据多个字段进行分类筛选。
9 between and
等同于 >=和<=,查询结果包含边界值,效率基本等同,只是多一层转化的时间,几乎可以忽略.
10、不等于
<>为mysql标准写法,也可以使用!=,不过某些版本可能存在支持问题
select * from student where name<>'张三';
select * from student where name != '张三‘;
11、where和having
where 用于查询符合条件的数据,返回过滤后的结果,用于分组前;
having针对分组后的组中内容进行条件筛选过滤,因此常与聚合函数一起使用。
12、or、in
in采用二分查找法,效率为ln,效率更高,且随着并联语句越多,or较难以维护,因此推荐采用in。
select * from student where num = “1” or num = "2" or num = "3";
select * from student where num in (1,2,3);
13、case when
主要使用场景:等值转换、范围转换、行列转换
1、等值转换
select s_id,
(case when c_id = 1 then "语文"
when c_id = 2 then "数学"
when c_id = 3 then "英语"
when c_id = 4 then "物理" else 0 end),source from source
2、范围转换
select s_id,c_id,source,
(case when source >= 90 then "优秀"
when source >=80 then "良好"
when source >=60 then "及格"
else "不及格" end) from source
3、行列转换
select s_id,
max(case c_id when "1" then source else 0 end) "语文",
max(case c_id when "2" then source else 0 end) "数学",
max(case c_id when "3" then source else 0 end) "英语",
max(case c_id when "4" then source else 0 end) "物理"
from source group by s_id
14、多表查询之from和join
多表查询可以采用from和join,均可以指定从那些表中查哪些数据,from 拼接表生成笛卡尔集合,join 通过多个表的外键进行连接,如果是两个表的连接的话from和join 查询效率基本一致,如果是多个表拼接, 则需要使用join,详见15。
// from
select *
from student st,source so
where st.id = so.id;
// join
select *
from student st
join source so
on st.id = so.id
15、并表时出现笛卡尔积怎么处理;
笛卡尔积:多表关联产生的存在大量冗余数据的中间表,占用大量内存空间。
解决方案:采用JOIN XX ON XX语句。ON语句的执行是在JOIN语句之前的,两张表数据行之间进行匹配的时候,会先判断数据行是否符合ON语句后面的条件,再决定是否JOIN。
16、可以允许多个字段主键吗?
SQL只能有一个主键,但是允许一个主键由多个字段组成。
17、SQL语句执行顺序
select 查询结果
from 从哪张表查询
join 连接什么表
on 连接限定条件
where 查询条件
group by按照什么条件分组
having 对分组结果指定条件
order by对查询结果进行排序
limit 限制呈现个数
执行语句的顺序
1)from
2)join
3)on
4)where
5)group by
6)having
7)select
8)order by
9)limit
18、SQL常用函数说明
distinct()去重、sum()统计总和、count()统计个数、avg()平均值、max()最大值、min()最小值、round()四舍五入、len()长度、ceiling()返回最大整数、floor()返回最小整数
19、SQL视图与表的区别
数据库数据存储在表中,表具备实际物理空间存储,视图是逻辑概念的虚表,是查看数据的一种窗口,为了安全考虑,用户通过视图操作,从而可以不知道表的结构,视图的建立和删除只影响视图本身,不影响表。
20、SQL索引
1)索引是一种特殊的目录,使用索引可以快速访问数据库表的特定信息,可以用于提升数据读取的速度,包括聚集索引和非聚集索引,副作用:增加磁盘空间,降低增删改效率。
2)执行语句
创建: create index index_name on table_name
撤销:drop index table_name index_name
3)注意事项
A、不在索引列上做任何操作(计算、函数、类型转换),会使索引失效转向全局扫描。
B、mysql在使用不等号时(!=、)、is null(is not null)、like以通配符开头(%XX)、字符串不加单引号、or连接等均会使索引失效
4)创建时机
A、创建主键时自动为主键添加唯一索引;
B、频繁作为查询条件的字段应该创建索引;
C、查询与其他表关联的字段、外键关系时建立索引;
D、频繁更新的字段不适合创建索引;
E、where里用不到的字段无需创建索引;
F、高并发下倾向于创建组合索引;
G、where中有多个查询条件时倾向于使用组合索引(alter table table_name add index index_name(col1,col2,col3)),遵循最左前缀索引原则。
H、查询中统计、分组、排序的字段添加索引。
参考:https://www.cnblogs.com/hyd1213126/p/5828937.html