SQL基础——DML语句

DML语句

insert into 表名 values(字段值1, 字段值2, .....),(字段值1, 字段值2, .....), ....;

insert into 表名(字段1, 字段2,...) values(字段值1, 字段值2,....), (字段值1, 字段值2,....),.....;

DML之插入语句:

-- DML语言: 数据操作语言, 对于数据库进行增 删 改的操作  (可以理解为数据库的写入操作)
-- DML操作--增
-- 关键字  insert 数据插入时使用的关键字
​
-- 数据准备
USE test_db;
-- 创建数据表
CREATE TABLE student
(
    id     INT,
    name   VARCHAR(30),
    gender VARCHAR(20)
);
​
-- 1. 一次插入一条数据记录, 不指定被插入的字段
-- 格式: insert into 表名 value(字段值1, 字段值2, .....);
-- INSERT INTO student VALUE (1, '小明', '男');
-- Incorrect string value: '\xE5\xB0\x8F\xE6\x98\x8E' for column 'name' at row 1
-- 此时报错的原因是 test_db数据库, 没有指定字符集, 默认是latin1编码集, 不能保存中文数据.
INSERT INTO
    student VALUE (1, 'xiaoming', 'man');
-- 如果插入数据为英文字母,则可以插入成功
​
-- 如果想要插入中文信息 , 可以在编码集为utf8的数据库中插入
-- 数据准备
USE test_db_utf8;
-- 创建数据表
CREATE TABLE student
(
    id     INT,
    name   VARCHAR(30),
    gender VARCHAR(20)
);
​
-- 插入数据, 内部含有中文记录
INSERT INTO
    student VALUE (1, '小明', '男');
​
-- 这种插入方式, 字段值的数量要与表中字段的数量完全一致, 不能多也不能少
-- Column count doesn't match value count at row 1
# INSERT INTO student VALUE (1, '小明', '男', '2');
# INSERT INTO student VALUE (1, '小明');
​
-- 2. 一次插入一条数据记录,指定被插入的字段名, 未指定的默认赋值为null
-- 格式: insert into 表名(字段1, 字段2,...) value(字段值1, 字段值2,....);
INSERT INTO
    student(id, name) VALUE (2, '小芳');
​
-- 这种方式插入, 指定的字段数量, 要与value中字段值的数量完全一致, 否则会报错
-- Column count doesn't match value count at row 1
# INSERT INTO student(id, name) VALUE (2,'小芳', '男');
# INSERT INTO student(id, name) VALUE (2);
​
-- 3. 一次插入多条数据, 不指定被插入的字段
-- 格式: insert into 表名 values(字段值1, 字段值2, .....),(字段值1, 字段值2, .....), ....;
INSERT INTO
    student
VALUES
    (3, '小智', '男'),
    (4, '小刚', '男'),
    (5, '小霞', '女');
​
-- 4. 一次插入多条数据记录, 指定被插入的字段, 未指定的字段填充null (空值的意思)
-- 格式: insert into 表名(字段1, 字段2,...) values(字段值1, 字段值2,....), (字段值1, 字段值2,....),.....;
INSERT INTO
    student(id, name)
VALUES
    (6, '鲁智深'),
    (7, '唐伯虎'),
    (8, '蔡徐坤');
​
-- 注意事项:
-- 1. 插入数据时, 字段值数量 要与字段数量相匹配否则会报错
-- Column count doesn't match value count at row 1
​
-- 2. 一般我们在开发中共仅使用values一种形式, 因为values 既可以插入一条数据, 又可以插入多条数据.
INSERT INTO
    student
VALUES
    (9, '张三', '男');
​
-- 3. 插入数据时, 数据值和字段顺序必须匹配, 否则可能出现错误
​
-- 插入顺序错误时,会进行自动数据类型转换, 转换成功则插入错误数据, 转换失败则报错
-- Incorrect integer value: '张三' for column 'id' at row 1
-- INSERT INTO student VALUES ('张三', 10, '男');
-- INSERT INTO student VALUES (10, '男', '张三');
​
-- null 是空值, 证明没有被赋值, 而不是赋值为0的意思

