大数据学习之 SQL 语法知识点!——Part.2
小职 2020-12-04 来源 : 阅读 915 评论 0

摘要:本篇主要总结了大数据学习过程中SQL语法知识点,针对关系型数据库的一般语法,侧重于说明用法,希望对大数据的学习有所帮助。

本篇主要总结了大数据学习过程中SQL语法知识点,针对关系型数据库的一般语法,侧重于说明用法,希望对大数据的学习有所帮助。

大数据学习之 SQL 语法知识点!——Part.2


本文SQL语法知识点Part2,没有看过Part1的小伙伴找大数据学习之 SQL 语法知识点!——Part.1复习


4

连接和组合

1. 连接(JOIN)

如果一个 JOIN 至少有一个公共字段并且它们之间存在关系,则该 JOIN 可以在两个或多个表上工作。

连接用于连接多个表,使用 JOIN 关键字,并且条件语句使用 ON 而不是 WHERE。

JOIN 保持基表(结构和数据)不变。

JOIN 有两种连接类型:内连接和外连接。

内连接又称等值连接,使用 INNER JOIN 关键字。在没有条件语句的情况下返回笛卡尔积。

自连接可以看成内连接的一种,只是连接的表是自身而已。

自然连接是把同名列通过 = 测试连接起来的,同名列可以有多个。

内连接 vs 自然连接

内连接提供连接的列,而自然连接自动连接所有同名列。

外连接返回一个表中的所有行,并且仅返回来自次表中满足连接条件的那些行,即两个表中的列是相等的。外连接分为左外连接、右外连接、全外连接(Mysql 不支持)。

左外连接就是保留左表没有关联的行。

右外连接就是保留右表没有关联的行。

连接 vs 子查询

连接可以替换子查询,并且比子查询的效率一般会更快。


内连接(INNER JOIN)

SELECT vend_name, prod_name, prod_price
FROM vendors INNER JOIN products
ON vendors.vend_id = products.vend_id;


自连接

SELECT c1.cust_id, c1.cust_name, c1.cust_contact
FROM customers c1, customers c2
WHERE c1.cust_name = c2.cust_name
AND c2.cust_contact = 'Jim Jones';


自然连接(NATURAL JOIN)

SELECT *
FROM Products
NATURAL JOIN Customers;


左连接(LEFT JOIN)

SELECT customers.cust_id, orders.order_num
FROM customers LEFT JOIN orders
ON customers.cust_id = orders.cust_id;


右连接(RIGHT JOIN)

SELECT customers.cust_id, orders.order_num
FROM customers RIGHT JOIN orders
ON customers.cust_id = orders.cust_id;


2. 组合(UNION)


UNION 运算符将两个或更多查询的结果组合起来,并生成一个结果集,其中包含自 UNION 中参与查询的提取行。

UNION 基本规则

所有查询的列数和列顺序必须相同。

每个查询中涉及表的列的数据类型必须相同或兼容。

通常返回的列名取自第一个查询。

默认会去除相同行,如果需要保留相同行,使用 UNION ALL。

只能包含一个 ORDER BY 子句,并且必须位于语句的最后。

应用场景

在一个查询中从不同的表返回结构数据。

对一个表执行多个查询,按一个查询返回数据。


组合查询

SELECT cust_name, cust_contact, cust_email
FROM customers
WHERE cust_state IN ('IL', 'IN', 'MI')
UNION
SELECT cust_name, cust_contact, cust_email
FROM customers
WHERE cust_name = 'Fun4All';

JOIN vs UNION

JOIN 中连接表的列可能不同,但在 UNION 中,所有查询的列数和列顺序必须相同。

UNION 将查询之后的行放在一起(垂直放置),但 JOIN 将查询之后的列放在一起(水平放置),即它构成一个笛卡尔积。


5

函数

‼  注意:不同数据库的函数往往各不相同,因此不可移植。本节主要以 Mysql 的函数为例。


1. 文本处理

其中, SOUNDEX() 可以将一个字符串转换为描述其语音表示的字母数字模式。

SELECT *
FROM mytable
WHERE SOUNDEX(col1) = SOUNDEX('apple')


2. 日期和时间处理

日期格式:YYYY-MM-DD

时间格式:HH:MM:SS

mysql> SELECT NOW();

2018-4-14 20:25:11


3. 数值处理

4. 汇总

AVG() 会忽略 NULL 行。


使用 DISTINCT 可以让汇总函数值汇总不同的值。

SELECT AVG(DISTINCT col1) AS avg_col
FROM mytable


6

排序和分组

1. ORDER BY

ORDER BY 用于对结果集进行排序。

ASC :升序(默认)

DESC :降序

可以按多个列进行排序,并且为每个列指定不同的排序方式


指定多个列的排序方向

SELECT * FROM products
ORDER BY prod_price DESC, prod_name ASC;


2. GROUP BY

GROUP BY 子句将记录分组到汇总行中。

GROUP BY 为每个组返回一个记录。

