小白都能看明白的数据分析入门重点——SQL理论+实操

最近市面上很火的一个行业——数据分析师,作为数据分析师,感觉像是一个很高大上的工作岗位,之前的时候有同学毅然决然的投身其中,这不,这几天闲聊,我就问他你们都干嘛啊,他说:没想到换了工作,SQL还是常用的工具,我就问他为什么?他说常规的数据分析,有什么比数据库好用,大数据量的数据分析,像hive、sparkSQL又都支持sql操作,所以sql还是占用了很大一部分空间

快挂电话的时候这老小子跟我说:我知道你小子SQL好,快点给我整理一下SQL 的相关知识,我正好最近接了一个“私教”的活,也需要一套系统的“授课”体系,也就顺手一起整理一下吧

适应人群

1、刚开始学习的小白:这是5天的“私教”课程,我教自家的小外甥的,他也是计算机系的学生

2、工作有一段时间想要巩固一下基础的,建议也能回忆一下,我当时整理的时候发现很多都开始遗忘了,除了常用的

注:篇幅太长,我分两篇文章进行整理,需要更完整的文档的,敬请期待

1 sql基础讲解

着重介绍数据库的定义语言,操纵语言,数据控制语言和事物控制语言。

数据库定义语言(DDL,Data Definition Language)是负责数据的模式定义与数据的物理存取构建,说白了CREATE建表语句,ALTER 更新表结构语句,DROP 删除语句

CREATE建表语句

	//创建表的基本语句:create table 表名(字段名 类型,字段名 类型,字段名 类型....)#创建学生表:学号,姓名,性别,年龄,qq号,邮箱。create table student(snum number(10),//指定学号的数字长度为10sname varchar2(100),//指定姓名的存储上限为100个字节sex char(4),age number,qq number,sal number(6,2),//指定工资的整数位为6和小数位为2mail varchar2(50))

Drop删除表

#删除表:DROP TABLE 表名;
drop table dept

ALTER更新表结构

	#添加新字段  alter table 表名 add 字段名 类型alter table student add phone number(11)#修改字段类型     alter table 表名 modify 字段名 类型alter table  student modify sname varchar2(200)#删除字段    alter table 表名 drop column 字段名alter table student drop column phone

数据操纵语言

数据操纵语言(DML,Data Manipulation Language):负责数据的操纵,包括查询及增、删、改等操作,SELECT(选择),DELETE(删除),UPDATE(更新),INSERT(插入)四类语法。

SELECT(选择)

SELECT说起来大家都不陌生,它是SQL中最常见的语法,主要用法是从数据表中选择你想要的那几列数据,因为select相对应的知识点真的太多了,后面单独那一章来给大家进行整理

#删除表:DROP TABLE 表名;
drop table dept
#删除数据:delete 表名 where 条件
delete dept where deptno='70'
delete from dept //删除所有数据

DELETE(删除)

DELETE删除行,甚至删除所有的行,但是并不删除表本身。如果要快速删除所有行,可以使用TRUNCATE TABLE语句,因为不记录数据变动。下面举几个例子。

#删除数据:delete 表名 where 条件
delete dept where deptno='70'
delete from dept //删除所有数据

UPDATE(更新)

UPDATE(更新)由三部分组成,分别是要更新的表,列名和他们的新值,确定要更新那些行的过滤条件。

#更新一列
UPDATE Customers SET cust_email = 'kim@thetoystore.com' WHERE cust_id = '1000000005'; 
#更新多列
UPDATE Customers SET cust_contact = 'Sam Roberts',  cust_email = 'sam@toyland.com' WHERE cust_id = '1000000006'; 
#删除某列,删除某列可以将该列设为null
UPDATE Customers SET cust_email = NULL WHERE cust_id = '1000000005';
#更新表中所有的行
UPDATE Customers SET cust_email = 'kim@thetoystore.com' 

INSERT(插入)

INSERT插入可以在数据表中插入完整的行,插入行的一部分,插入某些查询结果,下面我们将会给出几个例子进行说明。

