SQL入门?只要记住这些基础语句就够了!

《林老师带你学编程》知识星球是由多个工作10年以上的一线大厂开发人员联合创建,希望通过我们的分享,帮助大家少走弯路,可以在技术的领域不断突破和发展。

🔥 具体的加入方式:

新手入门SQL,强烈推荐MICK的《SQL基础教程》。这本书逻辑清晰,直白易懂,介绍了SQL所有的基础语句。掌握了这本书中的内容,就可以利用SQL进行简单的数据分析了。

《SQL基础教程》

在这篇文章里我对《SQL基础教程》中的几乎所有的SQL基础语句进行了总结和摘抄,面试前可以把这些SQL语句集中记忆一遍。下一篇文章我会教大家如何利用这篇文章中提到的SQL基础语句进行数据分析的实操。欢迎大家关注我的专栏~


首先,什么是SQL?

SQL是Structured Query Language的缩写,意思是结构化查询语言,是一种在数据库管理系统(Relational Database Management System, RDBMS)中查询数据,或通过RDBMS对数据库中的数据进行更改的语言。

常见的RDBMS有:

  • Oracle Database:甲骨文公司的RDBMS
  • SQL Server :微软公司的RDBMS
  • DB2:IBM 公司的RDBMS
  • PostgreSQL:开源的RDBMS
  • MySQL :开源的RDBMS

不同RDBMS的SQL语言略有不同,由于MySQL是开源的,免费容易获取,国内很多公司用的都是MySQL,所以本篇文章汇总的是MySQL的SQL语言。

使用SQL在RDBMS中查询数据的过程是这样的:

图片来自《SQL基础教程》

用户在客户端通过SQL语言,将需要的数据和对数据进行的操作的请求发送给RDBMS,RDBMS 根据该语句的内容返回所请求的数据,或者对存储在数据库中的数据进行更新。

根据对RDBMS 赋予的指令种类的不同,SQL 语句可以分为以下三类。

●DDL(Data Definition Language,数据定义语言)

用来创建或者删除存储数据用的数据库以及数据库中的表等对象。DDL 包含以下几种指令。

CREATE: 创建数据库和表等对象

DROP: 删除数据库和表等对象

ALTER: 修改数据库和表等对象的结构

●DML(Data Manipulation Language,数据操纵语言)

用来查询或者变更表中的记录。DML 包含以下几种指令。

SELECT:查询表中的数据

INSERT:向表中插入新数据

UPDATE:更新表中的数据

DELETE:删除表中的数据

●DCL(Data Control Language,数据控制语言)

用来确认或者取消对数据库中的数据进行的变更。除此之外,还可以对RDBMS 的用户是否有权限操作数据库中的对象(数据库表等)进行设定。DCL 包含以下几种指令。

COMMIT: 确认对数据库中的数据进行的变更

ROLLBACK: 取消对数据库中的数据进行的变更

GRANT: 赋予用户操作权限

REVOKE: 取消用户的操作权限

下面就让我们具体看看这三类语句分别包括哪些基础语句吧!

Ⅰ. DDL(Data Definition Language,数据定义语言)

1、 创建数据库(CREATE)

CREATE DATABASE shop;

2、创建表(CREATE)

CREATE TABLE Product
(product_id     CHAR(4)      NOT NULL,
 product_name   VARCHAR(100) NOT NULL,
 product_type   VARCHAR(32)  NOT NULL,
 sale_price     INTEGER      ,
 purchase_price INTEGER      ,
 regist_date    DATE         ,
 PRIMARY KEY (product_id));

每一列的数据类型(后述)是必须要指定的,数据类型包括:

  • INTEGER 整数型
  • NUMERIC ( 全体位数, 小数位数)
  • CHAR 定长字符串
  • VARCHAR 可变长字符串
  • DATE 日期型

3、 删除表(DROP)

DROP TABLE Product;

4、表定义的更新(ALTER)

  • 在表中增加一列(ADD COLUMN)
ALTER TABLE Product ADD COLUMN product_name_pinyin VARCHAR(100);
  • 在表中删除一列(DROP COLUMN)
ALTER TABLE Product DROP COLUMN product_name_pinyin;
  • 变更表名(RENAME)
RENAME TABLE Poduct to Product;

Ⅱ. DML(Data Manipulation Language,数据操纵语言)

1、向表中插入数据(INSERT)

  • 包含列清单
INSERT INTO Product (product_id, product_name, product_type, sale_price, purchase_price, regist_date) VALUES ('0001', 'T恤衫',
'衣服', 1000, 500, '2009-09-20');
  • 省略列清单