DML之数据的修改和删除操作

update 表名 set 字段名 = 值 [where 筛选条件];

delete from 表名 where [筛选条件];

USE test_db_utf8;
-- 1. 修改数据记录
-- 关键字: update 修改已有数据记录中的指定字段的值.
-- 格式: update 表名 set 字段名 = 值 [where 筛选条件];
-- 需求1: 将id = 4的学员 性别修改为女
UPDATE student
SET
    gender = '女'
WHERE
    id = 4;
​
-- 需求2: 将id = 5的学员 性别修改为男, 姓名修改为李大;
UPDATE student
SET
    name   = '李大',
    gender = '男'
WHERE
    id = 5;
​
-- 需求3: 将所有性别为男的学员的性别修改为女
UPDATE student
SET
    gender = '女'
WHERE
    gender = '男';
​
-- 注意1: 修改数据记录时, 被修改的字段的值必须与原数据的数据类型一致
-- ncorrect integer value: '男' for column 'id' at row
UPDATE student
SET
    id = '男'
WHERE
    id = 1;
​
-- 注意2: 在修改时 一般都有where 如果没有则对于所有的数据记录进行修改(慎用)
UPDATE student
SET
    gender = '男';
​
-- 2. 删除数据记录
-- delete , 删除表中的数据记录,  记住不是删除表.
-- 格式: delete from 表名  where [筛选条件];
-- 需求: 删除表中id = 5的数据记录
DELETE
FROM
    student
WHERE
    id = 5;
​
-- 需求: 删除表中id=6的gender字段的值
UPDATE student
SET
    gender = NULL
WHERE
    id = 6;
​
-- 注意1: delete 需要一次删除整条数据记录, 如果需要删除的为某一个字段的值 依然需要使用update
​
-- 注意2: 如果想删除所有的数据记录, 可以不写where 或者直接给该where条件一个恒成立的条件即可
DELETE
FROM
    student;
​
DELETE
FROM
    student
WHERE
    1 = 1;
​
-- 清空表数据的另外一种方法 truncate
TRUNCATE TABLE student;

primary key 主键约束

主键约束,就是规定该列数据,既不重复,也不为空.

为什么要定义主键约束呢?

每一条主键都对应唯一的一条数据,每一条数据也有唯一一个主键相对应.

此时我们查找数据时,只要查找到主键信息,就可以获取该条记录的全部能容, 可以提升查询效率

什么样的字段可以作为主键出现呢?

  1. 主键一般都是无意义的数据.

  2. 主键一般不会自己手动输入,而是借助计算机进行自增

  3. 主键一般为数值型(整数)

  4. 主键不会修改

  5. 每一张表都建议有一个主键, 且只能有一个主键约束字段

 

-- 0.使用数据库
USE test_db_utf8;
​
-- 1. 数据准备, 在创建数据表时,增加主键约束
CREATE TABLE person
(
    id     INT PRIMARY KEY,
    name   VARCHAR(30),
    gender VARCHAR(20)
);
​
-- 使用desc 查看字段详情, 里边详细说明了哪个字段为主键
DESC person;
​
-- 2. 每张表, 建议有, 且仅能有一个主键字段.
-- 报错: Multiple primary key defined
-- 提示我们定义了重复主键, 此时,每张表最多有一个主键.
CREATE TABLE person1
(
    id     INT PRIMARY KEY,
    name   VARCHAR(30) PRIMARY KEY,
    gender VARCHAR(20)
);
​
-- 3. 主键可以修饰各种数据类型,  不一定时整型,但是官方建议我们使用整数类型数据, 作为主键.
CREATE TABLE person2
(
    id     INT,
    name   VARCHAR(30) PRIMARY KEY,
    gender VARCHAR(20)
);
​
DESC person2;
​
-- 4. 主键字段中插入的数据值不能为空
-- 4.1 插入一个空值数据, 无法存储
-- 报错: Column 'id' cannot be null
INSERT INTO
    person
