1. 提要
笔者作为一名互联网商业数据分析师,SQL是日常工作中最常用的数据提取&简单预处理语言。因为其使用的广泛性和易学程度也被其他岗位比如产品经理、研发广泛学习使用,本篇文章主要从语法角度讲解SQL语言常用的点。
2. SQL语法特点
SQL语言的几个特点:
1 永远第一个出现的是关键字
2 以分号结尾,使多个查询可并列
3 SQL不区分大小写
4 日常使用过程中,90%的场景语句都是以经典结构构成:
select a.* from a where …
一般较为规范的复杂SQL语句也会在嵌套中凸出这种格式
3. SQL语法精要——常用操作符
3.1 表层面的操作
表的创建
CREATE TABLE是常规操作
CREATE TABLE CUSTOMERS(
ID INT NOT NULL,
NAME VARCHAR (20) NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR (25) ,
SALARY DECIMAL (18, 2),
PRIMARY KEY (ID)
);
表的修改
ALTER TABLE的用法是在现有的列表添加删除或者修改列
ALTER TABLE table_name ADD column_type;
表的删除
DROP TABLE是常规操作,从一般习惯上,很多日常刷新的表都会以drop和create开头
DROP TABLE IF EXISTS table;
列的插入
INSERT INTO table_name (column1,column2……)
values (value1. value2……);
列的更新
WHERE子句指定哪些记录需要更新。如果省略WHERE子句,所有记录都将更新
UPDATE table_name
SET column1=value1, column2=value2,...
WHERE CONDITION;
3.2 筛选可加上的限制
去重:DISTINCT
SELECT distinct column1,column2……
FROM table_name
where condition1 OR condition2 OR condition3;
空值:NULL
SELECT column_names
FROM table_name
WHERE column_name IS NULL;
有限数目:LIMIT
在MySQL和Oracle等不同的数据库有细微的差别
SELECT column_names
FROM table_name
LIMIT number;
在某表内:IN
IN运算符允许在WHERE子句中指定多个值或者表,一般好处是可以限制表的范围,从而提高语句效率
SELECT column_names
FROM table_name
WHERE column_name IN (SELECT column from table_w3c where...);
子查询语句:一般与IN使用较多
子查询(Sub Query)或者说内查询(Inner Query),即在WHERE中再嵌套一层查询
SELECT column_name [, column_name ]
FROM table1 [, table2 ]
WHERE column_name OPERATOR
(SELECT column_name [, column_name ]
FROM table1 [, table2 ]
[WHERE]);
在某范围内:BETWEEN
常在where之后使用,限定特定范围
SELECT column_name
FROM tabl_name
WHERE column_name BETWEEN values and value2;
3.3 特殊查询目的
拼接:UNION ALL
UNION ALL允许不同值,但是UNION只会选择一个值
SELECT column_name FROM table1
UNION
SELECT column_name FROM table2;
模糊匹配:LIKE
有两个通配符常与LIKE运算符一起使用
% - 百分号表示零个,一个或多个字符
_ - 下划线表示单个字符
SELECT column1,column2,...
FROM table_name
WHERE column LIKE pattern;`
`SELECT * FROM customer
WHERE city LIKE 'L_n_on';
排序:ORDER BY
即按照ORDER BY后面的列名依次排序,默认从小到大,倒序即加上DESC
SELECT column_name,column_name
FROM table_name
ORDER BY column_name,column_name ASC|DESC;
分类计算相关函数
基本上你可以想到的都有包括,常用的有sum(),count(),avg(),max(),min()等;
这些函数单独使用也可,但是一般group by存在的地方一定会有
SELECT SUM(column_name)
FROM table_name
分类计算:GROUP BY
按照某列去计算,GROUP BY后面跟着的即是类别
SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name;
分类后限制条件:HAVING
比如需要聚合出某信息后,再根据聚合出的信息筛选,一般使用HAVING
WHERE 子句对被选择的列施加条件,而 HAVING 子句则对 GROUP BY 子句所产生的组施加条件
SELECT COLUMN1
FROM TABLE1
WHERE [CONDITION]
GROUP BY [CONDITIONS]
ORDER BY COLUMN1;
3.4 表的关联
JOIN语句
JOIN语句是SQL中用的最多写法,只要有多张表,必定设计到表的关联;也是较容易出错的一个地方,常见的JOIN方法如下:
INNER JOIN:返回两个表里面的匹配值
LEFT JOIN:左表为基表
RIGHT JOIN:右表为基表
FULL JOIN:存在于任意一表即返回
SELECT Orders.orderID,Customer.CustomerName,Order.OrderDate
FROM Orders
INNER JOIN Customers
ON ORDERS.CustomerID=Customers.CustomerID;
3.5 行的分类排序
PARTITION
这个词非常重要,常常是初级入门者和熟练使用者的区分,市面上90%所谓较难的SQL题也可以用此语法配合解开
简单讲其功能即分类排序:按照A累计进行分区,按照B进行排序
***() over (partition by A order by B)
***处可以用不同的语法
区别如下:
rank() over
查出指定条件后进行一个排名,但是有一个特点。假如是对学生排名,那么实用这个函数,成绩相同的两名是并列;
dense_rank() over
和rank() over的区别在于,两名学生的成绩并列以后,下一位同学并不空出并列所占的名次;
row_number() over
它和上面两种的区别就很明显了,这个函数不需要考虑是否并列,哪怕根据条件查询出来的数值相同也会进行连续排名
实操中视情况选用,会达到不同的效果
与其他计算方程的组合
partition与计算方程时,作用类似于group by,但是使用很少
count() over(partition by ... order by ...)
求分组后的总数。
max() over(partition by ... order by ...)
求分组后的最大值
min() over(partition by ... order by ...)
求分组后的最小值
avg() over(partition by ... order by ...)
求分组后的平均值
lag() over(partition by ... order by ...)
取出前n行数据
lead() over(partition by ... order by ...)
取出后n行数据