START TRANSACTION; 
INSERT INTO Product VALUES ('0001', 'T恤衫', '衣服', 1000, 500, '2009-09-20');
INSERT INTO Product VALUES ('0002', '打孔器', '办公用品', 500, 320, '2009-09-11');
INSERT INTO Product VALUES ('0003', '运动T恤', '衣服', 4000, 2800, NULL);
INSERT INTO Product VALUES ('0004', '菜刀', '厨房用具', 3000, 2800, '2009-09-20');
INSERT INTO Product VALUES ('0005', '高压锅', '厨房用具', 6800, 5000, '2009-01-15');
INSERT INTO Product VALUES ('0006', '叉子', '厨房用具', 500, NULL, '2009-09-20');
INSERT INTO Product VALUES ('0007', '擦菜板', '厨房用具', 880, 790, '2008-04-28');
INSERT INTO Product VALUES ('0008', '圆珠笔', '办公用品', 100, NULL,'2009-11-11');
COMMIT;
  • 从其他表中复制数据
INSERT INTO ProductCopy (product_id, product_name, product_type,sale_price, purchase_price, regist_date)
SELECT product_id, product_name, product_type, sale_price, purchase_price, regist_date
  FROM Product;
  • INSERT 语句中的SELECT 语句,也可以使用WHERE 子句或者GROUP BY 子句等。
INSERT INTO ProductType (product_type, sum_sale_price, sum_purchase_price)
SELECT product_type, SUM(sale_price), SUM(purchase_price)
  FROM Product
 GROUP BY product_type;

2、从表中查询出需要的列(SELECT)

SELECT product_id, product_name, purchase_price
  FROM Product;
  • 查询出所有的列
SELECT *
  FROM Product;
  • 为列设定别名(AS)
SELECT product_id AS id,
       product_name AS name,
       purchase_price AS “价格”
  FROM Product;
  • 将查询出的一列指定为常数
SELECT ‘2009-02-24’ AS date, product_id, product_name
  FROM Product;
  • 从查询结果中删除重复行(DISTINCT)
SELECT DISTINCT product_type
  FROM Product;

3、指定查询的条件(WHERE)

SELECT product_name, product_type
  FROM Product;
 WHERE product_type = '衣服';

4、算数运算符和比较运算符

  • 算数运算符

加 +

减 –

乘 *

除 /

注意:所有包含NULL 的计算,结果肯定是NULL。

SELECT product_name, sale_price, sale_price * 2 AS "sale_price_x2"
  FROM Product;
  • 比较运算符

等于 =

不等于 <>

大于 >

大于等于 >=

小于 <

小于等于 <=

SELECT product_name, product_type, regist_date
  FROM Product
 WHERE regist_date < '2009-09-27';
  • 将算数运算符和比较运算符结合使用:
SELECT product_name, sale_price, purchase_price
  FROM Product
 WHERE sale_price - purchase_price >= 500;

注意:不能对NULL使用比较运算符,正确的方法是:

SELECT product_name, purchase_price
  FROM Product
 WHERE purchase_price IS NULL;

SELECT product_name, purchase_price
  FROM Product
 WHERE purchase_price IS NOT NULL;

5、逻辑运算符(NOT、AND、OR)

  • NOT
SELECT product_name, product_type, sale_price
FROM Product
WHERE NOT sale_price >= 1000; 

(也就是sale_price<1000)

  • AND

AND运算符在其两侧的查询条件都成立时整个查询条件才成立,其意思相当于“并且”。

SELECT product_name, purchase_price
  FROM Product
 WHERE product_type = '厨房用具'
   AND sale_price >= 3000;

  • OR

运算符在其两侧的查询条件有一个成立时整个查询条件都成立,其意思相当于“或者”。

SELECT product_name, purchase_price
  FROM Product
 WHERE product_type = '厨房用具'
   OR sale_price >= 3000;

6、对表进行聚合查询

常用的五个聚合函数:

  • COUNT: 计算表中的记录数(行数)
  • SUM: 计算表中数值列中数据的合计值
  • AVG: 计算表中数值列中数据的平均值
  • MAX: 求出表中任意列中数据的最大值
  • MIN: 求出表中任意列中数据的最小值
  • 计算全部数据的行数(包含NULL)
SELECT COUNT(*)
  FROM Product;
  • 计算某一列的行数(不包含NULL)
SELECT COUNT(purchase_price)
  FROM Product;
  • 计算删除重复数据后的行数
SELECT COUNT(DISTINCT product_type)
  FROM Product;

(所有的聚合函数都可以使用DISTINCT)

  • SUM/AVG函数只能对数值类型的列使用,而MAX/MIN函数原则上可以适用于任何数据类型的列
SELECT MAX(regist_date), MIN(regist_date)
  FROM Product;

7、对表进行分组(GROUP BY)

