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数据查询的更多相关文章

  1. oracle学习笔记(四) DQL数据查询语言和TCL 事务控制语言

    DML 数据管理语言 Data manage language insert, update, delete以及select语句,不过,有人也把select单独出来,作为DQL 数据查询语言 data ...

  2. Hive(五)【DQL数据查询】

    目录 一. 基本查询 1.1 算数运算符 1.2 常用聚合函数 1.3 limit 1.4 where 1.5 比较运算符(between|in|is null) 1.6 LIKE和RLIKE 1.7 ...

  3. MySQL单表数据查询(DQL)

    数据准备工作: CREATE TABLE student( sid INT PRIMARY KEY AUTO_INCREMENT, sname ), age TINYINT, city ), scor ...

  4. mysql 数据查询全讲

    数据查询 涉及到DQL(Data Query Language)是sql语句的一类 本文全面介绍了mysql下 select 语句的各种查询方式:普通查询,模糊查询,查询排序,分页查询,聚合函数查询  ...

  5. MySql学习笔记(一)之DQL常用查询

    MySql学习笔记(一)之DQL常用查询 前言:mysql是中小型的数据库软件,SQL语言分为DDL,DCL,DML,DQL四种,在这里重点讲解DQL的单表查询. 正文:在学习mysql单表查询之前, ...

  6. MySQL(4)— 数据查询

    四.数据查询(DQL) 4-1.查询指定字段 select 完整 语法: select [distinct] 字段名1 [as] [别名],字段名2 [as] [别名] from 表1 [ left ...

  7. Django models .all .values .values_list 几种数据查询结果的对比

    Django models .all .values .values_list 几种数据查询结果的对比

  8. MVC实用架构设计(三)——EF-Code First(4):数据查询

    前言 首先对大家表示抱歉,这个系列已经将近一个月没有更新了,相信大家等本篇更新都等得快失望了.实在没办法,由于本人水平有限,写篇博客基本上要大半天的时间,最近实在是抽不出这么长段的空闲时间来写.另外也 ...

  9. 关系数据库SQL之高级数据查询:去重复、组合查询、连接查询、虚拟表

    前言 接上一篇关系数据库SQL之基本数据查询:子查询.分组查询.模糊查询,主要是关系型数据库基本数据查询.包括子查询.分组查询.聚合函数查询.模糊查询,本文是介绍一下关系型数据库几种高级数据查询SQL ...

随机推荐

  1. mac crontab

    1.前提工作 正常情况下mac普通用户是无法使用crontab的,需要做如下修改: 在~/.vimrc下添加这么一行: autocmd filetype crontab setlocal noback ...

  2. .NET ->> 分享一个字符串模糊匹配指数的方法

    链接: http://www.tsjensen.com/blog/post/2011/05/27/Four+Functions+For+Finding+Fuzzy+String+Matches+In+ ...

  3. 如何让LoadRunner实现多个场景运行?

    如何让LoadRunner实现多个场景运行? 发布时间: 2013-11-29 10:59    作者: stevenlee    来源: 51Testing软件测试网博客 字体:  小  中  大  ...

  4. Docker的安装及加速

    使用 yum 安装(CentOS 7下) Docker 要求 CentOS 系统的内核版本高于 3.10 ,查看本页面的前提条件来验证你的CentOS 版本是否支持 Docker . 通过 uname ...

  5. 08提权 系统文件权限和远程连接IP绕过 安装后门

    大家都知道08权限的系统权限设置很严格  面对限制IP连接的情况 我们及时拿到system权限 有账号也上不去这种情况下只能弄shift后门 或者放大镜了  但08权限 在system权限也操作不了系 ...

  6. c++ auto_ptr超简易版实现

    namespace wang{ template<class T> class shared_ptr{ public: explicit shared_ptr(T *p) : count( ...

  7. SG函数&&SG定理

    必胜点和必败点的概念:        P点:必败点,换而言之,就是谁处于此位置,则在双方操作正确的情况下必败.        N点:必胜点,处于此情况下,双方操作均正确的情况下必胜. 必胜点和必败点的 ...

  8. generator 函数

    可以看做一个状态机, 生成的是一个迭代器对象, 可以用来遍历状态机里面的各种状态 创建方式 在函数名前面添加 * , 内部使用 yeild 来标注状态 特性 yield 只能在 generator 中 ...

  9. 【题解】洛谷P3435 [POI2006] OKR-Periods of Words(KMP)

    洛谷P3435:https://www.luogu.org/problemnew/show/P3435 思路 来自Kamijoulndex大佬的解释 先把题面转成人话: 对于给定串的每个前缀i,求最长 ...

  10. .net MVC 页面页面跳转后提示消息实现办法

    mvc在RedirectToAction之后,会清理掉ViewData中的所有数据,因此通过ViewData给下一个页面传递提示消息不太好,如果是通过参数方式传递,刷新跳转后的页面时,消息还会再次提示 ...