zoukankan      html  css  js  c++  java
  • MYSQL理论学习

    最近在复习数据库相关的知识,主要是以“SQL必知必会”这本书为参考,结合网上相关博客,记录学习的要点。本篇博客会持续更新,便于以后复习。

    参考博客:http://blog4jimmy.com/2017/11/256.html

    1.SQL外连接

    在SQL中外连接包括左连接(left join)和右连接(right join),全外连接(full join),等值连接(inner join)又叫内连接。

    left join(左连接):返回包括左表中的所有记录和右表中连接字段相等的记录。

    right join(右连接):返回包括右表中的所有记录和左表中连接字段相等的记录。

    inner join(等值连接或者叫内连接):只返回两个表中连接字段相等的行。

    full join(全外连接):返回左右表中所有的记录和左右表中连接字段相等的记录。

    2.SQL查询

    1)SQL语句是不区分大小写的,在一个语句中,你使用全部大写、全部小写或者大小写混合【select、Select】,结果都是一样的。

    2)DISTINCT(去重)关键字放在需要查询的列名前。

    3)LIMIT和OFFSET关键字:

    LIMIT关键字:表示限制SELECT返回的行数,例如LIMIT 5表示SELECT结果最多只能返回5行。

    OFFSET关键字表示SELECT返回的数据从第几行开始输出显示,例如offset 4表示OFFSET的查询会从第4行开始显示,前面的3行的数据就跳过了。

    注意注意!!offset是不能单独使用的,需要和limit一同使用

    举例:SELECT num FROM Alpha LIMIT 2 OFFSET 3;

    4) 数据排序ORDER BY后面跟需要排序的列名(默认是升序)。其可以按照多个列进行排序,只需在ORDER BY后用逗号分隔多个列就好了,多个列排序的规则是:对第一顺位的列进行排序,如果该列存在相同的内容,在按照第二顺位的列进行排序,依次类推。

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

    // 下面这一句和上面一句的功能一样,取前面字段的23进行排序

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

    5) 过滤数据

    Where关键字:注意and 和 or 的使用。and是指既符合条件A又符合条件B。or是指条件A或条件B有1个满足即可。

    注意注意!!and和or的求值顺序判断:SQL在处理 OR操作符 之前会优先处理 AND操作符

    IN操作符:用来指定要匹配值的清单的关键字,功能与OR相当。

    NOT操作符:其和不等于是类似的,只是NOT操作符是跟在where后面的。

    SELECT prod_name, prod_price FROM Products WHERE NOT vend_id = 'DLL01';

    6) 通配符

    百分号(%)通配符:表示任何字符出现的任意次数

    下划线(_)通配符:匹配一个字符

    方括号([])通配符:匹配指定位置(通配符的位置)的一个字符

    举例:找出J或M开头的cust_contact行

    SELECT cuts_contact FROM Customers WHERE cust_contact LIKE '[JM]%';

     

    7) 拼接字段(CONCAT

    含义:将值联结到一起(将一个值附加到另一个值)构造单个值,举例:

    SELECT CONCAT(vend_name, ' (' , vend_country, ')') AS vend_title FROM Vendors ORDER BY vend_name;

     

    8)计算字段

    有时候我们在一个表里面存储了一张订单的货物数量和货物单价,但是没有存储该订单的总价,这时候我们可以通过计算字段,让数据库帮我们计算总价并返回给我们。

    SELECT prod_id, quantity, item_price, quantity*item_price AS total_price FROM OrderItems WHERE order_num = 20008;

     

     

    9) 分组数据

    通过COUNT(*)可以检索出某一列包含的数量,但是却不能将相同的行合并在一起。所以,COUNT(*)统计出来的行数就包括了相同的行数了。但是不可以通过DISTINCT来合并相同的数据行,DISTINCT是不能用于COUNT(*),但是我们可以通过GROUP BY进行合并。

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

     

    上面语句还有下列的改写形式。(注意:与group by搭配使用的过滤关键字用having

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

     

    10) 子查询

    案例:现在有3个表

    • 订单的编号、客户的ID和订单日期在表Orders中存储为一行
    • 各个订单包含的物品存储在OrderItems表中
    • 而顾客的详细信息存储在Customers表中

    现需查询有哪些顾客订购了'RGAN01'这个上商品,按照上面的表结构,分析如下:

    • 首先需要查看表OrderItems中,包含这个物品的订单编号是多少;
    • 然后根据这个订单编号查询Orders表,获得对应客户的ID;
    • 最后再根据这个客户ID来查询Customers表,来获取具体的客户信息

    SELECT cust_name, cust_contact FROM Customers WHERE cust_id IN

        ( SELECT cust_id FROM Orders WHERE order_num IN

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

    11)联结

    如果数据存储在多个表中,想要用一条SELECT语句检索出数据的话,就需要用到联结了。简单说,联结是一种机制,用来在一条SELECT语句中关联表,一次称为联结。

    创建联结很简单,指定需要联结的所有表以及关联它们的方式即可。例如:

    SELECT vend_name, prod_name, prod_price FROM Vendors, Products WHERE Vendors.vend_id = Products.vend_id;

    跟上面语句具有相同效果的语句:

    SELECT vend_name, prod_name, prod_price FROM Venders INNERJOIN Products ON Vendors.vend_id = Products.vend_id;

    上面的语句中,两个表的关系是通过INNER JOIN指定的部分FROM子句,在使用这种语法时,联结条件用特定的ON子句而不是WHERE子句来指出。

    注:联结的表不宜过多,否则数据库的性能下降的很快

     

    12)组合

    UNIONUNION指示数据库执行这两条SELECT语句,并把输出组合成一个查询结果集。另外UNION从查询结果集中自动删除重复的行;换句话说,它的行为和一条SELECT语句中使用多个WHERE子句条件一样。

    UNION ALL返回所有的匹配的行,包括返回重复的行

    SELECT cust_name, cust_contact, cust_email FROM Customers WHERE cust_state IN ('IL', 'IN', 'MI') UNION SELECT cust_name, cust_contact, cust_email FROM Customers WHERE cust_name = 'Fun4All';

     

    13)将一个表复制到另一个表

    CREATE TABLE CustCopy AS SELECT * FROM Customers;

     

    14)update操作语法记录

    UPDATE Customers SET cust_contact = 'Sam Roberts', cust_email = 'sam@toyland.com' WHERE cust_id = '1000000006';

     

    15)修改表语法记录

    更新表,添加列举例:

    ALTER TABLE Vendors ADD vend_phone CHAR(20);

    更新表,删除列

    ALTER TABLE Vendors DROP COLUMN vend_phone;

     

  • 相关阅读:
    Codeforces 845E Fire in the City 线段树
    Codeforces 542D Superhero's Job dp (看题解)
    Codeforces 797F Mice and Holes dp
    Codeforces 408D Parcels dp (看题解)
    Codeforces 464D World of Darkraft
    Codeforces 215E Periodical Numbers 容斥原理
    Codeforces 285E Positions in Permutations dp + 容斥原理
    Codeforces 875E Delivery Club dp
    Codeforces 888F Connecting Vertices 区间dp (看题解)
    Codeforces 946F Fibonacci String Subsequences dp (看题解)
  • 原文地址:https://www.cnblogs.com/kelly-one/p/11074287.html
Copyright © 2011-2022 走看看