【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全选后执行,即可恢复数据库到原始状态。
相关推荐
公贵买其鹿27 分钟前
List深拷贝后,数据还是被串改
java
云和数据.ChenGuang2 小时前
Django 应用安装脚本 – 如何将应用添加到 INSTALLED_APPS 设置中 原创
数据库·django·sqlite
woshilys2 小时前
sql server 查询对象的修改时间
运维·数据库·sqlserver
Hacker_LaoYi2 小时前
SQL注入的那些面试题总结
数据库·sql
建投数据3 小时前
建投数据与腾讯云数据库TDSQL完成产品兼容性互认证
数据库·腾讯云
xlsw_4 小时前
java全栈day20--Web后端实战(Mybatis基础2)
java·开发语言·mybatis
Hacker_LaoYi4 小时前
【渗透技术总结】SQL手工注入总结
数据库·sql
岁月变迁呀4 小时前
Redis梳理
数据库·redis·缓存
独行soc4 小时前
#渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍06-基于子查询的SQL注入(Subquery-Based SQL Injection)
数据库·sql·安全·web安全·漏洞挖掘·hw
神仙别闹4 小时前
基于java的改良版超级玛丽小游戏
java