sql_study_01_based_component

基础部分-增删查改

一、在单一表中检索数据

  1. AND

    SELECT *
    FROM order_items
    WHERE order_id = 6
    AND (quantity*unit_price) > 30;
    

  2. LIKEREGEXP

    1. LIKE

      1. %代表任意数量的字符
      2. _代表一个字符
      SELECT *
      FROM customers
      WHERE address LIKE '%trail%' OR address LIKE '%avenue%';
      

    2. REGEXP 正则表达式

      ^elka$|ambur :以elka开头或者结尾的或者包含ambur的

      1. ^ :以什么开始
        1. ^elka :以elka开始的字符串
      2. $ :以什么结束
        1. elka$ :以elka结尾的字符串
      3. | :或
      4. 单字符串 :包含这个字符串
        1. ambur 包含ambur的数据
      SELECT * FROM customers
      WHERE first_name REGEXP '^elka$|ambur';
      

      image-20240803101041458

  3. LIMIT

    1. LIMT offset,number
    2. offset :偏移量(默认为0)
    3. number :展示的数量
    SELECT *
    FROM customers LIMIT 0,3;
    -- page1: 1 2 3
    -- page2: 4 5 6
    -- page3: 7 8 9
    

image-20240803101106572

二、在多张表中检索数据

  1. Joining Multiple Tables

    1. INNER JOIN…ON…

      内连接,INNER可以省略, 查找是连接表共有的数据

      1. JOIN customers c ON o.customer_id = c.customer_id

        customer :表名

        o.customer_id = c.customer_id :连接条件

    -- Joining Multiple Tables
    SELECT
           o.order_id,
           o.order_date,
           c.first_name,
           c.last_name,
           os.name AS status
    FROM orders o
    JOIN customers c ON o.customer_id = c.customer_id
    JOIN order_statuses os ON o.status = os.order_status_id;
    

    image-20240803101200593

    -- Joining Multiple Tables Exercise
    USE sql_invoicing;
    SELECT
           p.payment_id,
           c.name,
           i.invoice_date,
           i.invoice_total,
           p.date,
           p.amount,
           pm.name AS pay_method
    FROM payments p
    JOIN clients c ON p.client_id = c.client_id
    JOIN invoices i ON p.invoice_id = i.invoice_id
    JOIN payment_methods pm ON p.payment_method = pm.payment_method_id;
    

    image-20240803101236124

  2. Compound Join Conditions

    1. 连接条件有多个
      1. order_id 和 product_id 一起标识一个数据(双主键)
    -- 复合连接条件Compound Join Conditions
    USE sql_store;
    SELECT *
    FROM order_items oi
    JOIN order_item_notes oin
        ON oi.order_id = oin.order_Id
        AND oi.product_id = oin.product_id;
    

    image-20240803101332522

  3. Outer Joins

    外连接包含左外连接和有外连接

    1. LEFT JOIN

      左外连接 :左边连接表不符合条件的结果也会展示出来

    2. RIGHT JOIN

      右外连接 :右边连接表不符合条件的结果会展示出来

    -- LEFT JOIN
    SELECT * FROM orders;
    SELECT
        o.order_id,
        c.customer_id,
        o.customer_id,
        c.first_name
    FROM customers c
    LEFT JOIN orders o
        ON c.customer_id = o.customer_id;
    

    image-20240803101400525

    -- RIGHT JOIN
    SELECT
        o.order_id,
        c.customer_id,
        o.customer_id,
        c.first_name
    FROM customers c
    RIGHT JOIN orders o
        ON c.customer_id = o.customer_id;
    

    image-20240803101442035

  4. Outer Join Between Multiple Tables

    多表外连接

    将第一次外连接的结果在和其他表做外连接查询

    一般只用一个外连接,保持规范(直接全用LEFT JOIN哈哈哈)

    -- Outer Join Between Multiple Tables
    SELECT
        c.customer_id,
        c.first_name,
        o.order_id,
        s.name AS shipper
    FROM customers c
    LEFT JOIN orders o
    ON c.customer_id = o.customer_id
    LEFT JOIN shippers s
    ON o.shipper_id = s.shipper_id
    ORDER BY c.customer_id;
    

    image-20240803101955171

    外连接和内连接可以混合使用

    -- Outer Join Between Multiple Table Exercise
    SELECT
        o.order_date,
        o.order_id,
        c.first_name,
        sh.name AS shipper,
        os.name AS status
    FROM orders o
    JOIN customers c
        ON o.customer_id = c.customer_id
    LEFT JOIN shippers sh
        ON o.shipper_id = sh.shipper_id
    JOIN order_statuses os
        ON o.status = os.order_status_id
    ORDER BY os.name;
    

    image-20240803102459473

  5. Self Outer Joins

    自己和自己外连接查询

    -- Self Outer Joins
    USE sql_hr;
    SELECT
        e.employee_id,
        e.first_name,
        M.first_name AS manager
    FROM employees e
    LEFT JOIN employees m
        ON e.reports_to = m.employee_id;
    

    image-20240803102650881

  6. USING

    代替ON的作用

    ON oin.order_Id = oi.order_id AND oin.product_id = oi.product_id == USING (order_Id,product_id)

    -- USING 字句
    USE sql_store;
    SELECT
        oin.product_id,
        oin.order_Id,
        oi.quantity
    FROM order_item_notes oin
    RIGHT JOIN order_items oi
        ON oin.order_Id = oi.order_id
        AND oin.product_id = oi.product_id;
    SELECT
        oin.product_id,
        oin.order_Id,
        oi.quantity
    FROM order_item_notes oin
    RIGHT JOIN order_items oi
        USING (order_Id,product_id);
    

    image-20240803103940729

    USING只能使用在两个表共有的字段名,不同字段名无法使用

    ON p.payment_method = pm.payment_method_id

    -- USING Exercise
    USE sql_invoicing;
    SELECT
        p.date,
        c.name AS client,
        p.amount,
        pm.name
    FROM payments p
    JOIN clients c
        USING (client_id)
    JOIN payment_methods pm
        ON p.payment_method = pm.payment_method_id;
    

    image-20240803104005993

  7. NATURAL JOIN

    自然连接 :自动根据相同的列连接

    -- Natural Join自动根据相同的列连接
    SELECT
        p.date,
        c.name AS client,
        p.amount,
        pm.name
    FROM payments p
    NATURAL JOIN clients c
    JOIN payment_methods pm
        ON p.payment_method = pm.payment_method_id;
    

    image-20240803104208711

  8. CROSS JOIN

    1. 交叉连接

      每一列都和另外一张表的数据进行连接(笛卡尔积)

      -- Cross Join
      USE sql_store;
      SELECT
          p.name AS product,
          s.name AS shipper
      FROM products p
      CROSS JOIN shippers s;
      SELECT
             s.name AS shipper,
          p.name AS product
      
      FROM  shippers s, products p
      ORDER BY shipper;
      

      image-20240803104521450

  9. UNION

    1. 连接查询结果(列的数量要一样,且列名以第一条语句的列名为准)

      1. ‘Bronze’ AS type :新增一列名为 type 且值为 Bronze
      2. ‘Bronze’ :新增一列名为 Bronze 且值为 Bronze
      -- Union Exercise
      SELECT
          customer_id,
          first_name,
          points,
          'Bronze' AS type
      FROM customers
      WHERE points < 2000
      UNION
      SELECT
          customer_id,
          first_name,
          points,
          'Sliver' AS type
      FROM customers
      WHERE points BETWEEN 2000 AND 3000
      UNION
      SELECT
          customer_id,
          first_name,
          points,
          'Gold' AS type
      FROM customers
      WHERE points > 3000
      ORDER BY first_name;
      

      image-20240803104757990