/*1、语法规范  insert into 表名(字段1,字段2,字段3,....)values('值1','值2','值3'.....)2、主键:用来唯一标识一条数据的字段通常设置主键,主键是唯一不可以重复的3、如果插入的数据是全字段数据,字段可以省略不写。部分字段,必须加上字段说明和字段值,但是主键不能为空
*/#在北京新建了一个名为LOL学院的新部门,请插入insert into dept(deptno,dname,loc)values('50','lol学院','北京');insert into dept values('80','教学部','北京');#插入某些查询结果INSERT INTO Customers(cust_id, cust_contact, cust_email)SELECT cust_id, cust_contact, cust_email
FROM CustNew;

数据控制语言

数据控制语言(DCL,Data Control Language):负责数据完整性、安全性的定义与检查以及并发控制、故障恢复等功能,主要语法有GRANT授权,REVOKE取消授权等。大部分情况下,这部分语法主要是提供给数据库工程师以及数仓开发使用的,分析师不太能用到这些语法,所以也不细讲了。

	#给创建的用户赋予角色。     GRANT  ON  TO  [IDENTIFIED BY ""]GRANT USAGE ON *.* TO 'discuz'@'localhost' IDENTIFIED BY PASSWORD#		删除用户权限						revoke [权限1],[权限2]on [对象类型] [对象名]from [用户]revoke update on Student from User3

事务控制语

事务控制语言(TCL,Transaction Control Language)包括SAVEPOINT 设置保存点,它是事务处理中设置临时的占位符,可以对它发布回退;ROLLBACK 回滚,撤销指定的SQL语句;COMMIT提交,将未储存的SQL写入数据库表。

ROLLBACK 回滚

select * from ordertotals;
start transaction;
delete from ordertotals;
select * from ordertotals;
rollback;
select * from ordertotals;

COMMIT提交

start transaction;
delete from orderitems where order_num = 20010;
delete from orders where order_num = 20010;
commit;

2 sql处理函数

这里会整理一些常用的sql函数进行介绍,包括去重,聚合函数,常用的数值处理函数,条件筛选以及排序进行讲解。

在日常的工作过程中,这些函数会帮你解决很多的数据操作问题,提升工作效率

Distinct数据去重

从Products中筛选出无重复的vend_id 。

SELECT AVG(prod_price) AS avg_price 
FROM Products;

聚合函数

#AVG( )返回平均值
SELECT AVG(prod_price) AS avg_price 
FROM Products;#SUM( ) 汇总求和
SELECT SUM(quantity) AS items_ordered 
FROM OrderItems
WHERE order_num = 20005; #COUNT( )返回数量
//count(*)返回所有值,包括null
SELECT COUNT(*) AS num_cust
FROM Customers;//count(字段名)只返回该字段不为null的值
SELECT COUNT(cust_email) AS num_cust
FROM Customers;#MAX()/MIN()求最大最小值
SELECT MAX(prod_price) AS max_price 
FROM Products;SELECT dt,COUNT(*) AS num_items,MIN(prod_price) AS price_min,MAX(prod_price) AS price_max,AVG(prod_price) AS price_avg
FROM Products
GROUP BY dt;

数值处理函数

主要是将数值型的数据转换为其余数,绝对值,余弦值,正切值等,具体用如下:

SELECT dt,COUNT(*) AS num_items,MOD(prod_price) AS price_mod,ROUND(prod_price) AS price_round,ABS(prod_price) AS price_abs,SQRT(prod_price) AS price_sqrt
FROM Products
GROUP BY dt;

条件筛选

