数据库基本数据类型
INT 整型
BIGINT
DOUBLE
CHAR
VARCHAR
时间类型
DATETIME可以保存年月日时分秒
- 可以以字符串形式插入,该字符串格式’yyyy-MM-dd hh:mm:ss’。
- DATETIME类型插入数据时,可以忽略时分秒,忽略后默认值为0
- DATATIME累哦行插入数据时,不可以忽略年月日
参考代码
#判断数据库是否存在
DROP DATABASE IF EXISTS mydb;
# 创建数据库
CREATE DATABASE mydb;
#使用数据库
USE mydb;
#创建表
CREATE TABLE person(
name VARCHAR(24),
age INT
);
#查看表结构
-- DESC person;
#插入数据
INSERT INTO person VALUES
('张三',19),
('李四',20),
('王五',21),
('赵六',22),
('钱七',23),
('孙八',24);
#将person表中的年龄全部换为40
-- UPDATE person SET age = 40;
# 将person表中的张三的年龄换为40
UPDATE person SET age = 10 WHERE name = '张三';
#修改'李四'的名字为'李老四',年龄为66
UPDATE person SET name = '李老四',age = 66 WHERE name = '李四';
#查看person表
SELECT * FROM person;
#为person表创建自增主键,并将其放在第一位
ALTER TABLE person ADD id INT PRIMARY KEY AUTO_INCREMENT FIRST;
#删除主键列
ALTER TABLE person DROP id;
#添加别的字段
ALTER TABLE person ADD gender INT DEFAULT 1;
#删除字段
ALTER TABLE person DROP gender;
#删除年龄大于60的数据
DELETE FROM person WHERE age > 60 AND name = '李三';
CREATE TABLE person1(
id INT,
age INT UNSIGNED
);
# INT插入数据为小数时,会自动截取小数点前面的数字
# 插入数据为负数时,会报错
INSERT INTO person1 VALUES
(1,2.3),
(2,3.4);
INSERT INTO person1 VALUES
(3,12);
SELECT * FROM person1;
CREATE TABLE person2(
age INT(3), # 最大值999
# 宽度7,2小数,即3位数带两小数
salary DOUBLE(7,2) #最大值99999.99 超范围报错
);
# 整数超过范围会报错
INSERT INTO person2(salary) VALUE(99999.99);
# 当精度超过范围的时候会发生四舍五入进位
INSERT INTO person2(salary) VALUE(1234.567);
# 但是如果四舍五入后超过了范围也是会报错的
INSERT INTO person2(salary) VALUE(99999.997);
SELECT * FROM person2;
CREATE TABLE userinfo(
id INT,
name VARCHAR(30),
gender CHAR(1),
birthday DATETIME,
salary DOUBLE(7,2)
);
/*
DATETIME可以保存年月日时分秒
可以以字符串形式插入,该字符串格式'yyyy-MM-dd hh:mm:ss'。
DATETIME类型插入数据时,可以忽略时分秒,忽略后默认值为0
DATETIME类型插入数据时,不可以忽略年月日
*/
INSERT INTO userinfo VALUES
(1,'张三','男','2000-01-01 12:12:12',10000.23),
(2,'李四','女','2011-02-02 12:12:12',20000.42),
(3,'王五','男','2012-03-03 12:12',30000.65),
(4,'赵六','女','2023-04-04',40000.78);
SELECT * FROM userinfo WHERE salary > 30000;
数据库约束分类
1、主键约束
注意:
- 主键字段不可以插入重复的值
- 主键字段不可以插入NULL值,但是如果使用了自增,那就可以使用NULL
- 插入记录时不可以忽略主键字段,除非关键字有默认的生成方式(比如自增)
- 更新数据时,不可以将重复的值更新到主键字段上
- 不可以将NULL值更新到主键字段上
自增(AUTO_INCREMENT)
- 主键字段的值不会更新,通常插入如数据时应有系统生成
- 最常见的方式就是使用自增:AUTO_INCREMENT
- 用于自动生成唯一的递增数值的特性,它通常用于定义表的主键列,以确认在每次插入新行时,都会自动为该列生成一个唯一的递增值。
自增注意
- id列被定义为主键,并且使用 AUTO_INCREMENT 关键字。在每次插入新行时MariaDB会自动为id列分配一个唯一的递增值。
- 修改表时,也可以为字段添加自增
- 主键具有自增后,那么插入数据可以忽略主键字段
- 插入时可以显示插入的NULL,此时还是会使用自增,并非将NULL值插入
2、非空约束
注意:
- 向具有非空约束字段插入数据时,不可以将NULL值插入
- 插入数据时也不可以忽略具有非空约束的字段
- 不能将NULL值更新到具有非空约束的字段上
3、唯一性约束
注意:
- 修改表时可以为字段添加唯一性约束
- 如果该字段具有非空约束,若仅指定唯一性约束时,会将非空约束取,如果需要保留非空约束,需要一并指定。
- 插入数据时不能将重复的值插入到具有唯一性约束的字段上
- NULL值可以插入到具有唯一性的约束的字段上,并且多条记录都可以是NULL
- 更新数据也不能将重复的值更新到具有唯一性约束的字段上,NULL除外
4、检查约束
注意:
插入数据时,值不能违背CHECK约束要求
更新数据时也不能违背CHECK约束要求
5、外键约束(开发中不常用)
注意:
后续介绍
代码示例
# 主键约束 PRIMARY KEY
# 自增 AUTO_INCREMENT
CREATE TABLE userinfo1(
id INT PRIMARY KEY,
name VARCHAR(30),
gender CHAR(1),
birthday DATETIME,
salary DOUBLE(7,2)
);
INSERT INTO userinfo1 VALUES
(1,'张三','男','2000-01-01 12:12:12',10000.23),
(2,'李四','女','2011-02-02 12:12:12',20000.42),
(3,'王五','男','2012-03-03 12:12',30000.65),
(4,'赵六','女','2023-04-04',40000.78);
#当主键字段没有指明默认的方式生成时,不可以忽略主键字段
INSERT INTO userinfo1(name,gender,birthday,salary)
VALUES( '张三','男','2000-01-01 12:12:12',10000.23);
#更新也是不可以的,id不可以更新重复的值
UPDATE userinfo1 SET id = 2 WHERE name = '张三';
# 自增练习
# 虽然可以使用NULL,但是不建议,因为如果你在多个表中插入数据使用NULL,那么如果第一个表的最后一条数据的id是5,
# 那么第二个表插入数据会继承上面的id排序,这个表的第一条数据的id是6,而不是从1开始,所以不建议使用NULL
CREATE TABLE userinfo2(
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(30),
gender CHAR(1),
birthday DATETIME,
salary DOUBLE(7,2)
);
INSERT INTO userinfo2 VALUES
(NULL,'张三','男','2000-01-01 12:12:12',10000.23),
(NULL,'李四','女','2011-02-02 12:12:12',20000.42),
(NULL,'王五','男','2012-03-03 12:12',30000.65),
(NULL,'赵六','女','2023-04-04',40000.78);
SELECT * FROM userinfo2;
ALTER TABLE userinfo1 CHANGE id id INT AUTO_INCREMENT;
# 非空约束 NOT NULL
CREATE TABLE userinfo3(
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(30) NOT NULL,
gender CHAR(1) NOT NULL
);
INSERT INTO userinfo3 VALUES
(NULL,'张三','男'),
(NULL,'李四','女'),
(NULL,'王五','男');
-- (NULL,'赵六',NULL); -- 报错,非空字段不能为空
SELECT * FROM userinfo3;
# 唯一约束 UNIQUE
CREATE TABLE userinfo4(
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(30) NOT NULL,
gender CHAR(1) NOT NULL,
email VARCHAR(30) UNIQUE
);
INSERT INTO userinfo4(name, gender, email) VALUES
('张三','男','zhangsan@163.com'),
('李四','女','lisi@163.com'),
('王五','男','wangwu@163.com');
-- (NULL,'赵六','女','wangwu@163.com'); -- 报错,不满足唯一性
# drop table userinfo4;
# 虽然唯一,但是NULL除外
INSERT INTO userinfo4(name, gender, email) VALUES
('JOBS','男',NULL),
('STEVE','男',NULL);
# 修改表时,为字段之前有非空约束,那么若仅指定唯一约束时,会自动取消非空约束
ALTER TABLE userinfo4 CHANGE email email VARCHAR(30) UNIQUE;
# 此时要将两个约束一起使用
ALTER TABLE userinfo4 CHANGE email email VARCHAR(30) UNIQUE NOT NULL;
SELECT * FROM userinfo4;
#检查约束 CHECK
CREATE TABLE userinfo5(
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(30) NOT NULL,
gender CHAR(1) NOT NULL,
email VARCHAR(30) UNIQUE,
salary DOUBLE(7,2) CHECK(salary > 0) -- 薪水不能小于0
);
INSERT INTO userinfo5(name, gender, email, salary) VALUES
('张三','男','zhangsan@163.com',10000.23),
('李四','女','lisi@163.com',20000.42),
('王五','男','wangwu@163.com',30000.65);
-- ('赵六','女','zhaoliu@163.com',-10000.78); -- 报错,检查后不满足约定条件
# drop table userinfo5;
SELECT * FROM userinfo5;