Java 阶段三 Day02
DML语言(Data Manipulation Language)-数据操作语言
用户通过它可以实现对数据库的基本操作。例如,对表中数据的查询、插入、删除和修改。 在DML中,应用程序可以对数据库作插,删,改,排,检等五种操作。
INSERT
:向表中插入新数据的语句
UPDATE
:修改表中数据的语句
DELETE
:删除表中数据的语句
INSERT
- 向表中插入数据
- 在数据库中,字符串的字面量是使用单引号括起来的,需要注意
- 在
INSERT
语句中指定的字段与VALUES
后面指定的值的顺序,个数,类型要完全一致- 在
INSERT
语句中字段指定时的顺序和个数可以与表结构定义时不一致
INSERT INTO 表名 (字段1,字段2,...) VALUES (值1,值2...)
- 插入默认值
INSERT
语句中指定字段时,忽略的字段会被插入默认值。当表中字段没有被明确指定默认值时,默认值一律为NULL
- 默认值的指定:属于
DDL
语句范畴,使用DEFAULT
关键字来为字段指定默认值,可以在创建表时,也可以在修改表时指定
- 创建表时字段指定默认值
CREATE TABLE 表名(
字段名1 类型[(长度)][DEFALUT 默认值][约束],
字段名2 类型[(长度)][DEFALUT 默认值][约束],
) [charset = 字符集]
- 修改表时字段指定默认值
ALTER TABLE 表名 CHANGE 原字段名 新字段名 类型 [(长度) 默认值 约束]
- 批量插入数据
INSERT INTO 表名(字段...) VALUES (第一组值...),(第二组值...), ...
- 全列插入数据
- 在
INSERT
语句中不指定字段时,为全列插入,此时要求VALUES
子句后面指定的值的个数,顺序,类型必须与表结构中字段完全一致- 子句:在SQL语句中一个关键字可以组成一个子句
INSERT INTO 表名 VALUES (值1,值2...)
#此时要求VALUES子句中指定的值必须与表结构一致
DELETE
DELETE
语句通常不会忽略WHERE
子句,否则是清空表操作
- 删除表字段数据:
DELETE FROM 表名 [WHERE 过滤条件]
- 清空表:
DELETE FROM person
总结:
INSERT
语句,向表中插入数据的语言INSERT
语句指定的字段顺序,个数可以与表结构不一致,但是VALUES
子句后指定的值必须与指定的字段顺序,类型,个数完全一致INSERT
语句在指定字段时,可以忽略某些字段,此时插入数据时被忽略的字段会插入默认值INSERT
语句中可以使用关键字DEFAULT
显示声明插入默认值INSERT
语句中可以使用关键字NULL
显示声明插入NULL
值INSERT
语句中不指定字段时为全列插入,此时VALUES
后指定的值的顺序,个数,类型要与表结构完全致。实际开发中不推荐这样的写法。
UPDATE
语句,修改表中记录的语言UPDATE
语句通常要指定WHERE
子句,如果不指定则为全表修改
DELETE
语句,删除表中记录的语言DELETE
语句通常要指定WHERE
子句,否则是清空表操作
数据类型
整数类型
INT
类型:占用4字节,保存范围:± 21亿- INT(M):M表示位数
BIGINT
类型:占用8字节
浮点类型
DOUBLE
(M,N):- M表示数字位,N表示小数位,( M包含N位 )
- 如果小数位的精度超过了允许精度,会进行四舍五入
INSERT INTO person1(salary) VALUES(1234.867); #7会进行四舍五入,实际插入表中后,该记录salary字段的值位1234.87
- 如果四舍五入后得到的值超过了该字段可以保存的最大值时会报错:
Out of range value for column ...
INSERT INTO person1(salary) VALUES(99999.997);
字符类型
- 定长字符串:
CHAR
CHAR(m):m是一个数字,表示长度,单位是字符。m最大可取255
CHAR类型在磁盘中开辟的长度是固定的。例如:CHAR(3),若字符集为UTF-8,则固定开辟12字节。如果实际保存的数据不足则会补充若干个空格来填充长度
优点:在磁盘中保存每条记录的长度是固定的,因此读取速度快
缺点:在磁盘中占用空间固定,无论实际保存数据多少,都要占够空间,因此对磁盘空间有浪费
- 变长字符串:
VARCHAR
、TEXT
VARCHAR(m):m是是一个数字,表示字符串的长度,单位是字节,最大65535
实际占用磁盘空间按照实际保存的数据而定,数据转换出来的字节是多少就保存多少。
优点:由于磁盘空间占用取决于实际保存的数据,因此不造成磁盘空间浪费 缺点:由于数据长度不一致,读取效率低TEXT(rn):m是一个数字,单位是字符,m最大值为65535
日期类型
DATE
:用于保存年月日
TIME
:用于保存时分秒
DATETIME
:用于保存年月日时分秒
TIMESTAMP
(时间戳):保存UTC时间,记录自1970年元旦至表示的时间所经过的毫秒
例如:
CREATE TABLE userinfo(
id INT, # id整数类型
name VARCHAR(30), # name字符串类型,最多30字节
gender CHAR(1), # gender字符串类型,最多1个字符
birth DATETIME, # birth日期类型,保存年月日时分秒
salary DOUBLE(7,2) # salary浮点数类型,最多保存99999.99
)
插入一个日期类型的数据时,DATETIME
类型为例(可以保存年月日时分秒),可以使用字符串来表示,格式必须为 “yyyy-MM-dd hh:mm:ss”
(M表示月,m表示分)
INSERT INTO userinfo(id,name,gender,birth,salary)
VALUES(1,'张三','男','1998-08-03 10:22:35',5000.65)
DATETIME
类型可以忽略时分秒(但不可以忽略年月日)。时分秒默认为0。
INSERT INTO userinfo(id,name,gender,birth,salary)
VALUES(2,'李四','女','2002-03-15',10000)
DOUBLE
类型精度超出范围时会进行四舍五入,但是整数部分超出范围会报错
# 100000 > Double(7,2) 即 99999.99 共7位,其中2位小数
# 会报错
INSERT INTO userinfo(id,name,gender,birth,salary)
VALUES(3,'王五','男','1996-06-27',100000)
约束条件
给表添加约束条件限制对表的操作符合施加的约束条件,否则数据库拒绝该操作
主键约束(PRIMARY KEY)
- 主键非空且唯一
- 主键约束在一张标中只能为一个字段施加
- 主键约束会为表中第一个字段添加,并且通常该字段取名为"id"
- 主键不能插入重复值、不能插入NULL值
- 插入数据时不能忽略主键字段(会使用默认值NULL),如果键字段有对应默认值生成机制可以忽略
- 修改表记录时,不可将重复的值修改到主键字段,不可将NULL值修改到主键
- 永远不应当更新主键字段
- 自增:具有主键约束的字段通常由系统完成,而自增就是其中一种方式,当主键是自增时插入数据可忽略主键字段
非空约束(NOT NULL)
- 被非空约束施加的字段,该字段的值不能为NULL
- 不能向具有非空约束的字段中插入NULL,也不能修改NULL到具有非空约束的字段中
唯一性约束(UNIQUE)
- 具有唯一性约束的字段值不允许重复,但是可以为NULL
- 可以插入NULL值到唯一性约束字段中且可以多次
- 插入(修改)数据时,不可将重复的值插入(修改)到具有唯一性约束的字段中
检查约束(CHECK)
- 检查约束允许我们自定义约束条件,仅当满足指定的条件才可以进行操作
外键约束(FOREIGN KEY)
- 外键约束在实际开发中几乎不会用
DQL语言(Data QueryLanguage)-数据查询语言
DQL语言用来检索表中数据的语言,涉及到的关键字SELECT
SELECT
- 执行顺序:
子句 | 执行顺序 |
---|---|
FROM | 1 |
JOIN… ON… | 2 |
WHERE | 3 |
GROUP BY | 4 |
HAVING | 5 |
SELECT | 6 |
ORDER BY | 7 |
LIMIT | 8 |
- 基础查询:
- SELECT 子句用于指定查询表中的字段
- FROM子句用于指定数据来自那张表
SELECT 字段1,字段2,... FROM 表名
- 全部查询:
SELECT * FROM 表名
总结
DML语言-数据操作语言
准备工作
USE mydb; # 使用mydb库
CREATE TABLE person( # 创建表person
name VARCHAR(30),
age INT(3)
)
INSERT语句-向表中插入数据
# 向person表中插入记录
INSERT INTO person (name,age) VALUES ('张三',22);
INSERT INTO person (age,name) VALUES (33,'李四');
# 不可以,值的顺序与前面指定的字段不匹配
INSERT INTO person (name,age) VALUES (36,'王五');
#不可以,值的个数与前面指定的字段不匹配
INSERT INTO person (name,age) VALUES ('王五')
提醒:
- 在数据库中,字符串的字面量是使用单引号括起来的,需要注意
- 在
INSERT
语句中,指定的字段(name,age)与VALUES
后面指定的值的顺序,个数,类型要完全一致- 在
INSERT
语句中,字段(name,age)指定时的顺序和个数可以与表结构定义时不一致
补充
查询表中数据的语法
SELECT * FROM person
插入默认值
INSERT
语句中指定字段时,忽略的字段会被插入默认值。当表中字段没有被明确指定默认值时,默认值一律为NULL
例如:
# 此时该条记录插入后,age字段使用默认值NULL
INSERT INTO person (name) VALUES ('王五')
默认值的指定
注:指定默认值是属于DDL语句
使用DEFAULT关键字来为字段指定默认值,可以在创建表时,也可以在修改表时指定
# 在创建表时为字段指定默认值
CREATE TABLE person(
name VARCHAR(30) DEFAULT '无名氏',
age INT(3) DEFAULT 30
)
# 修改表时为字段指定默认值
ALTER TABLE person CHANGE name name VARCHAR(30) DEFAULT '无名氏'
# 可以使用DESC 表名 在查看表结构时看到字段的默认值
此时向person表中插入数据时,若不指定name字段,该字段默认值插入’无名氏’
INSERT INTO person (age) VALUES (55)
全列插入
在INSERT语句中不指定字段时,为全列插入,此时要求VALUES子句后面指定的值的个数,顺序,类型必须与表结构中字段完全一致
补充说明
子句
在SQL语句中一个关键字可以组成一个子句
INSERT INTO person(name,age) # INSERT子句
VALUES('张三',22) # VALUES子句
# 这两个子句整体构成了INSERT语句
INSERT INTO 表名 VALUES(值1,值2,...)
# 此时就要求VALUES子句中指定的值必须与表结构一致
INSERT INTO person VALUES('赵六',15)
# 使用DEFAULT关键字表达该字段插入默认值
INSERT INTO person VALUES(DEFAULT,15)
# 使用NULL关键字表达该字段插入NULL值
INSERT INTO person VALUES(NULL,78)
# 下面是错误示范:
# 不可以,与person表结构字段顺序不一致
INSERT INTO person VALUES(15,'赵六')
# 不可以,与person表结构字段顺序不一致
INSERT INTO person VALUES('赵六')
批量插入
INSERT INTO 表名(字段...) VALUES(第一组值...),(第二组值...),....
# 一次插入三条记录
INSERT INTO person(name,age) VALUES('阿猫',11),('阿狗',22),('阿三',33)
UPDATE语句-修改表数据
UPDATE 表名
SET 字段1=新值,字段2=新值,...
[WHERE 过滤条件]
# person表中每条记录的age字段都会被改为40
UPDATE person
SET age=40
注:当UPDATE
语句中不添加WHERE
子句时,会将表中所有记录进行修改,这种操作实际开发中很少见
WHERE
子句在UPDATE
中的作用
当UPDATE
语句添加了WHERE
子句时,只有满足WHERE
子句要求的记录才会被修改
# 修改张三的年龄为22
UPDATE person
SET age=22
WHERE name='张三'
# 将40岁的人改为36岁
UPDATE person
SET age=36
WHERE age=40
WHERE
子句基础条件
WHERE中基础条件:>,>=,<,<=,=,<>(首先"=“在数据库中表达等于,”<>“在数据库中表达不等于。”!="也可以表达不等于,但不是SQL92标准)
# 将年龄高于30岁的人改为29
UPDATE person
SET age=29
WHERE age>30
使用表达式修改
# 将每个人的年龄涨一岁
UPDATE person
SET age = age+1
修改多字段
# 将李四的名字改为'李老四',年龄改为66
UPDATE person
SET name = '李老四',age = 66
WHERE name = '李四'
DELETE语句-删除表中数据
语法
DELETE FROM 表名
[WHERE 过滤条件]
注:DELETE语句通常不会忽略WHERE子句,否则是清空表操作!
# 删除person表中'李老四'
DELETE FROM person
WHERE name='李老四'
# 删除年龄小于25岁的人
DELETE FROM person
WHERE age<25
# 清空表
DELETE FROM person
综合练习
题干
- 创建数据库day2db 字符集utf8并使用
- 创建t_hero表, 有name字段,字符集utf8
- 修改表名为hero
- 最后面添加价格字段money(整数类型,长度6), 最前面添加id字段(整数类型), name后面添加 age字段(整数类型,长度3)
- 表中添加以下数据: 1,李白,50,6888 2,赵云,30,13888 3,刘备,25,6888
- 修改刘备年龄为52岁
- 修改年龄小于等于50岁的价格为5000
- 删除价格为5000的信息
- 删除表, 删除数据库
代码
# 创建数据库day2db 字符集utf8并使用
CREATE DATABASE day2db CHARSET=UTF8
USE day2db
# 创建t_hero表, 有name字段,字符集utf8
CREATE TABLE t_hero(
name VARCHAR(30)
)
# 修改表名为hero
RENAME TABLE t_hero TO hero
# 最后面添加价格字段money(整数类型,长度6), 最前面添加id字段(整数类型), name后面添加 age字段(整数类型,长度3)
ALTER TABLE hero ADD money INT(6)
ALTER TABLE hero ADD id INT FIRST
ALTER TABLE hero ADD age INT(3) AFTER name
# 表中添加以下数据: 1,李白,50,6888 2,赵云,30,13888 3,刘备,25,6888
INSERT INTO hero(id,name,age,money)
VALUES (1,'李白',50,6888),(2,'赵云',30,13888),(3,'刘备',25,6888)
# 修改刘备年龄为52岁
UPDATE hero
SET age = 52
WHERE name='刘备'
# 修改年龄小于等于50岁的价格为5000
UPDATE hero
SET money = 5000
WHERE age <= 50
# 删除价格为5000的信息
DELETE FROM hero
WHERE money = 5000
# 删除表, 删除数据库
DROP TABLE hero
DROP DATABASE day2db
约束条件
主键约束PrimaryKey
- 建立表格 user1:
CREATE TABLE user1(
id INT PRIMARY KEY, 为id字段添加主键约束
name VARCHAR(30),
age INT(3)
)
INSERT INTO user1 (id,name,age) VALUES(1,'张三',22),(2,'李四',33)
- 主键不能插入重复的值
INSERT INTO user1(id,name,age) VALUES(1,'王五',36)
- 主键不能插入NULL值
INSERT INTO user1(id,name,age) VALUES(NULL,'王五',36)
- 插入数据时不能忽略主键字段(会使用默认值NULL),如果主键字段有对应默认值生成机制可以忽略
INSERT INTO user1(name,age) VALUES('王五',36)
- 修改表记录时,不可以将重复的值修改到主键字段
UPDATE user1
SET id=1
WHERE name='李四'
# 由于user1表中'张三'记录的id为1,因此不能将'李四'记录的id也改为1
- 修改表记录时也不可以将NULL值修改到主键字段
UPDATE user1
SET id=NULL
WHERE name='李四'
永远不应当更新主键字段!
自增
具有主键约束的字段通常主键的生成方式由系统完成,而自增就是其中一种方式
- 创建表时为主键字段添加自增
CREATE TABLE user2(
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(30),
age INT(3)
)
- 修改表时为主键字段添加自增
# 修改user1表时为id字段添加主键约束以及自增模式
ALTER TABLE user1 CHANGE id id INT PRIMARY KEY AUTO_INCREMENT
# 修改表时仅添加自增
ALTER TABLE user1 CHANGE id id INT AUTO_INCREMENT
- 当主键字段具有自增时,插入数据则可以忽略主键字段
INSERT INTO user2(name,age) VALUES('张三',33)
INSERT INTO user2(name,age) VALUES('李四',26)
- 当主键字段具有自增时,可以显示的向主键中插入NULL值,但此时主键字段仍然使用自增(不推荐这样写)
INSERT INTO user2(id,name,age) VALUES(NULL,'王五',45)
非空约束(NOT NULL)
被非空约束施加的字段,该字段的值不能为NULL
- 创建表时为字段添加非空约束
CREATE TABLE user3(
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(30) NOT NULL, # name字段施加非空约束
age INT(3)
)
- 修改表时为字段添加非空约束
# 为user2表的name字段添加非空约束
ALTER TABLE user2 CHANGE name name VARCHAR(30) NOT NULL
- 插入数据时,不能向具有非空约束的字段中插入NULL值
INSERT INTO user3(name,age) VALUES(NULL,22)
# 不可以将NULL值插入name字段
- 也不可以修改NULL值到具有非空约束的字段中
UPDATE user2
SET name=NULL # 不能将NULL值修改到具有非空约束的字段中
WHERE id=1
唯一性约束(UNIQUE)
具有唯一性约束的字段值不允许重复,但是可以为NULL。
- 创建表时为字段添加唯一性约束
CREATE TABLE user4(
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(30) UNIQUE,
age INT(3)
)
- 修改表时也可以为字段添加唯一性约束
# 注意:user3的name本身具有非空约束,但是如果此时添加唯一性约束时会取消非空约束
ALTER TABLE user3 CHANGE name name VARCHAR(30) UNIQUE
# 如果不希望取消非空约束则需要一并声明
ALTER TABLE user3 CHANGE name name VARCHAR(30) NOT NULL UNIQUE
- 插入数据,不可将重复的值插入具有唯一性约束的字段中
INSERT INTO user4(name,age) VALUES('张三',22) # 可以
INSERT INTO user4(name,age) VALUES('张三',45) # 不可以再次插入'张三'到name字段
- 可以插入NULL值到具有唯一性约束的字段中,且可以多次
INSERT INTO user4(name,age) VALUE(NULL,36) # 成功
INSERT INTO user4(name,age) VALUE(NULL,47) # 成功
- 修改记录,也不能将重复的值修改到具有唯一性约束的字段中
UPDATE user4
SET name='王五'
WHERE id=3
# 可以,因为'王五'在user4的name字段中不存在
UPDATE user4
SET name='张三'
WHERE id=3
# 不可以,因为'张三'在user4的name字段中已有
检查约束(CHECK)
- 创建表时添加CHECK约束
CREATE TABLE user5(
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(30),
age INT(3) CHECK(age>0 AND age<120) # 要求age字段的值>0且<120
)
- 插入数据时,age字段的取值必须符合CHECK约束
INSERT INTO user5(name,age) VALUES('张三',22) # 成功
INSERT INTO user5(name,age) VALUES('李四',160) # 失败
- 更新表数据时,也不能违反CHECK约束
UPDATE user5
SET age = 0
WHERE id = 1