VALUES
    (NULL, '小明', '男');
​
-- 4.2 插入数据时如果主键字段你没有默认值, 则不能不给主键字段赋值
-- Field 'id' doesn't have a default value
INSERT INTO
    person(name, gender)
VALUES
    ('小明', '男');
​
-- 5. 主键字段中插入不能插入重复的值
-- Duplicate entry '1' for key 'PRIMARY'
INSERT INTO
    person
VALUES
    (1, '小明', '男');
INSERT INTO
    person
VALUES
    (1, '小芳', '女');
​
-- 6. 创建表后添加主键约束 (了解)
-- 创建没有主键约束的表
CREATE TABLE person3
(
    id     INT,
    name   VARCHAR(30),
    gender VARCHAR(20)
);
​
-- 建表后添加主键约束
ALTER TABLE person3 ADD PRIMARY KEY (id);
-- 查看主键约束是否添加完成
DESC person3;
​
-- 7. 删除主键约束 (了解)
-- 需求: 删除person2表中的主键约束
ALTER TABLE person2 DROP PRIMARY KEY ;
-- 查看主键约束是否删除完成
-- 注意: 删除主键约束后, 非空约束依然存在.

auto increment自动增长

自动增长并不是一个约束,而是一个扩展extra

自动增长的主要作用,就在不传值,或者传值为null 的时候,实现记录的自增赋值工作

自动增长只能修饰键,且只能修饰整型

下方表中, key列有值,就是一个键, 否则就不是键. (键的最基本要求: 不能重复)

-- 自动增长 : 是一个扩展功能, 在我们给数据传值时,如果该字段是自动增长字段,则会在不传值, 传0 或null 时自增后自动赋值
-- 关键字  auto_increment
-- 0. 使用数据库
USE test_db_utf8;
​
-- 1. 创建一个数据表, 给字段增加自动增长约束
CREATE TABLE heros
(
    id    INT PRIMARY KEY AUTO_INCREMENT,
    name  VARCHAR(20),
    skill VARCHAR(30)
);
​
-- 查看表结构, 验证自动增长是否添加成功
DESC heros;
​
-- 2. 添加自动增长的字段必须为键(在查询字段详情时, key列有值)
-- 报错: there can be only one auto column and it must be defined as a key
CREATE TABLE heros1
(
    id    INT AUTO_INCREMENT,
    name  VARCHAR(20),
    skill VARCHAR(30)
);
​
-- 3. 添加自动增长字段的列 必须为整数类型.
-- 报错:Incorrect column specifier for column 'name'
CREATE TABLE hero2
(
    id    INT PRIMARY KEY,
    name  VARCHAR(30) AUTO_INCREMENT,
    skill VARCHAR(30)
);
​
-- 4. 插入数据时, 给自动增长列插入null将会自动增长
-- 数据从0开始自增
INSERT INTO heros VALUES (null, '梅超风', '九阴白骨爪');
​
-- 5. 插入数据时, 给自动增长列插入0将会自动增长
INSERT INTO heros VALUES (0, '虚竹', '天山折梅手');
​
-- 6. 插入数据时, 不给自动增长字段插入数据, 将会默认插入一个自动增长值
INSERT INTO heros(name, skill) VALUES ('乔峰', '降龙十八掌');
​
-- 7. 如果我插入的数据为指定数值, 则保存相关数据.
INSERT INTO heros VALUES (9, '杨过', '养雕');
​
-- 8. 再次触发自动增长机制, 则根据哪一个数字进行自增呢?
-- 自动增长机制: 在当前列的最大值基础上自增1 添加到数据列中,  如果表中无任何数据, 则默认从0开始自增.
INSERT INTO heros VALUES (0, '段誉', '六脉神剑');

我们向自增字段中添加null, 0 或者不添加数据,都会触发主键自增.

主键自增字段可以插入指定值,但是不能重复

主键自增的计算规则是在当前列最大值的基础上加1

自增只能修饰 整型 键.

  • 主键自增扩展

