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;

     

  • 相关阅读:
    从csdn转移到博客园的一篇测试文章
    接口与抽象类的区别
    python网络爬虫进阶之HTTP原理,爬虫的基本原理,Cookies和代理介绍
    python验证码识别(2)极验滑动验证码识别
    VMWare虚拟机应用介绍
    Rpg maker mv角色扮演游戏制作大师简介
    python数据挖掘之数据探索第一篇
    python数据分析&挖掘,机器学习环境配置
    python爬取豆瓣视频信息代码
    python验证码处理(1)
  • 原文地址:https://www.cnblogs.com/kelly-one/p/11074287.html
Copyright © 2011-2022 走看看