mySQL 学习 DAY4笔记

作者: Peng_001 | 来源:发表于2020-02-22 11:57 被阅读0次

23 Natural Joins

  • 让database 自动识别join 的相关列表。可能会存在一定的错误—不推荐

24 Cross Joins

  • 将A表格中的每项内容都匹配B表格中的内容。
  • 运用场景:不同颜色和不同大小产生的组合方式。
SELECT 
    o.order_id,
    c.first_name
FROM customers c
CROSS JOIN orders o
## 也可以删除这行,参照18,直接用FROM customers,orders
ORDER BY order_id

25 Union

  • 选择的内容column数目需一致,否则会报错。
SELECT
    customer_id,
    first_name,
    points,
    "BRONZE" AS "type" ##column名称默认为第一组的
FROM customers
WHERE points < 2000
UNION ##连接
SELECT
    customer_id,
    first_name,
    points,
    "SILVER"
FROM customers
WHERE points BETWEEN 2000 AND 3000
UNION ##联合上下row
SELECT
    customer_id,
    first_name,
    points,
    "GOLD"
FROM customers
WHERE points > 3000
ORDER BY first_name

26 Column Attributes

  • 如何插入、更新、删除信息

属性:
1)PK:primary key
2)NN:NOT NULL
3)AL:auto-increment
4)default value

27 Inserting a Single Row

INSERT INTO customers
VALUES (
    DEFAULT, 
    'John', 
    'Smith', 
    NULL, 
    NULL,
    'NULL',
    'NULL',
    'VA',
    DEFAULT)
  • 或者还可以在customers()中写需要添加信息的column的名称,在value中就无需写DEFAULT或NULL的内容了。

28 Inserting Multiple Rows

  • 插入多行
INSERT INTO products(name,quantity_in_stock,unit_price)
VALUE('one',10,2),
    ('two',5,1),
    ('three',3,0.5)
##直接用多个括号分开来表示

29 Inserting Hierarchical Rows

  • 表格之间存在一种hierarchy 关联
INSERT INTO orders (customer_id, order_date, status)
VALUES (1,'2019-01-01',1);
    
INSERT INTO order_items
VALUES
    (LAST_INSERT_ID(),1,1,5),
    (LAST_INSERT_ID(),2,1,2.5)
## LAST_INSERT_ID 可用来获取默认添加的数值(对应父表的信息)

30 Creating a Copy of a Table

  • CREATE 语句可以快速复制表格,但表格的属性并不会复制到新表中
CREATE TABLE invoices_archived AS
SELECT *
FROM invoices
WHERE payment_date IS NOT NULL
##创建新表格archived 从invoices中复制,并选择有date 的rows

31 Updating a Single Row

UPDATE invoices
SET 
    payment_total = 50,
    payment_date = '2019-06-06'
WHERE invoice_id = 1
## 更新信息到 id=1 invoice 上

32 Updating Multiple Rows

  • mySQL 在参数中默认启动Safe Updates 模式,使得操作中不能通过一条指令来修改非PK多行。

Error Code: 1175. You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column To disable safe mode, toggle the option in Preferences -> SQL Editor and reconnect.

UPDATE customers
SET 
    points = points + 50
WHERE birth_date < '1990-01-01'
##给90年前的顾客加五十分

33 Using Subqueries in Updates

  • 通过子序列来选择修改的数据范围
UPDATE orders
SET 
    comments = 'Gold Customer'
WHERE customer_id IN
    (SELECT customer_id
    FROM customers
    WHERE points >= 3000)
## 对分数大于3000的用户列表的用户,更新他们在order 列表中的评论——黄金用户。

34 Deleting Rows

DELETE FROM invoices
删除发票列表的全部信息。
也可以在底下用WHERE语句限制条件。

35 Restoring the Databases

重新打开“Open SQL script”
即可

36 Aggregate Fuctions

  • mySQL 内置了大量的fuctions
SUM() ##算总值
AVG() ##算平均
MAX() ##算最大值
MIN() ##算最小值
COUNT() ##计算记录数量
## 在invoice 表格中,计算19年上半年、19年下半年,以及19年全年的发票金额,与账单金额,并计算差值(获得收入)。
SELECT
    'First half of 2019' AS date_range,
    sum(invoice_total) AS total_sales,
    sum(payment_total) AS total_payments,
    sum(invoice_total - payment_total) AS 'what we expect'
FROM invoices
WHERE invoice_date BETWEEN '2019-01-01' AND '2019-06-30'
UNION
SELECT
    'Second half of 2019' AS date_range,
    sum(invoice_total) AS total_sales,
    sum(payment_total) AS total_payments,
    sum(invoice_total - payment_total) AS 'what we expect'
FROM invoices
WHERE invoice_date BETWEEN '2019-07-01' AND '2019-12-31'
UNION
SELECT
    'Total' AS date_range,
    sum(invoice_total) AS total_sales,
    sum(payment_total) AS total_payments,
    sum(invoice_total - payment_total) AS 'what we expect'
FROM invoices
WHERE invoice_date BETWEEN '2019-01-01' AND '2019-12-31'

37 The GROUP BY Clause

  • GROUP BY 可以对列表信息按照一定内容分组。分组后再对数据内容按照一定函数处理。
SELECT 
    p.date,
    pm.name AS payment_method,
    sum(p.amount) AS total_payments
FROM payments p
JOIN payment_methods pm
    ON p.payment_method = pm.payment_method_id
GROUP BY p.date, p.payment_method
ORDER BY p.date
## 按照时间和付款方式分组,分组后的金额再计算总数sum()

38 The HAVING Clause

  • 类似于WHERE 的filter功能
    但使用于GROUP BY操作后
    使用条件得是存在于SELECT中的内容
SELECT 
    c.first_name,
    c.last_name,
    c.state,
    SUM(oi.quantity * oi.unit_price) AS total_sales ##总的消费金额
FROM customers c
JOIN orders o
    USING (customer_id) ##c 查到o
JOIN order_items oi
    USING (order_id)## o 查到 oi 找到oi.quantity * oi.unit_price 计算total_sales
WHERE c.state = 'VA' 
GROUP BY 
    c.customer_id ##根据用户id分组
HAVING total_sales > 100
## 根据用户分组,选择住在VA,并消费金额大于100$的用户

相关文章

网友评论

    本文标题:mySQL 学习 DAY4笔记

    本文链接:https://www.haomeiwen.com/subject/ipclqhtx.html