#WHERE的用法
SELECT prod_name, prod_price FROM ProductsWHERE prod_price = 3.49; 
//AND
SELECT prod_id, prod_price, prod_name 
FROM Products 
WHERE vend_id = 'DLL01' AND prod_price <= 4; //OR
SELECT prod_name, prod_priceFROM ProductsWHERE vend_id = 'DLL01' OR vend_id = ‘BRS01’;#IN的用法
SELECT prod_name, prod_price
FROM Products
WHERE vend_id IN ( 'DLL01', 'BRS01' )
ORDER BY prod_name;#LIKE相关通配符
// 1.%通配符  查找有bean bag的字段
SELECT prod_id, prod_name
FROM Products
WHERE prod_name LIKE '%bean bag%';
//2._下划线通配符
SELECT prod_id, prod_name
FROM Products
WHERE prod_name LIKE '__ inch teddy bear';
//3.[]通配符
//寻找J或M开头的姓名
SELECT cust_contact 
FROM Customers
WHERE cust_contact LIKE '[JM]%'
ORDER BY cust_contact;//此通配符之前加一个括号可以表示否定,即寻找不是J或M开头的人
SELECT cust_contact
FROM Customers
WHERE cust_contact LIKE '[^JM]%' ORDER BY cust_contact; #HAVING分组过滤
SELECT vend_id, COUNT(*) AS num_prods 
FROM ProductsWHERE prod_price >= 4GROUP BY vend_id 
HAVING COUNT(*) >= 2;

数据排序

# ORDER BY 数据排序
SELECT prod_id, prod_price, prod_name
FROM Products
ORDER BY prod_price DESC, prod_name;#分组查询过滤排序
SELECT order_num, COUNT(*) AS items FROM OrderItems
GROUP BY order_num
HAVING COUNT(*) >= 3
ORDER BY items, order_num;

3 表关联

讲解SQL中的数据表关联,包括UNION,JOIN的操作。

UION关联数据结构相同的表
UION包括UION 和UION ALL,二者都是用来关联数据结构相同的数据表,二者的区别在于UION关联之后会去除重复的行,而 UION ALL会保留所有的行。

/*SELECT column_name(s) FROM table1
UNION
SELECT column_name(s) FROM table2;*/
# UNION 示例
SELECT cust_name, cust_contact, cust_emailFROM CustomersWHERE cust_state IN ('IL','IN','MI')UNION SELECT cust_name, cust_contact, cust_emailFROM Customers
/*SELECT column_name(s) FROM table1
UNION ALL
SELECT column_name(s) FROM table2;*/
# UION ALL示例
SELECT cust_name, cust_contact, cust_email
FROM Customers
WHERE cust_state IN ('IL','IN','MI')
UNION ALL SELECT cust_name, cust_contact, cust_email
FROM Customers

JION关联数据结构不同的表

JION类型比较多,包括自连接,自然连接,内链接,交叉连接和外链接,其主要类型汇总如下图。

自连接

两张相同的表,自己和自己连接

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

自然连接

SELECT C.*, O.order_num, O.order_date, OI.prod_id, OI.quantity, OI.item_price 
FROM Customers AS C, Orders AS O, OrderItems AS OI 
WHERE C.cust_id = O.cust_id AND OI.order_num = O.order_num AND prod_id = 'RGAN01';

内链接

/*SELECT column_name(s)
FROM table1
JOIN table2
ON table1.column_name=table2.column_name;*/
#实例:
SELECT vend_name, prod_name, prod_price FROM Vendors 
INNER JOIN Products ON Vendors.vend_id = Products.vend_id;

交叉连接

没有联结条件的联结是交叉连接,也称为笛卡尔积

SELECT vend_name, prod_name, prod_price FROM Vendors, Products;

外连接

1.左外连接

/*SELECT column_name(s)
FROM table1
LEFT JOIN table2
ON table1.column_name=table2.column_name;*/
#实例
SELECT Websites.name, access_log.count, access_log.date
FROM Websites
LEFT JOIN access_log
ON Websites.id=access_log.site_id
ORDER BY access_log.count DESC;

2.全连接

/*SELECT column_name(s)
FROM table1
FULL OUTER JOIN table2
ON table1.column_name=table2.column_name;*/
#实例
SELECT Websites.name, access_log.count, access_log.date
FROM Websites
FULL OUTER JOIN access_log
ON Websites.id=access_log.site_id
ORDER BY access_log.count DESC;

3.右连接

/*SELECT column_name(s)
FROM table1
RIGHT JOIN table2
ON table1.column_name=table2.column_name;*/
#实例
SELECT websites.name, access_log.count, access_log.date
FROM websites
RIGHT JOIN access_log
ON access_log.site_id=websites.id
ORDER BY access_log.count DESC;


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部