HIVE安装使用与SQL教程

安装 brew

国内安装brew使用下面的脚本:

/bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"

安装hive

brew install hive

HIVE执行sql语句

hive能直接将sql语句转化为mapreduce代码(下面链接写的非常好)

https://geek-docs.com/hive/hive-tutorial/introduction-of-hive.html
第二张图reduce的过程是拿<x,y>, 每一项的y,分别作为pageid, age

如果我们提交的是查询分析数据的DQL(数据查询语句),Driver就会将该语句提交给自己的编译器Compiler进行语法分析、语法解析、语法优化等一系列操作,最后生成一个MapReduce执行计划。然后根据执行计划生成一个MapReduce的作业,提交给Hadoop MapReduce计算框架处理。

Hive内部预置了很多函数,Hive的执行计划就是根据SQL语句生成这些函数的DAG(有向无环图),然后封装进MapReduce的map和reduce函数中。这个例子中,map函数调用了三个Hive内置函数TableScanOperator、FilterOperator、FileOutputOperator,就完成了map计算,而且无需reduce函数。

Hive和sql区别

https://my.oschina.net/u/3204727/blog/1506599

Hive-sql常见语法

https://blog.csdn.net/u014532291/article/details/105853787

https://blog.csdn.net/helloHbulie/article/details/115376657

因为公司有配置好的HIVE系统,因此其实不必在本机上装。

因此直接去SQL教程

SQL教程

SQL不分大小写

查询和更新指令构成了 SQL 的 DML 部分:

SELECT - 从数据库表中获取数据
UPDATE - 更新数据库表中的数据
DELETE - 从数据库表中删除数据
INSERT INTO - 向数据库表中插入数据

SQL 中最重要的 DDL 语句:

CREATE DATABASE - 创建新数据库
ALTER DATABASE - 修改数据库
CREATE TABLE - 创建新表
ALTER TABLE - 变更(改变)数据库表
DROP TABLE - 删除表
CREATE INDEX - 创建索引(搜索键)
DROP INDEX - 删除索引

SELECT

SELECT LastName,FirstName FROM Persons
#选取所有列
SELECT * FROM Persons
#返回唯一的值
SELECT DISTINCT 列名称 FROM 表名称

Where

SELECT * FROM Persons WHERE City='Beijing'
#关于数值的值
这是正确的:
SELECT * FROM Persons WHERE FirstName='Bush'
SELECT * FROM Persons WHERE Year>1965

AND和OR

#使用括号来一起使用and和or
SELECT * FROM Persons WHERE (FirstName='Thomas' OR FirstName='William')
AND LastName='Carter'

Order by

SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC, OrderNumber ASC

Insert

INSERT INTO Persons (LastName, Address) VALUES ('Wilson', 'Champs-Elysees')

Update

# UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值
UPDATE Person SET Address = 'Zhongshan 23', City = 'Nanjing'
WHERE LastName = 'Wilson'

TOP

#选择开头几个或者开头50%
SELECT TOP 2 * FROM Persons
SELECT TOP 50 PERCENT * FROM Persons

Like

指定pattern

现在,我们希望从上面的 "Persons" 表中选取居住在以 "N" 开始的城市里的人

SELECT * FROM Persons
WHERE City LIKE 'N%'

接下来,我们希望从 "Persons" 表中选取居住在以 "g" 结尾的城市里的人:

SELECT * FROM Persons
WHERE City LIKE '%g

IN

指定选值范围
SELECT * FROM Persons
WHERE LastName IN ('Adams','Carter')

BETWEEN

指定数据范围
SELECT column_name(s)
FROM table_name
WHERE column_name
BETWEEN value1 AND value2
如需以字母顺序显示介于 "Adams"(包括)和 "Carter"(不包括)之间的人,请使用下面的 SQL:
SELECT * FROM Persons
WHERE LastName
BETWEEN 'Adams' AND 'Carter'

ALIAS

表的别名

假设我们有两个表分别是:"Persons" 和 "Product_Orders"。我们分别为它们指定别名 "p" 和 "po"。
现在,我们希望列出 "John Adams" 的所有定单。

