HiveQL的基础操作全集

第一章:sql数据操作和查询

– 1.语句命令组成:

 1. 数据定义语言(ddl),包括create(创建)命令、alter(修改)命令、drop(删除)命令等。     -- 主要针对对象的结构
        
 2. 数据操纵语言(dml),包括insert(插入)命令、update(更新)命令、delete(删除)命令等。  -- 主要针对表

 3. 数据查询语言(dql),包括基本查询语句、order by子句、group by子句等。

 4. 事务控制语言(tcl),包括commit(提交)命令、rollback(回滚)命令。

 5. 数据控制语言(dcl),grant(授权)命令、revoke(撤销)命令。

– 2.查询结构

   select *|列名|表达式 from 表名 where 条件 group by 列名 having 条件 order by 列名 [asc/desc]  -- * 表示所有的列名称; asc 升序(默认),desc 降序

– 3.查询顺序

   select     字段或表达式(多个字段用逗号隔开)                                       -- 5
   from       表(视图或者数据集)                                                     -- 1
   where      字段的限定(多个限定用or或者and隔开,后面不能跟聚合函数)                 -- 2
   group by   字段或表达式(多个字段用逗号隔开)                                       -- 3
   having     表达式(前面必须有group by,多个表达式用or或者and隔开)                    -- 4
   order by   字段或表达式(多个字段用逗号隔开,如col1 asc, col2 desc或者1 asc,2 desc) -- 6

– 虚拟表

select 10/2 from dual;
select 1 as 数字1, '1' as 字符1 from dual;

-- select 中有*时候,并且还有其它字段或表达式,必需在*号前加表名.或表别名.
select sysdate as 当前日期,t.* from student_info t;  -- 列别名可以加as , 表的别名不能加as

– 4.聚合函数

聚合函数:聚合函数同时可以对多行数据进行操作,并返回一个结果。
聚合函数与group by 使用(字段需要分组,聚合函数必须要跟group by 联用)
注意:select 中除了聚合函数包裹的内容,其它字段必须包含于group by 后面的字段,select 只是选取聚合后的字段和值

avg	     平均值
sum	     求和
min、max 最小值、最大值
count	 统计个数


-- 计算员工表的总体平均工资、总工资、总人数、工龄最大和最小的入职日期
select avg(sal) as 平均工资,
	   sum(sal) as 总工资,
	   count(empno) as 总人数,
	   min(hiredate) as 最早入职日期,
	   max(hiredate) as 最晚入职日期
  from emp;
  
  
-- 每个部门的平均工资、总工资、总人数、工龄最大和最小的入职日期
select deptno,
       avg(sal) as 平均工资,
	   sum(sal) as 总工资,
	   count(empno) as 总人数,
	   min(hiredate) as 最早入职日期,
	   max(hiredate) as 最晚入职日期
  from emp
 group by deptno; 
 
 
-- 按照部门编号和工作类型分组统计人数
select deptno,job,
	   count(empno)
  from emp
 group by deptno,job;
 


-- count对列和对*的区别(count对列时,有空值的列不会计数)  

select count(*), --15
count(1), --15
count(1000), --15
count(comm), --4 – 不计算空值
count(job), --15
count(distinct job) – 6 – 去重
from emp;

– 5.操作符

算术运算,关系运算,和逻辑运算
   (1)算术运算: +-*/
	  select e.*, (nvl(e.sal,0)+nvl(e.comm,0))*12 as 年薪 
		from emp e;
   (2)关系运算: =!=<>>>=<<=
	  select * from emp where empno=7369;
   (3)逻辑运算: not>and>or
	  select (case when 1=1 or 1=3 and 1=2
				   then 1
				   else 2 
			  end) as flag
		from dual;  -- 1

– 6.null操作(’’,null)

在查询条件中null值用is null作条件,非null值用 is not null做条件
空值的一些特性:
1、空值跟任何值进行算术运算,得到的结果都为空值
2、空值跟任何值进行关系运算,得到的结果都为不成立
3、空值不参与任何聚合运算
4、排序的时候,空值永远是最大的
-- 查询奖金为空
select * from emp where comm is null;
-- 1
select e.*, comm+100, sal + comm from emp e;
-- 2
select * from emp where comm<>0;
-- 3
select count(comm) from emp;
-- 4
select * from emp order by comm asc;

– 7.去重(distinct, group by, rowid)

-- 查看部门编号(去重)
	select distinct deptno from emp;
	select deptno from emp group by deptno;
-- distinct 只能出现在最前,不能一个字段去重一个字段不去重
select distinct job, deptno from emp;
select job, deptno from emp group by job, deptno;
-- 错误1
select job,
       distinct deptno
  from emp;
-- 错误2
select distinct job,
       distinct deptno
  from emp;

– 8.in 操作

查询出工作职责是'salesman'或者'president'或者'analyst'的员工信息。
 	select ename,job from emp where job = 'salesman' or job = 'president' or job = 'analyst';
	select ename,job from emp where job in ('salesman','president','analyst');
    select ename,job from emp where job = any('salesman','president','analyst'); -- 不建议这种写法

– 9.between…and…(包含边界从小到大顺序)

查询列值包含在指定区间内的行,包含边界。
查询工资大于等于1500且小于等于2000的员工信息。
select *
  from emp
 where sal >=1500 and sal <=2000;
 
select *
  from emp
 where sal between 1500 and 2000;
 
查询工资在1500到2000之间的员工信息
select *
  from emp
 where sal >1500 and sal <2000;
 
-- 查询不到值
select *
  from emp
 where sal between 2000 and 1500;

– 10.like模糊查询(对字符串)

字符匹配操作可以使用通配符'%'和'_':
  %:代表任意个字符。
  _:代表任意一个字符。 
	select * from student_info where sname like '李_';
	select * from student_info where sname like '李_%';
	select * from student_info where sname like '李__';

– 11.集合运算

交集:intersect              -- 两者共有部分
并集(去重):  union        
并集(不去重):union all    
补集:minus                  -- 前者有后者无
当使用集合操作的时候,要注意:
1.查询所返回的列数以及列的类型必须匹配,列名可以不同。
2.只有union all不会去重。其他三个都需要排序后去重,性能比较差



例题:
1.求员工表和部门表中的共有的部门编号(去重)
select deptno
  from emp
intersect
select deptno
  from dept;
  
  
2.求员工表或者部门表中所包含的部门编号(不去重)
select deptno
  from emp
 union all 
select deptno
  from dept;

3.求员工表或者部门表中所包含的部门编号(去重)
select deptno
  from emp
 union
select deptno
  from dept;

4.求部门表中不在员工表中的部门编号
select deptno
  from dept
 minus
select deptno
  from emp;
-- 
select deptno 
  from emp
minus
select deptno
  from dept;

– 12.子查询

    子查询在select、update、delete语句内部可以出现select语句。
    1.单行子查询:不向外部返回结果,或者只返回一行结果。
    2.多行子查询:向外部返回零行、一行或者多行结果。
	-- 单行查询
	select * from emp where empno=7369;
	-- 多行查询
	select * from emp where deptno=10;
	-- 查询工资和7369相同的员工信息
    select * from emp where sal = (select sal from emp where empno=7369);     -- 单行结果"=",并且字段要对应
	-- 查询工资和10号部门员工工资相同的其它部门的员工信息
    select * from emp where sal in (select sal from emp where deptno = 10) and deptno <> 10;   -- 单行结果"in",并且字段要对应
    select * from emp where sal = any(select sal from emp where deptno = 10) and d
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值