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

因为公司有配置好的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
上一篇:SQL-W3School-高级:SQL ALTER TABLE 语句


下一篇:SQL-W3School-高级:SQL AUTO INCREMENT 字段