数据库查询技巧以及横纵表
1. 查询技巧
【数据库查询技巧以及横纵表】查询时先写出查询结构,将需要连接的表进行join on 连接好,最后再写出查询的数据
select
from
join
on
[where]
group by 字段[order by 字段 asc/desc]
[having]
实例:
# 显示列表包含电影名、用户性别、评分select a.title, c.gender, b.ratings
from movies a
inner join ratings b
on a.movie_id = b.movie_id
inner join users c
on b.user_id = c.user_id
limit 5;
# 显示列表包含电影名、用户性别、评分 (只包含男性)
select a.title, c.gender, b.ratings
from movies a
inner join ratings b
on a.movie_id = b.movie_id
inner join users c
on b.user_id = c.user_id
where c.gender = 'M'limit 10;
# 显示男女平均打分,只有两行记录
select a.gender, avg(b.ratings)
from users a
inner join ratings b
on a.user_id = b.user_id
group by a.gender;
# 显示每部电影平均打分,电影名,评分
select a.title, avg(b.ratings)
from movies a
inner join ratings b
on a.movie_id = b.movie_id
group by a.title;
# 显示每部电影不同性别平均分
select c.title, a.gender, avg(b.ratings)
from users a
inner join ratings b
on a.user_id = b.user_id
inner join movies c
on b.movie_id = c.movie_id
group by c.title, a.gender;
# 显示电影平均分大于4分的电影
select a.title, avg(b.ratings)
from movies a
inner join ratings b
on a.movie_id = b.movie_id
group by a.title
having avg(b.ratings) > 4;
# 显示电影平均分大于4分的电影(子查询)#显示电影平均分大于4分的电影(子查询)
select title
from movies
where movieid
in(
select movieid
from movies
where movieid
in
(
select movieid
from ratings
group by movieid
having avg(rating)>4
)
);
# 不同年龄分组电影平均打分
select c.age_min, c.age_max, avg(a.ratings)
from ratings a
inner join users b
on a.user_id = b.user_id
inner join age_dict c
on b.age = c.age_id
group by c.age_min, c.age_max;
数据查询优化: 1. 给当前查询数据添加索引create index ix_user_id on users (user_id)
2.给关系数据库添加主外键关联。
2. mysql数据库表的横纵交换。
create table b
(
姓名 varchar(20),
语文 int,
数学 int,
英语 int
);
insert into b(姓名,语文,数学,英语) values('张三',60,70,80);
insert into b(姓名,语文,数学,英语) values('李四',90,100,0);
insert into b(姓名,语文,数学,英语) values('五狗',80,90,70);
# 加了引号代表每一行都要显示该数据 as 只执行一次(适用于表头),不加引号代表查询的结果字段
select 姓名, '语文' as 课程, 语文 as 成绩 from b
union all
select 姓名, '数学' as 课程, 数学 as 成绩 from b
union all
select 姓名, '英语' as 课程, 英语 as 成绩 from b
;
# 创建纵表
create table c
select 姓名, '语文' as 课程, 语文 as 成绩 from b
union all
select 姓名, '数学' as 课程, 数学 as 成绩 from b
union all
select 姓名, '英语' as 课程, 英语 as 成绩 from b
;
select * from c;
#1)case vlaue when [compare-value]then reslut [when[compare-value]] then result ...] [else result] end#(2)case when [condition] then result [when[condition]then result...][else result] end#第一形式当value=https://www.it610.com/article/compare-value时返回result#
#第二形式当第一个为真值的condition出现时,返回该条件的结果,如果没有匹配的结果值,那么else后的结#果将被返回,如果没有else部分,那么返回null
# 只要出现聚合函数就一定有group by。
select 姓名,
max(case 课程 when'语文' then 成绩 else 0 end) as '语文',
max(case 课程 when '数学' then 成绩 else 0 end) as '数学',
max(case 课程 when '英语' then 成绩 else 0 end) as '英语'
from c
group by 姓名;
select * from c where 课程='数学' ORDER BY 成绩;
推荐阅读
- Docker应用:容器间通信与Mariadb数据库主从复制
- 【译】20个更有效地使用谷歌搜索的技巧
- 关于QueryWrapper|关于QueryWrapper,实现MybatisPlus多表关联查询方式
- mybatisplus如何在xml的连表查询中使用queryWrapper
- mybatisplus|mybatisplus where QueryWrapper加括号嵌套查询方式
- MybatisPlus使用queryWrapper如何实现复杂查询
- 数据库设计与优化
- 数据库总结语句
- MySql数据库备份与恢复
- Java程序员阅读源码的小技巧,原来大牛都是这样读的,赶紧看看!