SELECT product_type, COUNT(*)
  FROM Product
 GROUP BY product_type;
  • GROUP BY和WHERE并用时SELECT语句的执行顺序:

FROM → WHERE → GROUP BY → SELECT

SELECT purchase_price, COUNT(*)
  FROM Product
 WHERE product_type = '衣服'
 GROUP BY purchase_price;
  • 为聚合结果指定条件(HAVING)
SELECT product_type, COUNT(*)
  FROM Product
 GROUP BY product_type
HAVING COUNT(*) = 2;

8、对查询结果进行排序(ORDER BY)

  • 子句的书写顺序

SELECT → FROM → WHERE → GROUP BY → HAVING → ORDER BY

子句的执行顺序:

FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY

SELECT product_id, product_name, sale_price, purchase_price
  FROM Product
ORDER BY sale_price;
  • 升序(ASC)或降序(DESC)
SELECT product_id, product_name, sale_price, purchase_price
  FROM Product
ORDER BY sale_price DESC;

注意:默认升序

9、数据的删除(DELETE)

  • 清空表
DELETE FROM Product;
  • 指定删除对象(搜索型DELETE)
DELETE FROM Product
 WHERE sale_price >= 4000;

10、数据的更新(UPDATE)

  • 更新整列
UPDATE Product
   SET regist_date = '2009-10-10';
  • 指定条件的更新(搜索型UPDATE)
UPDATE Product
   SET sale_price = sale_price * 10
 WHERE product_type = '厨房用具';
  • 多列更新
UPDATE Product
   SET sale_price = sale_price * 10,
       purchase_price = purchase_price / 2
 WHERE product_type = '厨房用具';

11、视图

  • 创建视图(CREATE VIEW)
CREATE VIEW ProductSum (product_type, cnt_product)
AS
SELECT product_type, COUNT(*)
  FROM Product
 GROUP BY product_type;

注意:定义视图时不能使用ORDER BY子句

  • 使用视图
SELECT product_type, cnt_product
  FROM ProductSum;
  • 删除视图(DROP VIEW)
DROP VIEW ProductSum;

12、子查询(一次性视图)

-- 在FROM子句中直接书写定义视图的SELECT语句
SELECT product_type, cnt_product
  FROM ( SELECT product_type, COUNT(*) AS cnt_product
            FROM Product
          GROUP BY product_type ) AS ProductSum;
  • 标量子查询

在WHERE子句中使用标量子查询

SELECT product_id, product_name, sale_price
  FROM Product
 WHERE sale_price > (SELECT AVG(sale_price)
                     FROM Product);

注意:能够使用常数或者列名的地方,无论是SELECT 子句、GROUP BY 子句、HAVING 子句,还是ORDER BY 子句,几乎所有的地方都可以使用标量子查询。

  • 关联子查询
SELECT product_type, product_name, sale_price
  FROM Product AS P1 
 WHERE sale_price > (SELECT AVG(sale_price)
                          FROM Product AS P2 
                      WHERE P1.product_type = P2.product_type
                        GROUP BY product_type);

这里起到关键作用的就是在子查询中添加的WHERE 子句的条件。该条件的意思就是,在同一商品种类中对各商品的销售单价和平均单价进行比较。

13、函数

函数大致可以分为以下几种。

  • 算术函数(用来进行数值计算的函数)
  • 字符串函数(用来进行字符串操作的函数)
  • 日期函数(用来进行日期操作的函数)
  • 转换函数(用来转换数据类型和值的函数)
  • 聚合函数(用来进行数据聚合的函数)
  • 算数函数

ABS (数值) —— 绝对值

MOD (被除数, 除数) —— 求余

ROUND (对象数值, 保留小数的位数) —— 四舍五入

  • 字符串函数

CONCAT (字符串1, 字符串2, 字符串3) —— 拼接

LENGTH (字符串) —— 字符串长度

LOWER (字符串) —— 小写

UPPER (字符串) —— 大写

REPLACE (对象字符串,替换前的字符串,替换后的字符串) —— 替换

SUBSTRING(对象字符串 FROM 截取的起始位置 FOR 截取的字符数)—— 截取

  • 日期函数

CURRENT_DATE —— 当前日期

CURRENT_TIME —— 当前时间

CURRENT_TIMESTAMP —— 当前的日期和时间

EXTRACT (日期元素 FROM 日期)

  • 转换函数

CAST(转换前的值 AS 想要转换的数据类型)—— 类型转换

COALESCE (数据1,数据2,数据3……) —— 将NULL转换为其他值

14、谓词

  • LIKE谓词

前方一致查询:

SELECT *
  FROM SampleLike
 WHERE strcol LIKE 'ddd%';

也可用_(下划线)代替%,但_只能代表一个字符

SELECT *
FROM SampleLike
WHERE strcol LIKE 'abc_';

