SQL常见语法

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行数据

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容