DQL数据查询
set hive.fetch.task.conversion=more; -- 避免触发MR job
select distinct name from employee_id limit 2; -- limit: 随机取出
-- nested SELECT
with t1 as ( -- 第一种方式 nested SELECT using CTE
select * from employee_id
where gender_age.gender = "Male"
)
select name, gender_age.age, gender_age.gender from t1;
select name, gender_age.age, gender_age.gender from ( -- 第二种方式 using nested SELECT after the FROM statement. 更快
select * from employee_id
where gender_age.gender = "Male"
) t1; --given alias
-- where从句中的子查询。
-- 1) IN, NOT IN 仅支持单个字段:
select name, gender_age.age, gender_age.gender -- 会使用MR job,极其耗时
from employee_id t1
where t1.gender_age in ( -- where中限定字段的表名要使用别称
select gender_age from employee_id
where gender_age.gender = "Male"
);
-- 2) EXIT, NOT EXIT
select name, gender_age.age, gender_age.gender -- 会使用MR job,极其耗时
from employee_id t1
where exists ( -- 子查询必须同时指向内部和外部表
select * from employee_id t2
where t1.gender_age.gender = t2.gender_age.gender and t2.gender_age.gender = "Male"
);
create table employee_hr (
name string,
employee_id int,
sin_number string,
start_date date
)
row format delimited
fields terminated by "|"
stored as textfile;
-- 内连接:hive不支持unequal join
select emp01.name, emp02.sin_number
from employee_id emp01 -- m ∩ n
join employee_hr emp02 on emp01.name = emp02.name;
select emp01.name, emp02.sin_number
from employee_id emp01, employee_hr emp02 where emp01.name = emp02.name;
-- 自联接:查询出同一天Apple和IBM的股价
SELECT a.ymd, a.price_close, b.price_close
FROM stocks a JOIN stocks b ON a.ymd = b.ymd
WHERE a.symbol = 'AAPL' AND b.symbol = 'IBM';
-- 三表联接
select emp01.name, emp02.employee_id, emp01.sin_number
from employee_hr emp01
join employee_id emp02 on emp01.name = emp02.name
join employee_id emp03 on emp02.employee_id = emp03.employee_id;
-- 外连接和交叉联接
join不支持交换律,且始终为左结合
所有join均为:cross join 产生笛卡尔积
--outer join: left join, right join, full join
-- cross join
set hive.strict.checks.cartesian.product=false;
set hive.mapred.mode=nonstrict;
1.
select e1.name, e2.sin_number
from employee e1
join employee_hr e2; -- 若不加条件,则join为交叉联接
2.
select e1.name, e2.sin_number
from employee e1
join employee_hr e2 on 1 = 1; -- 或者联接条件始终返回true,也为交叉联接
-- unqual join
select e1.name, e2.sin_number
from employee e1
cross join employee_hr e2 -- join始终在where之前发生
where e1.name <> e2.name;
-- mapjoin
set hive.auto.convert.join=true; -- hive自动将join转化为map join。
-- regular map-side join
select /*+ mapjoin(employee) */ emp01.name, emp02.sin_number
from employee emp01
cross join employee_hr emp02
where emp01.name <> emp02.name;
-- bucket map join:
set hive.optimize.bucketmapjoin = true; -- 开启bucket map join
set hive.optimize.bucketmapjoin.sortedmerge = true;
set hive.input.format = org.apache.hadoop.hive.ql.io.BucketizedHiveInputFormat; -- 开启sort-merge join,要求两表有相同的桶数
-- 获取两表的交集并从交集中查询出a表的name字段:
select a.name
from employee a
where exists (
select * from employee_id ei where a.name = ei.name
);
-- left semi join中select和where从句不能引用右侧表的字段,其比内联接更为高效,因为内联接在m * n数集中查询,而左半联接则是若右表满足联接条件,则返回左表中的记录。
-- hive中无右半联接
select a.name
from employee a
left semi join employee_id ei on a.name = ei.name;
-- union all 垂直操作结果集,包含重复元素
select a.name
from employee a
union all -- 用在外层查询
select b.name
from employee_hr b;
-- 类似于union(去重)
select distanct name
from ( -- union all的子查询中要求:两子查询的字段数相同,并且相同位置的字段类型也相同。
select a.name as name
from employee a
union all
select b.name as name
from employee_hr b
) u1; -- 必须给定查询结果的别名
DQL数据查询的更多相关文章
- oracle学习笔记(四) DQL数据查询语言和TCL 事务控制语言
DML 数据管理语言 Data manage language insert, update, delete以及select语句,不过,有人也把select单独出来,作为DQL 数据查询语言 data ...
- Hive(五)【DQL数据查询】
目录 一. 基本查询 1.1 算数运算符 1.2 常用聚合函数 1.3 limit 1.4 where 1.5 比较运算符(between|in|is null) 1.6 LIKE和RLIKE 1.7 ...
- MySQL单表数据查询(DQL)
数据准备工作: CREATE TABLE student( sid INT PRIMARY KEY AUTO_INCREMENT, sname ), age TINYINT, city ), scor ...
- mysql 数据查询全讲
数据查询 涉及到DQL(Data Query Language)是sql语句的一类 本文全面介绍了mysql下 select 语句的各种查询方式:普通查询,模糊查询,查询排序,分页查询,聚合函数查询 ...
- MySql学习笔记(一)之DQL常用查询
MySql学习笔记(一)之DQL常用查询 前言:mysql是中小型的数据库软件,SQL语言分为DDL,DCL,DML,DQL四种,在这里重点讲解DQL的单表查询. 正文:在学习mysql单表查询之前, ...
- MySQL(4)— 数据查询
四.数据查询(DQL) 4-1.查询指定字段 select 完整 语法: select [distinct] 字段名1 [as] [别名],字段名2 [as] [别名] from 表1 [ left ...
- Django models .all .values .values_list 几种数据查询结果的对比
Django models .all .values .values_list 几种数据查询结果的对比
- MVC实用架构设计(三)——EF-Code First(4):数据查询
前言 首先对大家表示抱歉,这个系列已经将近一个月没有更新了,相信大家等本篇更新都等得快失望了.实在没办法,由于本人水平有限,写篇博客基本上要大半天的时间,最近实在是抽不出这么长段的空闲时间来写.另外也 ...
- 关系数据库SQL之高级数据查询:去重复、组合查询、连接查询、虚拟表
前言 接上一篇关系数据库SQL之基本数据查询:子查询.分组查询.模糊查询,主要是关系型数据库基本数据查询.包括子查询.分组查询.聚合函数查询.模糊查询,本文是介绍一下关系型数据库几种高级数据查询SQL ...
随机推荐
- ansible之基本原理及命令
什么是ansible ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(\(puppet.chef.func.fabric\))的优点,实现了批量系统配置.批量程序部署 ...
- java时间操作工具类
import java.sql.Timestamp;import java.text.DateFormat;import java.text.ParseException;import java.te ...
- c++11 实现RAII特性
参考文章https://blog.csdn.net/pongba/article/details/7911997 什么是RAII 技术?(参见百度百科相关条目) RAII(Resource Acqui ...
- poj2312 Battle City 【暴力 或 优先队列+BFS 或 BFS】
题意:M行N列的矩阵.Y:起点,T:终点.S.R不能走,走B花费2,走E花费1.求Y到T的最短时间. 三种解法.♪(^∇^*) //解法一:暴力 //157MS #include<cstdio& ...
- interaction-oriented architecture - MVC
MVC(Model-View-Controller),它是专门针 对交互系统提出的,所以如果我们要构建一个交互系统,那么我们就可以直接应用MVC模式,然后 在该模式所搭建的场景的启发下去发现Model ...
- BZOJ1614:[USACO]Telephone Lines架设电话线(二分,最短路)
Description FarmerJohn打算将电话线引到自己的农场,但电信公司并不打算为他提供免费服务.于是,FJ必须为此向电信公司 支付一定的费用.FJ的农场周围分布着N(1<=N< ...
- 树莓派图形界面启动chromium并全屏
方法1. 随便一搜都是这种方法 创建文件: /home/pi/.config/autostart/my.desktop 文件名随意, 后缀必须.desktop 文件内容: [Desktop ...
- Mac--查看公钥
打开macbook的终端输入以下命令: $ cd ~/.ssh $ ls $ cat id_rsa.pub
- HDU 1024 Max Sum Plus Plus(m个子段的最大子段和)
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1024 Max Sum Plus Plus Time Limit: 2000/1000 MS (Java/ ...
- HDU 1013 Digital Roots(to_string的具体运用)
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1013 Digital Roots Time Limit: 2000/1000 MS (Java/Othe ...