目录
数据库约束
NOT NULL - 指示某列不能存储 NULL 值
mysql> create table student(
-> id int not null,
-> name varchar(10),
-> age int,
-> id_card varchar(20)
-> );
Query OK, 0 rows affected (0.05 sec)
UNIQUE - 保证某列的每行必须有唯一的值
create table student(
-> id int not null,
-> name varchar(10),
-> age int,
-> id_card varchar(20) unique
-> );
Query OK, 0 rows affected (0.02 sec)
DEFAULT - 规定没有给列赋值时的默认值
create table student(
id int not null,
name varchar(10) default 'unknown',
age int,
id_card varchar(20) unique
);
PRIMARY KEY:主键约束
create table student(
id int not null primary key,
name varchar(10) default 'unknown',
age int,
id_card varchar(20) unique
);
对于整数类型的主键,常配搭自增长auto increment来使用。插入数据对应字段不给值时,使用最大值+1,主键是unique 和not null 的结合,可以省略not null。
create table student(
id int primary key auto_increment,
name varchar(10) default 'unknown',
age int,
id_card varchar(20) unique
);
FOREIGN KEY:外键约束
mysql> create table class(
-> id int primary key auto_increment,
-> name varchar(20)
-> );
Query OK, 0 rows affected (0.03 sec)
mysql> create table student(
-> id int primary key auto_increment,
-> name varchar(10),
-> id_card varchar(20) unique,
-> class_id int,
-> foreign key (class_id) references class(id)
-> );
Query OK, 0 rows affected (0.04 sec)
表的设计
一对一(人--身份证号)、一对多(班级--学生)、多对多(课程表--学生);
表的增删查改(进阶)
新增:
-- 创建用户表
DROP TABLE IF EXISTS test_user;
CREATE TABLE test_user (
id INT primary key auto_increment,
name VARCHAR(20) comment '姓名',
age INT comment '年龄',
email VARCHAR(20) comment '邮箱',
sex varchar(1) comment '性别',
mobile varchar(20) comment '手机号'
);
-- 将学生表中的所有数据复制到用户表
insert into test_user(name, email) select name, qq_mail from student;
查询:
聚合查询:
聚合函数:
函数 | 说明 |
count(字段) | 查询到的数量 |
sum(字段) | 数据的总和,不是数字没意义 |
min(字段) | 数据的最小值,不是数字没意义 |
max(字段) | 数据的最大值,不是数字没意义 |
avg(字段) | 数据的平均值,不是数字没意义 |
例:
-- 统计平均总分
SELECT AVG(chinese + math + english) 平均总分 FROM exam_result;
group by 子句:
例:
注意:分组查询操作查询字段 必须是分组字段,如果分组会造成聚合,非分组字段必须写在聚合函数中;
having 分组后的条件过滤:
例:查询重复数据
联合查询 :
笛卡尔积:
两张表的笛卡尔积:就是两张表的每条数据相连接,产生的一个结果集;结果集的行数=第一张表行数*第二张表行数。有时候我们取笛卡尔积的时候,部分数据没有意义,我们就需要进行过滤。
但是要注意,多表联合查询操作,使用字段的时候,必须使用 表名.字段名 ,否则就会报错。
如果使用了别名,字段必须使用 别名.字段名
内连接:
例:多张表的联合查询
外连接:
外连接分为左外连接和右外连接。如果联合查询,左侧的表完全显示我们就说是左外连接;右侧的表完全显示我们就说是右外连接。
注意:只能使用 join on 的写法。
内连接必须满足连接条件+其他条件才会返回;外连接,满足连接条件+其他条件,或满足其他条件,但外表存在也可以返回。
自连接:
表自己连接自己,是同一张表,不同行,同一个字段,进行比较;