MySQL(B站CodeWithMosh)——2024.10.4(7)
ZZZZZZ目的
ZZZZZZ代码
ZZZZZZ重点
ZZZZZZ操作(非代码,需要自己手动)
- 第一列是表的列名称;
第二列是数据类型,INT是整数类型,VARCHAR是可变字符的缩写,括号里的数字表示这列最多可以有多少个字符,比如有5个字符,那么VARCHAR只会占用5个字符的位置,但是CHAR会用这5个字符和另外45个空格将50个位置都占满,会浪费空间,所以一般都用VARCHAR;
第三列PK是主键的缩写,哪列被标记为主键,哪列的前面就会有⚡;
第四列NN是指非空值,决定了该列是否可以写空值,比如phone这一列就可以存在NULL;
第九列AI意思是自动递增,通常被用在主键列,一般在MySQL中插入一个值,其实就是在最后一行加入一个顾客id,会在加入新纪录的同时将顾客id增加;
最后一列表明了每列的默认值,比如phone的默认值是NULL,所以如果没有提供任何值,MySQL会给这些列直接填上NULL
- 在customers表格中插入一行,这位顾客叫John Smith,出生在1990年1月1日,居住在CA州的city城市的address
INSERT INTO customers
VALUES (DEFAULT, 'John', 'Smith', '1990-01-01', NULL,
'address', 'city', 'CA', DEFAULT)
要在VALUES后面的括号中填入每一列的取值,首先要填写顾客id,但是可以看到顾客id的AI是勾选上了的,所以如果我们不提供任何值,MySQL就会帮我们生成一个唯一值,这时就可以用DEFAULT让MySQL自己生成一个值,避免我们自己输入的数值和别人的顾客id一样;
对于birth_date和phonr这两列,可以看到NN没有选中,所以这里既可以填写数据,也可以不填写数据(用DEFAULT可以让MySQL填写空值,或者直接写NULL代表空值,这里的NULL不是字符串,不用加引号)
可以看出,其实我们就只填了名、姓、出生日期、地址、城市和州,所以还可以这样写:
INSERT INTO customers (first_name, last_name, birth_date, address, city, state)
VALUES ('John', 'Smith', '1990-01-01', 'address', 'city', 'CA')
- 在shippers表格中新生成三个名为Shipper1、Shipper2和Shipper3的送货人
INSERT INTO shippers (name)
VALUES ('Shipper1'), ('Shipper2'), ('Shipper3')
【练习题】
在products表格中新生成如图的以下几行
INSERT INTO products (name, quantity_in_stock, unit_price)
VALUES ('Product1', 10, 1.95), ('Product2', 11, 1.95), ('Product3', 12, 1.95)
- 在orders中加入一笔顾客id为1的订单,订单生成日期为2019年1月2日,订单状态为1;这笔订单一共买了两种产品,第一种产品的id为1,买了1个,单价为2.95,第二种产品的id为2,买了1个,单价为3.95,将这个信息输入到order_items中
INSERT INTO orders (customer_id, order_date, status)
VALUES (1, '2019-01-02', 1);
INSERT INTO order_items
VALUES (LAST_INSERT_ID(), 1, 1, 2.95), (LAST_INSERT_ID(), 2, 1, 3.95)
先是在orders中添加一笔订单信息,然后,由于已经添加了一笔订单信息,订单id已经生成了,那么就要将这个刚生成的订单id放在order_items的订单id中,这里就会用到LAST_INSERT_ID这个函数,这个函数会输出上一个刚刚输出的id。
需要注意,这里有两个INSERT INTO,是两段代码,所以需要在第一段代码结束的时候加上分号
在INSERT INTO的时候,其实只用打开这个表的工具按钮,看看NN里面有哪几列被选上了,再看看AI里有哪几列被选上了,一般注意到这几列就可以了
- 将orders表格复制,建立一个新的名为orders_archived的表格
CREATE TABLE orders_archieved AS
SELECT * FROM orders
创建完了之后,需要点击SCHEMAS右上角的刷新按钮,这样创建的表格才会出现
点击orders_archived的工具按钮,可以发现表格没有主键,也就是order_id没有被标记为主键,这列的AI也没有选中,所以在用这种方法创建新的表格时,MySQL会忽略这些属性 - 右键orders_archived表,点击Truncate Table(截断表,也就是删除表中的所有行),然后点击Truncate,再点击表格的刷新按钮,可以发现orders_archived表中没有任何数据了
- 将2019年1月1日之前的订单的全部信息复制到orders_archived表中
INSERT INTO orders_archived
SELECT *
FROM orders
WHERE order_date < '2019-01-01'
【练习题】
将sql_invoicing中的invoices表中支付过的发票复制(可以看是否有支付日期或者),并置于新表invoices_archive中,然而在新表中,我们不想要client_id列,想要client_name列,并将这一列命名为client,而且要求使用CREATE TABLE中的一段子查询
USE sql_invoicing;
CREATE TABLE invoices_archive AS
SELECT i.invoice_id, i.number, c.name AS client, i.invoice_total,
i.payment_total, i.invoice_date, i.payment_date, i.due_date
FROM invoices i
JOIN clients c USING (client_id)
WHERE i.payment_date IS NOT NULL
- 筛选出支付过的发票→查看是否有支付日期或者payment_total中的数字是否大于0
- 不想要client_id列,想要client_name列→将nvoics表和clients表合并
- 如果再次运行这段代码,会发现报错,这是因为已经存在invoices_archive这个表格,右键invoices_archive表格,点击Drop Table,再点击Drop Now,删除这个表格后就可以正常运行这段代码了
原文地址:https://blog.csdn.net/unicorn_lemon/article/details/142701790
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!