SELECT po.OrderID, p.LastName, p.FirstName
FROM Persons AS p, Product_Orders AS po
WHERE p.LastName='Adams' AND p.FirstName='John'

使用别名就是为了好读, 精简sql语句

JOIN

where和join

**where**
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons, Orders
WHERE Persons.Id_P = Orders.Id_P 

**join**
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
INNER JOIN Orders
ON Persons.Id_P = Orders.Id_P
ORDER BY Persons.LastName

inner join:理解为“有效连接”,两张表中都有的数据才会显示
left join:理解为“有左显示”,比如on a.field=b.field,则显示a表中存在的全部数据及a、b中都有的数据,a中有、b中没有的数据以null显示
right join:理解为“有右显示”,比如on a.field=b.field,则显示b表中存在的全部数据及a、b中都有的数据,b中有、a中没有的数据以null显示
full join:理解为“全连接”,两张表中所有数据都显示,实际就是inner +(left-inner)+(right-inner)

join等同于inner join 等同于where

Full join

现在,我们希望列出所有的人,以及他们的定单,以及所有的定单,以及定购它们的人。

SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
FULL JOIN Orders
ON Persons.Id_P=Orders.Id_P
ORDER BY Persons.LastName

FULL JOIN 关键字会从左表 (Persons) 和右表 (Orders) 那里返回所有的行。如果 “Persons” 中的行在表 “Orders” 中没有匹配,或者如果 “Orders” 中的行在表 “Persons” 中没有匹配,这些行同样会列出。

UNION

UNION 操作符用于合并两个或多个 SELECT 语句的结果集。

# 只返回两张表不同的值
SELECT column_name(s) FROM table_name1
UNION
SELECT column_name(s) FROM table_name2
# 返回两张表所有值
SELECT column_name(s) FROM table_name1
UNION ALL
SELECT column_name(s) FROM table_name2

数据库和表

数据库: database

CREATE DATABASE database_name

表: table

本例演示如何创建名为 "Person" 的表。
该表包含 5 个列,列名分别是:"Id_P"、"LastName"、"FirstName"、"Address" 以及 "City":

CREATE TABLE Persons
(
Id_P int,
LastName varchar(255),
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)

NULL

如果表中的某个列是可选的,那么我们可以在不向该列添加值的情况下插入新记录或更新已有的记录。这意味着该字段将以 NULL 值保存。
NULL 值的处理方式与其他值不同。
NULL 用作未知的或不适用的值的占位符。


# 我们如何仅仅选取在 "Address" 列中带有 NULL 值的记录呢?
SELECT LastName,FirstName,Address FROM Persons
WHERE Address IS NULL

# 我们如何选取在 "Address" 列中不带有 NULL 值的记录呢?
SELECT LastName,FirstName,Address FROM Persons
WHERE Address IS NOT NULL

SQL function

SELECT function(列) FROM 表

FIRST() 函数返回指定的字段中第一个记录的值。
提示:可使用 ORDER BY 语句对记录进行排序。

SELECT FIRST(OrderPrice) AS FirstOrderPrice FROM Orders

还有Max, min, sum

Group by

我理解下来就是最后, 展现的是多行分组情况,没有group by就是返回一个数据

Having

在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与合计函数一起使用。

SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name
HAVING aggregate_function(column_name) operator value

现在我们希望查找客户 “Bush” 或 “Adams” 拥有超过 1500 的订单总金额。
我们在 SQL 语句中增加了一个普通的 WHERE 子句:

SELECT Customer,SUM(OrderPrice) FROM Orders
WHERE Customer='Bush' OR Customer='Adams'
GROUP BY Customer
HAVING SUM(OrderPrice)>1500

CASE

判断,如果gender为'男'或'女',分别设置1,最后统计每个年龄段男女人数
select
age,
sum(case gender when '男' then 1 else 0 end) male_count,
sum(case gender when '女' then 1 else 0 end) female_count
from student group by age;

IF

以下代码等价于上面的case when
select
age,
sum(if(gender='男',1,0)) male_count,
sum(if(gender='女',1,0)) female_count
from student group by age;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值