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字节。如果实际保存的数据不足则会补充若干个空格来填充长度
优点:在磁盘中保存每条记录的长度是固定的,因此读取速度快
缺点:在磁盘中占用空间固定,无论实际保存数据多少,都要占够空间,因此对磁盘空间有浪费

  • 变长字符串:VARCHARTEXT

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

  • 执行顺序:
子句执行顺序
FROM1
JOIN… ON…2
WHERE3
GROUP BY4
HAVING5
SELECT6
ORDER BY7
LIMIT8
  • 基础查询:
  • 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

综合练习

题干

  1. 创建数据库day2db 字符集utf8并使用
  2. 创建t_hero表, 有name字段,字符集utf8
  3. 修改表名为hero
  4. 最后面添加价格字段money(整数类型,长度6), 最前面添加id字段(整数类型), name后面添加 age字段(整数类型,长度3)
  5. 表中添加以下数据: 1,李白,50,6888 2,赵云,30,13888 3,刘备,25,6888
  6. 修改刘备年龄为52岁
  7. 修改年龄小于等于50岁的价格为5000
  8. 删除价格为5000的信息
  9. 删除表, 删除数据库

代码

# 创建数据库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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值