2020.5.1-5.6
决定重新开始学习sql了 使用记录
http://xuesql.cn/lesson/select_queries_introduction 暂时选择的这个学习网站 感觉还不错
https://sqlzoo.net/w/index.php?title=Special:CreateAccount&returnto=SQL+Tutorial 上面这个网站学习结束再看看这个网站的内容
leetcode上面也可以做sql练习
1.刚开头 就遇到一个大学学习时好像也没有遇到过的问题,总结一下大概是需要在查找到的数据中新增一列,指定了列名,改列数据都为同一个值:
select id,title,'美国' as country from movies
2.条件查询where里面的条件可以是数据的比较:
·某个列名和一个固定数字的比较(>,>=,<,<=,=,!=)
·某个列名和两个固定数字的比较即展示一段范围(between and,not between and)
·某个列名和一个列表里面的数字或者字符比较(in ,not in):
col_name NOT IN (1, 3, 5)
col_name IN ("A", "B", "C") ——字符要加双引号
·某个列名里面大概包含了什么字符:
col_name LIKE "%AT%" ——百分号是通配符,表示左右什么数据不限
如果没有通配符那like的效果就和上面的 =、!=一样
col_name LIKE "AN_" ——这个后面的下划线表示AN后面有且仅有1个字符
3.查询结果过滤和排序
·排重 在要找的列名前加 distinct
·limit 要显示多少条数据,offset从哪里开始显示:
select title from movies where director like "john lasseter"
order by length_minutes limit 1 offset 2
(找出john lasseter的排名第三长的电影,显示电影名称即可)
·两条排序规则,按照先后顺序,第一条第二天按顺序写中间逗号隔开
order by director asc,yesr desc
4.多表联合JOINs
·inner join(内连接)
select * from movies inner join boxoffice on movies.id=boxoffice.movie_id
这样找出来的数据是把两张表的列名属性都显示在一起
但是这样只会按照On的条件,将都有的数据进行显示,不匹配的行会丢失(数据交集)
·left\right\full join(外连接) 左边+数据交集、右边+数据交集、全部数据
这样找就是把不匹配的行也显示出来,没有属性的部分null会自动填充
select building_name from buildings left join employees
on buildings.building_name=employees.building where name is null
(找到还没有雇员的办公室)
5.使用运算表达式
select title,(domestic_sales+international_sales)/length_minutes as sales from movies
inner join boxoffice on movies.id=boxoffice.movie_id where director like "John Lasseter"
order by sales desc limit 3
计算字符串长度函数:length()
6.统计函数
count()、sum()、min()、max()、avg()
count(id):id有多少个
sum(math):班级的数学成绩总和 (一直把这个求列总和的方式和求行总和搞混)
分组统计:group by 如一个列属性里有三类数据,分别对这三类进行统计
·就职年份最高的雇员:
SELECT name,max(years_employed) FROM employees
·每栋办公室按人数排名,不要统计无办公室的雇员
SELECT building,count(name) FROM employees where building is not null
group by building order by count(name) desc (注意:where写前,group写后)
·就职1,3,5,7年的人分别占总人数的百分比率是多少(给出年份和比率"50%" 记为 50)
select years_employed,count(*)*100/(select count(*) from employees) as rate
from employees where years_employed in(1,3,5,7) group by years_employed
对分组完的数据进行筛选:having