GROUP BY 通常还涉及聚合:COUNT,MAX,SUM,AVG 等。

GROUP BY 可以按一列或多列进行分组。

GROUP BY 按分组字段进行排序后,ORDER BY 可以以汇总字段来进行排序。


分组

SELECT cust_name, COUNT(cust_address) AS addr_num
FROM Customers GROUP BY cust_name;


分组后排序

SELECT cust_name, COUNT(cust_address) AS addr_num
FROM Customers GROUP BY cust_name
ORDER BY cust_name DESC;


3. HAVING

HAVING 用于对汇总的 GROUP BY 结果进行过滤。

HAVING 要求存在一个 GROUP BY 子句。

WHERE 和 HAVING 可以在相同的查询中。

HAVING vs WHERE

WHERE 和 HAVING 都是用于过滤。

HAVING 适用于汇总的组记录;而 WHERE 适用于单个记录。


使用 WHERE 和 HAVING 过滤数据

SELECT cust_name, COUNT(*) AS num
FROM Customers
WHERE cust_email IS NOT NULL
GROUP BY cust_name
HAVING COUNT(*) >= 1;


7

数据定义

DDL 的主要功能是定义数据库对象(如:数据库、数据表、视图、索引等)。


1. 数据库(DATABASE)


创建数据库

CREATE DATABASE test;


删除数据库

DROP DATABASE test;


选择数据库

USE test;


2. 数据表(TABLE)

创建数据表

普通创建

CREATE TABLE user (
 id int(10) unsigned NOT NULL COMMENT 'Id',
 username varchar(64) NOT NULL DEFAULT 'default' COMMENT '用户名',
 password varchar(64) NOT NULL DEFAULT 'default' COMMENT '密码',
 email varchar(64) NOT NULL DEFAULT 'default' COMMENT '邮箱'
) COMMENT='用户表';

根据已有的表创建新表

CREATE TABLE vip_user AS
SELECT * FROM user;


删除数据表

DROP TABLE user;


修改数据表

添加列

ALTER TABLE user
ADD age int(3);


删除列

ALTER TABLE user
DROP COLUMN age;


修改列

ALTER TABLE `user`
MODIFY COLUMN age tinyint;


添加主键

ALTER TABLE user
ADD PRIMARY KEY (id);


删除主键

ALTER TABLE user
DROP PRIMARY KEY;


3. 视图(VIEW)

定义

视图是基于 SQL 语句的结果集的可视化的表。

视图是虚拟的表,本身不包含数据,也就不能对其进行索引操作。对视图的操作和对普通表的操作一样。


作用

简化复杂的 SQL 操作,比如复杂的联结

只使用实际表的一部分数据

通过只给用户访问视图的权限,保证数据的安全性

更改数据格式和表示


创建视图

CREATE VIEW top_10_user_view AS
SELECT id, username
FROM user
WHERE id < 10;


删除视图

DROP VIEW top_10_user_view;


4. 索引(INDEX)

作用

通过索引可以更加快速高效地查询数据。

用户无法看到索引,它们只能被用来加速查询

注意

更新一个包含索引的表需要比更新一个没有索引的表花费更多的时间,这是由于索引本身也需要更新。因此,理想的做法是仅仅在常常被搜索的列(以及表)上面创建索引。

唯一索引

唯一索引表明此索引的每一个索引值只对应唯一的数据记录。


创建索引

CREATE INDEX user_index
ON user (id);

创建唯一索引

CREATE UNIQUE INDEX user_index
ON user (id);

删除索引

ALTER TABLE user
DROP INDEX user_index;


5. 约束

SQL 约束用于规定表中的数据规则。

如果存在违反约束的数据行为,行为会被约束终止。

约束可以在创建表时规定(通过 CREATE TABLE 语句),或者在表创建之后规定(通过 ALTER TABLE 语句)。

约束类型

NOT NULL - 指示某列不能存储 NULL 值。

UNIQUE - 保证某列的每行必须有唯一的值。

PRIMARY KEY - NOT NULL 和 UNIQUE 的结合。确保某列(或两个列多个列的结合)有唯一标识,有助于更容易更快速地找到表中的一个特定的记录。

FOREIGN KEY - 保证一个表中的数据匹配另一个表中的值的参照完整性。

CHECK - 保证列中的值符合指定的条件。

DEFAULT - 规定没有给列赋值时的默认值。


创建表时使用约束条件:

CREATE TABLE Users (
 Id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '自增Id',
 Username VARCHAR(64) NOT NULL UNIQUE DEFAULT 'default' COMMENT '用户名',
 Password VARCHAR(64) NOT NULL DEFAULT 'default' COMMENT '密码',
 Email VARCHAR(64) NOT NULL DEFAULT 'default' COMMENT '邮箱地址',
 Enabled TINYINT(4) DEFAULT NULL COMMENT '是否有效',
 PRIMARY KEY (Id)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COMMENT='用户表';




本文由 @小职 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程