【MySQL】列属性

文章目录

CHAR和VARCHAR

  1. CHAR(50):存储文本占5个字符,MySQL会再插入45个空格符填满此列。因此一般最好用VARCHAR来存储字符串或文本值。
  2. VARCHAR(50):文本占5个字符,就只存储这5个字符,不会浪费空间。

插入单行 INSERT INTO

  • INSERT INTO 表明(列名) VALUE(每列的值)
  • DEFAULT:写入默认值
sql 复制代码
-- 按照customers里的列,输入所需要的内容。
INSERT INTO customers
VALUES (
        DEFAULT,
        'John',
        'Smith',
        '1990-01-01',
        NULL,
        'address',
        'city',
        'CA',
        DEFAULT)

-- 指定插入customers中的哪些列,插入默认值的和NULL的可以不写在这里面。
INSERT INTO customers(
		first_name,
		last_name,
		birth_date,
		address,
		city,
		state)		
VALUES (
        'John',
        'Smith',
        '1990-01-01',
        'address',
        'city',
        'CA')

插入多行

  • VALUES后接几个括号就是插入几行
sql 复制代码
INSERT INTO shippers(name)
VALUES ('Shipper1'),
       ('wuxu'),
       ('songtuo')
sql 复制代码
-- 小小练习
INSERT INTO products
-- DEFAULT是默认列id,也可以不写
VALUES (DEFAULT, 'laote', 89, 1.34),
       (DEFAULT, 'laoda', 82, 1.33),
       (DEFAULT, 'laoer', 75, 1.32)

-- 另一种写法,插入行信息中不写DEFAULT
INSERT INTO products(name, 
			quantity_in_stock,
			unit_price)
VALUES ('laote', 89, 1.34),
       ( 'laoda', 82, 1.33),
       ( 'laoer', 75, 1.32)

插入分层行 LAST_INSERT_IN()

  • 获取新加记录的id:LAST_INSERT_IN()
sql 复制代码
-- 在orders里增加一条新记录,新的order_id是默认增加的,对应后面的LAST_INSERT_ID()
INSERT INTO orders(customer_id,
                   order_date,
                   status)
VALUES (1, '2019-01-02', 1);

-- 在order_items里对应刚添加的order_id添加新的订单货物信息,调用LAST_INSERT_ID获取新加的记录的id
INSERT INTO order_items
VALUES (LAST_INSERT_ID(), 1, 1, 2.95),
       (LAST_INSERT_ID(), 2, 1, 5.63);

创建表复制 CREAT TABLE AS

  • 用CREAT TABLE AS 创建的表复制,复制的表中没有主键,也没有被标记为自动递增的列
  • Truncate:右键表,使用这个工具可以清除表中所有的数据,使表变成空表
  • 向表中插入数据时,可以使用选择语句(SELECT FROM WHERE)作为插入语句(INSERT INTO)的子查询进行数据的插入
sql 复制代码
-- 新增的表没有主键,也没被标记为自动递增列
CREATE TABLE orders_archived_wuxu AS
SELECT * FROM orders

-- 可以使用Truncate工具删除表中的所有数据
-- 在复制的已经被删除了所有数据的新表中,想插入2019-01-01之前的数据,可以'使用选择语句做作为插入语句中的子查询'
INSERT INTO orders_archived_wuxu
SELECT *
FROM orders
WHERE order_date < '2019-01-01'
sql 复制代码
-- 小小练习
CREATE TABLE invoices_archived_wuxu AS
SELECT invoice_id,
       number,
       c.name,
       invoice_total,
       payment_total,
       invoice_date,
       due_date,
       payment_date
FROM invoices
JOIN clients c USING (client_id)
WHERE payment_date IS NOT NULL;

更新单行 UPDATE...SET

  • UPDATE 表名 SET 每列信息
sql 复制代码
-- 更新id为1的这列
UPDATE  invoices
SET payment_total = 10, payment_date = '2019-03-01'
WHERE invoice_id = 1;

-- 把id为1的这列恢复成更新之前的
UPDATE  invoices
SET payment_total = DEFAULT, payment_date = NULL
WHERE invoice_id = 1;

-- 更新id为3的这列
UPDATE  invoices
SET payment_total = invoice_total * 0.5,
    payment_date = due_date
WHERE invoice_id = 3;

更新多行

  • 在WHERE子句中选择多行更新即可
sql 复制代码
UPDATE invoices
SET payment_total = invoice_total * 0.5,
    payment_date = due_date
-- WHERE子句中选择多行更新即可
WHERE client_id IN (3,4);
sql 复制代码
-- 小小练习,给在1990-01-01之前的顾客加50分
USE sql_store;
UPDATE customers
SET points = points + 50
WHERE birth_date < '1990-01-01';

在UPDATES中使用子查询【需着重复习】

sql 复制代码
-- 不采用硬编码指定值
USE sql_invoicing;
UPDATE invoices
SET payment_total = invoice_total * 0.5,
    payment_date = due_date
-- client_id不直接指定为几,不采用硬编码
-- 而是通过子查询来指定client_id的值
WHERE client_id =
      (SELECT client_id
       FROM clients
       WHERE name = 'Myworks')

UPDATE invoices
SET payment_total = invoice_total * 0.5,
    payment_date = due_date
-- 多个查询条件是要换成IN
WHERE client_id IN
      (SELECT client_id
       FROM clients
       WHERE state IN ('CA', 'NY'))
sql 复制代码
-- 练习
-- 我的写法,先把orders和customers表通过id匹配
UPDATE orders
JOIN customers USING (customer_id)
SET comments = 'GoldenClient'
WHERE shipped_date IS NOT NULL AND points > 3000

-- 筛选条件中直接写子查询,这样更清楚,思路更易懂。需要学习、习惯这种写法
UPDATE orders
SET comments = 'GoldenClient'
WHERE shipped_date IS NOT NULL AND
      customer_id IN (
                    SELECT customer_id
                    FROM customers
                    WHERE points > 3000)

删除行 DELETE

  • DELETE FROM
sql 复制代码
DELETE FROM invoices
WHERE client_id = (
    SELECT client_id
    FROM clients
    WHERE name = 'Myworks')

恢复数据库到原始状态

  • 在IDEA中找到Project,选择对应的sql文件,双击后,CtrlA全选后执行,即可恢复数据库到原始状态。
相关推荐
盐真卿1 天前
python2
java·前端·javascript
梦梦代码精1 天前
BuildingAI vs Dify vs 扣子:三大开源智能体平台架构风格对比
开发语言·前端·数据库·后端·架构·开源·推荐算法
一嘴一个橘子1 天前
mybatis - 动态语句、批量注册mapper、分页插件
java
组合缺一1 天前
Json Dom 怎么玩转?
java·json·dom·snack4
危险、1 天前
一套提升 Spring Boot 项目的高并发、高可用能力的 Cursor 专用提示词
java·spring boot·提示词
kaico20181 天前
JDK11新特性
java
钊兵1 天前
java实现GeoJSON地理信息对经纬度点的匹配
java·开发语言
jiayong231 天前
Tomcat性能优化面试题
java·性能优化·tomcat
秋刀鱼程序编程1 天前
Java基础入门(五)----面向对象(上)
java·开发语言
纪莫1 天前
技术面:MySQL篇(InnoDB的锁机制)
java·数据库·java面试⑧股