说明:数据库在使用的时候,对于里面能够存的数据提出要求和限制
✅1.NOT NULL - 指示某列不能存储 NULL 值。
✅2.UNIQUE - 保证某列的每行必须有唯一的值。(没有重复的值)
✅3.DEFAULT - 规定没有给列赋值时的默认值。
✅4.PRIMARY KEY - NOT NULL 和 UNIQUE 的结合。确保某列(或两个列多个列的结合)有唯一标识,有助于更容易更快速地找到表中的一个特定的记录。
✅5.FOREIGN KEY - 保证一个表中的数据匹配另一个表中的值的参照完整性。(表的数据必须在另一个表中存在)
✅6.CHECK - 保证列中的值符合指定的条件。对于MySQL数据库,对CHECK子句进行分析,但是忽略CHECK子句。
说明:创建表示,可以指定某一列不为空
//用法 CREATE TABLE 表名 (列名 类型 NOT NULL,列名 类型);
说明:指定列是唯一的,不重复的
//用法 create table 表名(列名 类型 unique,列名 类型);
说明:指定插入数据时,该列为空,默认值unkown
//用法 create table 表名(列名 类名 default 'unkown',列名 类型);
说明:指定列名1为主键
//用法 create table 表名(列名1 类型 primary key,列名2 类型); //对于整型类型的主键,常搭配自增长auto_increment来使用。插入数据对应的字段不给定值时,使用最大值+1 // 主键是 NOT NULL 和 UNIQUE 的结合,可以不用 NOT NULL 列名 类型 PRIMARY KEY auto_increment;
说明:外键用于关联其它表的主键或唯一键
语法:
foreign key 表1的主键(被设为主键的列名) references 主表(列名);
例子:创建班级表classes,id为主键:
-- 创建班级表,有使用MySQL关键字作为字段时,需要使用``来标识 CREATE TABLE classes ( id INT PRIMARY KEY auto_increment, name VARCHAR(20), `desc` VARCHAR(100) ); //创建学生表student,一个学生对应一个班级,一个班级对应多个学生。使用id为主键, //classes_id为外键,关联班级表id CREATE TABLE student (id INT PRIMARY KEY auto_increment,classes_id int, FOREIGN KEY (classes_id) REFERENCES classes(id));
1.一对一:就是一对一的关系,一个学生对应一个学号,一个学号也对应一个学生
2.一对多:就是一对多的关系,一个学生只能对应一个班级,一个班级可以对应多个学生
3.多对多:就是多对多的关系,一个学生可以选择多门课程,一门课程也能对应多名学生。
插入结果查询
语法:
insert into 表名1(列名,列名....) select 列名1,列名2 from 表名2; //先执行查找表名2的列名1,列名2,针对查到的每一个结果都执行插入操作,把列名查找的结果插入到表名1中。
常见的聚合函数:
函数 | 说明 |
---|---|
COUNT([DISTINCT] expr) | 返回查询到的数据的 数量 |
SUM([DISTINCT] expr) | 返回查询到的数据的 总和,不是数字没有意义 |
AVG([DISTINCT] expr) | 返回查询到的数据的 平均值,不是数字没有意义 |
MAX([DISTINCT] expr) | 返回查询到的数据的 最大值,不是数字没有意义 |
MIN([DISTINCT] expr) | 返回查询到的数据的 最小值,不是数字没有意义 |
说明:exper可以是列名或者表达式;count函数查询的有多少行,如果有null不会计算进去,可以搭配where使用,先筛选在聚合,distinct是去重可写可不写,没有满足条件的就会返回null,sum函数只对数字进行操作。
示例:
count操作
SELECT COUNT(*) FROM 表名;//*表示全列查询 SELECT COUNT(列名或表达式) FROM 表名;
sum操作
select sum(列名或表达式) from 表名;
avg操作
select avg(列名或表达式) from 表名;
max操作
select max(列名或表达式) from 表名;
min操作
select min(列名或表达式) from 表名;
说明:SELECT 中使用 GROUP BY 子句可以对指定列进行分组查询。
需要满足:使用 GROUP BY 进行分组查询时,SELECT 指定的字段必须是“分组依据字段”,其他字段若想出现在SELECT 中则必须包含在聚合函数中。
语法:
select 列名1,sum(列名2,...) from 表名 group by 列名1,列名2;
GROUP BY 子句进行分组以后,需要对分组结果再进行条件过滤时,不能使用 WHERE 语句,而需要用HAVING。
如果我们使用where是可以的,不过是where的操作是在执行group by 分组操作之前执行。
语法:
select 列名1,sum(列名2,...) from 表名 group by 列名1 having 表达式;
多表查询就对多张表的数据进行笛卡尔积。
注意事项:
1.类似于排列组合,查询的列等于所有查询的表的列之和,查询的行等于所有查询的表的行之积。
2.这也是一个危险操作,数据量过大会导致事故。
3.关联查询可以对关联表使用别名。
4.如果查询表的列名有相同的列名,可以使用表名.列名来查询。
语法:
select * from 表名1,表名2......; select * from 表名1.列名,表名2.列名.....;//表名可以省略 select * from 表名1,表名2......where 表达式;
语法:
select 列名 from 表1 别名1 [inner] join 表2 别名2 on 连接条件 and 其它条件; select 列名 from 表1 别名1,表2 别名2 where 连接条件 and 其它条件; //连接条件是两个表的相同的字段,其它条件就是限制条件
说明:外连接分为左外连接和右外连接。如果联合查询,左侧的表完全显示我们就说是左外连接;右侧的表完全显示我们就说是右外连接。没有数据的用null来填补。
语法:
// 左外连接,表1完全显示 select 列名 from 表名1 left join 表名2 on 连接条件; //右外连接,表2完全显示 select 列名 from 表名1 right join 表名2 on 连接条件;
说明:就是自己连接自己(把行转成列)
语法:
select * from 表名1 as 别名1,表名1 as 别名2 where 连接条件 and 其它条件;
子查询就指嵌入在其它sql语句中的select语句,也叫嵌套查询
1.单行子查询:返回一行记录的子查询
语法:
select * from 表名 where 列名1=(select 列名2 from 表名 where 条件;
2.多行子查询:返回多行记录的子查询
2.1 [not] in关键字:
-- 使用IN select * from 表名1 where 列名1 in (select 列名2 from 表名2 where 条件); -- 使用 NOT IN select * from 表名1 where 列名1 not in (select 列名2 from 表名2 where 条件);
2.2 [not] exists关键字:
//使用 EXISTS select * from 表名1 where exists (select 列名2 from 表名2 where (条件) and 条件); //使用 NOT EXISTS select * from 表名1 where not exists (select 列名2 from 表名2 where (条件) and 条件);
说明:在from子句中使用子查询:子查询语句出现在from子句中。这里要用到数据查询的技巧,把一个子查询当作一个临时表使用。
说明:就是把多个查询语句放在一起
在实际应用中,为了合并多个select的执行结果,可以使用集合操作符 union,union all。使用UNION和UNION ALL时,前后查询的结果集中,字段需要一致。
1.union
该操作符用于取得两个结果集的并集。当使用该操作符时,会自动去掉结果集中的重复行。
select * from 表名1 where 条件表达式 union select * from 表名1 where 条件表达式; // 或者使用or来实现 select * from 表名1 where 条件表达式 or 条件表达式;
2.union all
该操作符用于取得两个结果集的并集。当使用该操作符时,不会去掉结果集中的重复行。
select * from 表名1 where 条件表达式 union all select * from 表名1 where 条件表达式;