中间一致查询:

SELECT *
  FROM SampleLike
 WHERE strcol LIKE '%ddd%';

后方一致查询:

SELECT *
  FROM SampleLike
 WHERE strcol LIKE '%ddd';
  • BETWEEN谓词
SELECT product_name, sale_price
  FROM Product
 WHERE sale_price BETWEEN 100 AND 1000;

BETWEEN 的特点就是结果中会包含100 和1000 这两个临界值。

  • IS NULL和IS NOT NULL谓词

为了选取出某些值为NULL 的列的数据,不能使用=,而只能使用特定的谓词IS NULL

SELECT product_name, purchase_price
  FROM Product
 WHERE purchase_price IS NULL;
  • IN谓词
SELECT product_name, purchase_price
  FROM Product
 WHERE purchase_price IN (320, 500, 5000);

也可以用NOT IN

SELECT product_name, purchase_price
  FROM Product
 WHERE purchase_price NOT IN (320, 500, 5000);

注意:在使用IN 和NOT IN 时是无法选取出NULL 数据的。

使用子查询作为IN谓词的参数:

SELECT product_name, sale_price
  FROM Product
 WHERE product_id IN (SELECT product_id
                         FROM ShopProduct
                        WHERE shop_id = '000C');
  • EXIST谓词
SELECT product_name, sale_price
  FROM Product AS P 
 WHERE EXISTS (SELECT *
                  FROM ShopProduct AS SP 
                 WHERE SP.shop_id = '000C'
                   AND SP.product_id = P.product_id);

也可以用NOT EXIST

15、CASE表达式

SELECT product_name,
       CASE WHEN product_type = '衣服'
            THEN CONCAT('A:', product_type)
            WHEN product_type = '办公用品'
            THEN CONCAT('B:', product_type)
            WHEN product_type = '厨房用具'
            THEN CONCAT('C:',product_type)
            ELSE NULL
       END AS abc_product_type
  FROM Product;

16、表的加减法

  • 表的加法(UNION)
SELECT product_id, product_name
   FROM Product
UNION
SELECT product_id, product_name
  FROM Product2;

通过UNION 进行并集运算时可以使用任何形式的SELECT 语句,WHERE、GROUP BY、HAVING 等子句都可以使用,但是ORDER BY 只能在最后使用一次。

注意:UNION会删去两个表中的重复记录。如果想保留重复记录,可以在UNION后面加ALL

  • 选取表中的公共部分(INTERSECT)

MySQL不支持INTERSECT

  • 表的减法(EXCEPT)

MySQL不支持EXCEPT

17、以列为单位对表进行联结(JOIN)

  • 内联结(INNER JOIN)
SELECT SP.shop_id, SP.shop_name, SP.product_id, P.product_name, P.sale_price
  FROM ShopProduct AS SP INNER JOIN Product AS P 
    ON SP.product_id = P.product_id;

像这样使用联结运算将满足相同规则的表联结起来时,WHERE、GROUP BY、HAVING、ORDER BY 等工具都可以正常使用.

  • 外联结(OUTER JOIN)
SELECT SP.shop_id, SP.shop_name, SP.product_id, P.product_name, P.sale_price
  FROM ShopProduct AS SP LEFT OUTER JOIN Product AS P ①
    ON SP.product_id = P.product_id;
  • 三张以上的表的联结
SELECT SP.shop_id, SP.shop_name, SP.product_id, P.product_name, P.sale_price, IP.inventory_quantity
  FROM ShopProduct AS SP INNER JOIN Product AS P ①
    ON SP.product_id = P.product_id
          INNER JOIN InventoryProduct AS IP ②
             ON SP.product_id = IP.product_id
 WHERE IP.inventory_id = 'P001';

Ⅲ. DCL(Data Control Language,数据控制语言)

1、创建事务(START TRANSACTION) – 提交处理(COMMIT)

START TRANSACTION;
    -- 将运动T恤的销售单价降低1000日元
    UPDATE Product
       SET sale_price = sale_price - 1000
     WHERE product_name = '运动T恤';
    -- 将T恤衫的销售单价上浮1000日元
    UPDATE Product
       SET sale_price = sale_price + 1000
     WHERE product_name = 'T恤衫';
COMMIT;

2、取消处理(ROLLBACK)

START TRANSACTION;
    -- 将运动T恤的销售单价降低1000日元
    UPDATE Product
       SET sale_price = sale_price - 1000
     WHERE product_name = '运动T恤';
    -- 将T恤衫的销售单价上浮1000日元
    UPDATE Product
       SET sale_price = sale_price + 1000
     WHERE product_name = 'T恤衫';
ROLLBACK;

原文地址:https://zhuanlan.zhihu.com/p/52428930

滚动至顶部