文章目录
null
null比较只能使用 is null 或者 is not null
sql是三值逻辑,任何值和null比较时(包括null和null比较时)都会用 unknown进行比较导致错误
如LeetCode 584 寻找用户推荐人这个题
like
like可以模糊查找
% 表示任意长度字符串
_ 表示任意单个长度字符串
如name like"%张%",表示任意名字里有张, 同样也有 not like
distinct
逻辑运算
和其他的语言的与或非差别不大
DISTINCT
distinct 相当于一个去重的操作,可以接多个变量,表示对多个变量的组合去重,但是在hive里尽量少用,因为会只有一个reduce很慢
select DISTINCT name from student; --对名字去重相同名字的只会出现一次
select DISTINCT name,class from student; --名字和班级都相同的数据只会出现一次
排序
order by 字段1 [升序/降序], 字段2 [升序/降序], ...
默认是asc(升序排列),需要降序排列可以加 desc
limit
-- LIMIT 后只跟一个整数,表示要截断的数据条数(一次获取几条)
select task_name, due_date from tasks limit 2;
-- LIMIT 后跟 2 个整数,依次表示从第几条数据开始、一次获取几条
select task_name, due_date from tasks limit 2, 2;
注意:标号从0开始
case when
select
name,
case
when(age>60) then "老同学"
when(age>20) then "年轻"
else
"小同学"
end as age_level
from student order by name
注意每个列间要加逗号(,)
sql获取时间函数
-- 获取当前日期
SELECT DATE() AS current_date;
-- 获取当前日期时间
SELECT DATETIME() AS current_datetime;
-- 获取当前时间
SELECT TIME() AS current_time;
字符串处理
-- 将姓名转换为大写
SELECT name, UPPER(name) AS upper_name
FROM employees;
-- 计算姓名长度
SELECT name, LENGTH(name) AS name_length
FROM employees;
-- 将姓名转换为小写并进行条件筛选
SELECT name, LOWER(name) AS lower_name
FROM employees;
聚合函数
一般先用 group by分组,之后使用下面的函数在,这些函数每一个组内运用,如果没有group by 就在全部属于用
COUNT:计算指定列的行数或非空值的数量。
SUM:计算指定列的数值之和。
AVG:计算指定列的数值平均值。
MAX:找出指定列的最大值。
MIN:找出指定列的最小值。
和distinct配合可以查比如每个班级学生有多少()
join
cross join
直接笛卡尔积
inner join(join)
返回匹配的行,用 on表示匹配条件
outer join
left join和right join
返回左(右)表里的所有行和另外一个表里匹配的行,同样用on加匹配条件
子查询
-- 主查询
SELECT name, total_amount
FROM customers
WHERE customer_id IN (
-- 子查询
SELECT DISTINCT customer_id
FROM orders
WHERE total_amount > 200
);
使用in关键字和另外一个完整的表可以选择查询特定的信息,当然select的子查询也可以用作join
exists
可以使用
-- 主查询
SELECT name, total_amount
FROM customers
WHERE EXISTS (
-- 子查询
SELECT 1
FROM orders
WHERE orders.customer_id = customers.customer_id
);
查询特定的信息
组合查询
UNION 操作:它用于将两个或多个查询的结果集合并, 并去除重复的行 。即如果两个查询的结果有相同的行,则只保留一行。
UNION ALL 操作:它也用于将两个或多个查询的结果集合并, 但不去除重复的行 。即如果两个查询的结果有相同的行,则全部保留。
可以把多个select的结果合并
-- UNION ALL操作
SELECT name, age, department
FROM table1
UNION ALL
SELECT name, age, department
FROM table2;