三、插入、更新和删除数据

  1. Insert Multiple Rows

    插入多行数据

    INSERT INTO products
    VALUES (DEFAULT, 'product1', 25, 1.55),
           (DEFAULT, 'product2', 25, 1.55),
           (DEFAULT, 'product3', 25, 1.55),
           (DEFAULT, 'product4', 25, 1.55);
    
  2. Inserting Hierarchical Rows

    插入分层行

    -- 插入分层行 Inserting Hierarchical Rows
    -- LAST_INSERT_ID()获取最后插入行的ID
    INSERT INTO orders (customer_id, order_date, status)
    VALUES (1, '2024-08-02', 1);
    INSERT INTO order_items
    VALUES (LAST_INSERT_ID(), 2, 2, 2.98);
    
  3. Creating a Copy Of Table

    创建复制表

    将SELECT 查询出来的结果复制到新表中(表没有把主键等属性复制)

    -- Creating a Copy Of Table
    -- CREATE TABLE
    CREATE TABLE order_archived
    SELECT *
    FROM orders
    WHERE order_date > '2020-01-01';
    
    -- INSERT
    INSERT INTO order_archived
    SELECT *
    FROM orders
    WHERE order_date < '2019-01-01';
    
    -- Creating a Copy Of Table Exercise
    USE sql_invoicing;
    CREATE TABLE invoicing_archived
    SELECT i.invoice_id,
           c.name AS client,
           i.number,
           i.invoice_total,
           i.payment_total,
           i.payment_date,
           i.invoice_date,
           i.due_date
    FROM invoices i
             JOIN clients c
                  USING (client_id)
    WHERE payment_date IS NOT NULL;
    
  4. Using Sub queries In Updates

    -- Using Sub queries In Updates
    UPDATE invoices
    SET payment_total = invoice_total * 0.5,
        payment_date  = due_date
    WHERE client_id IN
          (SELECT client_id
           FROM clients
           WHERE state IN ('CA', 'OR'));
    
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值