-- 扩展: 有主键自增的数据列, 删除主键约束
-- 需求: 删除heros表中id列的主键约束
-- there can be only one auto column and it must be defined as a key
ALTER TABLE heros DROP PRIMARY KEY ;
​
-- 删除主键约束后, id列不再是键, 此时自动增长则修饰了一个非键列, 所以不允许修改.
-- 如果想要修改,需要先删除自增扩展, 再删除主键约束
ALTER TABLE heros CHANGE id id INT;
​
-- 查询表结构
DESC heros;
 
-- 删除主键约束
ALTER TABLE heros DROP PRIMARY KEY ;
​
-- 查询表结构
DESC heros;

not null 非空约束

  • 非空约束修饰的字段不能为空

 

-- 非空约束 关键字: not null   此列数据,不能填写空值.
-- 0. 使用数据库
USE test_db_utf8;
​
-- 1. 建表时,添加非空约束
CREATE TABLE students (
    id INT PRIMARY KEY ,
    name VARCHAR(20) NOT NULL ,
    gender VARCHAR(20)
);
​
-- 2. 查看表结构, 查看所有的字段详情
DESC students;
​
-- 3. 非空约束修饰的字段, 不能存在null值
-- Column 'name' cannot be null
-- INSERT INTO students VALUES (1, null, '男');
​
-- Field 'name' doesn't have a default value
-- INSERT INTO students(id, gender) VALUES (1, '男');
​
-- 4. 非空约束的字段, 可以重复
INSERT INTO students VALUES (1, '小强', '男');
INSERT INTO students VALUES (2, '小强', '女');
​
-- 扩展: 删除非空约束的方法
ALTER TABLE students CHANGE name name VARCHAR(30);
​
-- 查看字段详情
DESC students;

unique 唯一约束

  • 唯一约束修饰的字段,不能重复

 

-- 唯一约束 UNIQUE 在唯一约束修饰的列中, 不能存放重复值.
-- 0. 使用数据库
USE test_db_utf8;
​
-- 1. 创建数据表, 添加唯一约束
CREATE TABLE device (
    id INT PRIMARY KEY ,
    price DOUBLE ,
    description VARCHAR(20) UNIQUE
);
​
-- 2. 查看表的字段详情, 检验唯一约束添加成功
-- 唯一约束的列 也是一个键.
DESC device;
​
-- 3. 唯一约束不能插入重复的值
INSERT INTO  device VALUES (1, 20.8, '这个机器真便宜');
-- Duplicate entry '这个机器真便宜' for key 'description'
INSERT INTO  device VALUES (2, 6000000.4, '这个机器真便宜');
​
-- 4. 唯一约束可以插入空值, 且空值不计入重复数据中, 也就是可以有无数个空值.
INSERT INTO device VALUES (3, 12, NULL);
INSERT INTO device(id, price)  VALUES (4, 15);
​

default 默认值

-- 默认值不是一个约束条件, 不能限制我们插入数据.
-- 添加默认值后, 如果我们没有给该数据赋值,则自动使用默认值. 如果没有添加默认值, 则自动赋值为null
-- 关键字 : default
-- 0. 使用数据库
USE test_db_utf8;
​
-- 1. 在建表时添加默认值
CREATE TABLE student_info
(
    id     INT PRIMARY KEY,
    name   VARCHAR(30) DEFAULT '无名氏',
    gender VARCHAR(20)
);
​
-- 2. 查看字段详情, 验证默认值添加成功
DESC student_info;
​
-- 3. 当未给name字段赋值时, 默认使用其默认值进行填充
INSERT INTO
    student_info(id, gender)
VALUES
    (1, '男');
​
-- 4. 当给name赋值时,将会把用户传入的数据填充到该字段位置.
INSERT INTO
    student_info
VALUES
    (2, '小芳', '女');
​
-- 5. 填写0 或者 null 等 不会触发默认值.
INSERT INTO
    student_info
VALUES
    (3, NULL, '男');
INSERT INTO
    student_info
VALUES
    (4, 0, '男');
​
-- 自动增长本质上就是一个特殊规则的默认值. 

  • 9
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值