浅学一下SQL - select(查询)

提前

我喜欢用小写
并没有具体分类
我的笔记~所以并不适合学习,适合忘记后快速恢复记忆
边学边更新~
浅看就好

命名

table 代表 表
col 代表列名

col_name1 col_name2
我是数据 我也是数据

data 代表数据,具体是啥数据并不重要

select

select 语句, 通常又称为 查询, 可以通过语句描述我们要取哪些数据,在数据返回前对数据做一些操作等等

where

没错,是条件,不多bb废话
andor用于连接条件
例: 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 data1data2之间,区间是[data1,data2] col_name between data1 and data2
not between data1 and data2 不在data1data2之间,区间同上取反 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就是取反

distinct

简单说,就是去重 , 它会根据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 这一行不重复

order by

就是 结果集 排序
例: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

join

连接其他table,进行多表联合查询

tableA 连接 tableB
例: select col_name,... from tableA inner/left/right/full join tableB on tableA_col_id = tableB_col_id

inner join 保留tableAtableB的交集
left join 优先保留tableA,不管tableB的死活,也就是如果tableB没有和tableA出现交集,那么tableB的数据就没有机会表现
right join 优先保留tableB,不管tableA的死活
full join 我全都要!tableAtableB的数据全部保留,不管有没有匹配上

as

别名
比如这个的第一题

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;

group by

分组

例: 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
;

having

作用于分组后的结果集条件,所以它和 where 的语法一样
例: select col_name,... from table group by col_group_name having 条件

子查询

例如: (select ...)

in | not in

in 当表达式与子查询返回的结果集中的某个值相等时,返回 true ,否则返回 false , not in 取反
例如: select col_name,... from table where cor in/not in (子查询)

exists | not exists

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网 (推荐,蛮不错的)

你可能感兴趣的:(SQL,sql)