我喜欢用小写
并没有具体分类
我的笔记~所以并不适合学习,适合忘记后快速恢复记忆
边学边更新~
浅看就好
table
代表 表
col
代表列名
col_name1 | col_name2 |
---|---|
我是数据 | 我也是数据 |
data
代表数据,具体是啥数据并不重要
select 语句, 通常又称为 查询, 可以通过语句描述我们要取哪些数据,在数据返回前对数据做一些操作等等
没错,是条件,不多bb废话
and
和or
用于连接条件
例: select
col_name,...
from
table
where
条件
关键字 | 说明 | 例子 |
---|---|---|
= , != , < ,<= , > , >= |
额…没啥好说的 | col_name = data |
is null |
是空 | col_name is null data |
is not null |
不是空 | col_name is not null data |
between data1 and data2 |
在data1 和data2 之间,区间是[data1,data2] |
col_name between data1 and data2 |
not between data1 and data2 |
不在data1 和data2 之间,区间同上取反 |
col_name not between data1 and data2 |
in (data...) |
(data...) 中存在 |
col_name in (data1 , data2 ) |
not in (data...) |
(data...) 中不存在 |
col_name not in (data1 , data2 ) |
like |
模糊查询,需要通配符,没有用通配符等价于 = | col_name like data可使用通配符 |
not like |
模糊查询取反 | col_name not like data可使用通配符 |
regexp |
正则表达式 | col_name regexp data可使用正则表达式 |
not regexp |
正则表达式取反 | col_name not regexp data可使用正则表达式 |
通配符%
表示0个或多个字符
通配符_
表示一个字符
在我目前看来 not
就是取反
简单说,就是去重 , 它会根据col
去排除重复行,后返回结果集
例: select
distinct
col_name,...
from
table
col1 | col2 |
---|---|
1 | a |
1 | b |
select distinct col1 from table1
//返回
// col1
// 1
select distinct col1,col2 from table1
//返回
// col1 | col2
// 1 | a
// 1 | b
//虽然 col1 重复,但是 col1 + col2 这一行不重复
就是 结果集 排序
例:select
col_name,...
from
table
order by
语句
关键字 | 说明 | 例子 |
---|---|---|
asc |
升序 | order by col_name asc |
desc |
降序 | order by col_name desc |
limit data_number |
指定只返回data_number 行结果 |
order by col_name limit data_number |
offset data_number |
指定从data_number 开始返回,需要和limit 一起使用 |
order by col_name limit data_number offset data_number |
连接其他table,进行多表联合查询
tableA
连接 tableB
例: select
col_name,...
from
tableA
inner/left/right/full
join
tableB
on
tableA_col_id
= tableB_col_id
inner join
保留tableA
和tableB
的交集
left join
优先保留tableA
,不管tableB
的死活,也就是如果tableB
没有和tableA
出现交集,那么tableB
的数据就没有机会表现
right join
优先保留tableB
,不管tableA
的死活
full join
我全都要!tableA
和tableB
的数据全部保留,不管有没有匹配上
别名
比如这个的第一题
select id,title, (Domestic_sales+International_sales)/1000000 as 销售总额
from movies as m
join boxoffice as b on m.id = b.Movie_id ;
顺便放一下第四题答案,希望能提供给大家一点理解
SELECT title, (Domestic_sales+International_sales)/Length_minutes as sale_value
FROM movies as m
join boxoffice as b on m.id = b.Movie_id
where Director="John Lasseter"
order by sale_value desc limit 3;
分组
例: select
col_name,...
from
table
group by
col_group_name,...
分组会根据col_group_name
中重复的数据分到一个组里
比如:
col1 | col2 |
---|---|
1 | a |
1 | b |
1 | c |
2 | d |
2 | e |
select col1,count(*) as 计数 from table1 group by col1
//返回
// col1 | 计数
// 1 | 3
// 2 | 2
//你应该看出来了,它会分成
// 1 -> [a,b,c]
// 2 -> [d,e]
看个题目(第四题)加深理解
当时卡了几分钟,就是因为没有想到用 bn 来分组
select count(*) as count , Role, Building is not null as bn
from employees
group by Role,bn
;
作用于分组后的结果集条件,所以它和 where 的语法一样
例: select
col_name,...
from
table
group by
col_group_name
having
条件
例如: (select ...)
in 当表达式与子查询返回的结果集中的某个值相等时,返回 true ,否则返回 false , not in 取反
例如: select
col_name,...
from
table
where
cor
in/not in
(子查询)
exists 用于判断子查询的结果集是否为空,若子查询的结果集不为空,返回 true,否则返回 false , not exists 取反
(子查询) as table_name
直接看这个吧(点我点我)
--这才是完整的SELECT查询
select distinct column, AGG_FUNC(column_or_expression), …
from mytable
join another_table
on mytable.column = another_table.column
where constraint_expression
group by column
having constraint_expression
order by column asc/desc
limit count offset COUNT;
自学SQL网 (推荐,蛮不错的)