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语句只能查询单个列。

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

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

  • 相关阅读:
    IntelliJ IDEA 14.03 java 中文文本处理中的编码格式设置
    应聘感悟
    STL string分析
    CUDA SDK VolumeRender 分析 (1)
    BSP
    CUDA SDK VolumeRender 分析 (3)
    CUDA SDK VolumeRender 分析 (2)
    Windows软件发布时遇到的一些问题
    Ten Commandments of Egoless Programming (转载)
    复习下光照知识
  • 原文地址:https://www.cnblogs.com/youcoding/p/15262640.html
Copyright © 2011-2022 走看看