zoukankan      html  css  js  c++  java
  • 《SQL必知必会》学习笔记(上)

    这是我阅读《SQL必知必会》归纳整理的重点和易错点,分为上下两篇笔记,下篇在这里:《SQL必知必会》学习笔记(下)

    第2课 检索数据

    关于SQL语句的一些特点:

    • 多条SQL语句必须以分号(;)分隔。
    • 请注意,SQL语句不区分大小写,因此SELECT与select是相同的。
    • 在处理SQL语句时,其中所有空格都被忽略。

    DISTINCT关键字

    使用 DISTINCT 关键字,指示数据库只返回不同的值,

    • DISTINCT关键字写在 select 后面,列名的前面。
    • DISTINCT关键字作用于所有的列,不仅仅是跟在其后的那一列。
    SELECT DISTINCT vend_id, prod_price FROM Products;
    

    设置返回结果的行数

    在SQL Server中使用SELECT时,可以用TOP关键字来限制最多返回多少行。

    使用Oracle,需要基于ROWNUM(行计数器)来计算行。

    如果你使用MySQL、MariaDB、PostgreSQL或者SQLite,需要使用LIMIT子句

    SELECT prod_name FROM Products LIMIT 5;
    

    为了得到后面的5行数据,需要指定从哪儿开始以及检索的行数,像这样:

    ELECT prod_name FROM Products LIMIT 5 OFFSET 5;
    

    OFFSET 5 表示从第 5 行开始检索,mysql 中行编号从 0 开始。

    SQL 注释

    行内注释1:使用--(两个连字符)嵌在行内。——之后的文本就是注释:

    SELECT prod_name -- 这是一条注释。
    FROM Products
    

    行内注释2:在一行的开始处使用#,这一整行都将作为注释:

    # 这是一条注释
    SELECT prod_name 
    FROM Products
    

    多行注释:注释从/*开始,到*/结束,/*和*/之间的任何内容都是注释。

    第3课 排序检索数据

    SQL语句由子句构成,有些子句是必需的,有些则是可选的。一个子句通常由一个关键字加上所提供的数据组成。

    ORDER BY子句

    ORDER BY子句取一个或多个列的名字,据此对输出进行排序:

    SELECT prod_name FROM Products ORDER BY prod_name;
    

    指示DBMS软件对prod_name列以字母顺序排序。

    使用 ORDER BY子句的注意事项:

    • ORDER BY子句应该是SELECT语句中最后一条子句。
    • 用非检索的列排序数据是完全合法的。

    要按多个列排序,只须指定这些列名,列名之间用逗号分开即可:

    SELECT prod_id, prod_price, prod_name FROM Products
    ORDER BY prod_price, prod_name;
    

    这里,优先按照 prod_price 排序,如果 prod_price 相同,再使用 prod_name 进行排序。

    DESC关键字

    sql中,默认使用升序进行排序。为了进行降序排序,必须指定 DESC 关键字:

    SELECT prod_id, prod_price, prod_name FROM Products
    ORDER BY prod_price DESC;
    

    使用 DESC关键字注意事项:

    • DESC关键字只应用到直接位于其前面的列名。
    • 如果想在多个列上进行降序排序,必须对每一列指定DESC关键字。
    • DESC是DESCENDING的缩写,这两个关键字都可以使用。

    第4课 过滤数据

    WHERE子句

    在同时使用ORDER BY和WHERE子句时,应该让ORDER BY位于WHERE之后,否则将会产生错误。

    单引号用来限定字符串。如果将值与字符串类型的列进行比较,就需要限定引号。用来与数值列进行比较的值不用引号:

    SELECT vend_id, prod_name FROM Products 
    WHERE vend_id !='DLL01';
    

    BETWEEN操作符

    要检查某个范围的值,可以使用BETWEEN操作符。

    SELECT prod_name, prod_price FROM Products
    WHERE prod_price BETWEEN 5 AND 10;
    

    在使用BETWEEN时,必须指定两个值——所需范围的低端值和高端值。这两个值必须用AND关键字分隔。BETWEEN匹配范围中所有的值,包括指定的开始值和结束值。

    IS NULL子句

    SELECT语句有一个特殊的WHERE子句,可用来检查具有NULL值的列。这个WHERE子句就是IS NULL子句。其语法如下:

    SELECT prod_name FROM Products WHERE prod_price IS NULL;
    

    第5课 高级数据过滤

    AND操作符

    要通过不止一个列进行过滤,可以使用AND操作符给WHERE子句附加条件。

    可以增加多个过滤条件,每个条件间都要使用AND关键字。

    任何时候使用具有AND和OR操作符的WHERE子句,都应该使用圆括号明确地分组操作符。

    IN操作符

    IN操作符用来指定条件范围,范围中的每个条件都可以进行匹配:

    SELECT prod_name, price_price FROM Products
    WHERE vend_id IN('DLL01', 'ERSO1') ORDER BY prod_name;
    

    此SELECT语句检索由供应商DLL01和BRS01制造的所有产品。IN操作符后跟由逗号分隔的合法值,这些值必须括在圆括号中。

    IN操作符的特点:

    • IN操作符与OR操作符实现的是相同的功能,但IN操作符比一组OR操作符执行得更快
    • IN的最大优点是可以包含其他SELECT语句,能够更动态地建立WHERE子句。

    第6课 用通配符进行过滤

    LIKE操作符

    通配符本身实际上是SQL的WHERE子句中有特殊含义的字符,SQL支持几种通配符。为在搜索子句中使用通配符,必须使用LIKE操作符。

    百分号(%)通配符

    最常使用的通配符是百分号(%)。在搜索串中,%表示任何字符出现任意次数(包括0次)。

    为了找出所有以词Fish起头的产品,可写以下的SELECT语句:

    SELECT prod_id, prod_name FROM Products
    WHERE prod_name LIKE 'Fish%';
    

    注意,百分号(%)通配符不能匹配 null 。

    下划线(_)通配符

    下划线的用途与%一样,但它只匹配单个字符。

    第7课 创建计算字段

    计算字段并不实际存在于数据库表中。计算字段是运行时在SELECT语句内创建的。

    拼接字段

    对于 MySQL或MariaDB ,使用Concat函数进行拼接字段。

    SELECT Concat(vend_name, ' (', vend_country, ')') FROM Vendors ORDER BY vend_name;
    

    SQL Server使用+号。DB2、Oracle、PostgreSQL和SQLite使用||.

    AS关键字

    SQL支持列别名,用AS关键字赋予。

    SELECT vend_name AS vname FROM Vendors;
    

    别名有时也称为导出列。

    第8课 使用函数处理数据

    虽然所有类型的函数一般都可以在每个DBMS中使用,但各个函数的名称和语法可能极其不同。

    第9课 汇总数据

    AVG()函数

    AVG()可用来返回所有列的平均值,也可以用来返回特定列或行的平均值。

    SELECT AVG(prod_price) AS avg_price FROM Products;
    

    第10课 分组数据

    GROUP BY子句

    分组是使用SELECT语句的GROUP BY子句建立的。理解分组的最好办法是看一个例子:

    SELECT vend_id, COUNT(*) AS num_prods FROM Products 
    GROUP BY vend_id;
    

    输出:

    vend_id    num_prods
    ------    --------
    BRS01        3
    DLL01        4
    FNG01        2
    

    GROUP BY子句指示DBMS按vend_id排序并分组数据。这就会对每个vend_id而不是整个表计算num_prods一次。

    GROUP BY子句必须出现在WHERE子句之后,ORDER BY子句之前。

    HAVING子句

    HAVING非常类似于WHERE。事实上,目前为止所学过的所有类型的WHERE子句都可以用HAVING来替代。唯一的差别是,WHERE过滤行,而HAVING过滤分组

    怎么过滤分组呢?请看以下的例子:

    SELECT cust_id, COUNT(*) AS orders FROM Orders GROUP BY cust_id
    HAVING COUNT(*) >=2;
    

    输出:

    cust_id      orders
    -------      -------
    1000001        2
    

    HAVING和WHERE的差别

    • WHERE在数据分组前进行过滤,HAVING在数据分组后进行过滤。
    • WHERE 用在 GROUP BY 之前,HAVING 用在 GROUP BY 之后。
    • WHERE过滤行,而HAVING过滤分组。

    SELECT子句顺序

    SELECT --> FROM --> WHERE --> GROUP BY --> HAVING --> ORDER BY

    第11课 子查询

    示例:

    SELECT cust_id FROM Orders WHERE order_num 
    IN(SELECT order_num FROM OrderItems WHERE prod_id = 'RGAN01');
    

    注意,作为子查询的SELECT语句只能查询单个列。

    对于能嵌套的子查询的数目没有限制,不过在实际使用时由于性能的限制,不能嵌套太多的子查询。

    每天学习一点点,每天进步一点点。

  • 相关阅读:
    docker的核心概念和安装
    kettle在centos7下部署分布式集群
    Kettle在windows下分布式集群的搭建
    笔记本 原来win10系统改装win7系统遇到 invaid signature detected.check secure boot policy setup问题
    docker 在window10下的安装
    docker 在windows7 、8下的安装
    初识Docker
    MySql 外键约束 之CASCADE、SET NULL、RESTRICT、NO ACTION分析和作用
    学习前端框架Metronic
    Java中的动态代理是什么
  • 原文地址:https://www.cnblogs.com/youcoding/p/15262640.html
Copyright © 2011-2022 走看看