ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

MySQL表的增删改查(进阶)

2022-03-19 15:59:45  阅读:167  来源: 互联网

标签:进阶 4.2 列名 MySQL 改查 查询 表名 where select


文章目录

1.数据库的约束

说明:数据库在使用的时候,对于里面能够存的数据提出要求和限制

1.1约束类型

✅1.NOT NULL - 指示某列不能存储 NULL 值。
✅2.UNIQUE - 保证某列的每行必须有唯一的值。(没有重复的值)
✅3.DEFAULT - 规定没有给列赋值时的默认值。
✅4.PRIMARY KEY - NOT NULL 和 UNIQUE 的结合。确保某列(或两个列多个列的结合)有唯一标识,有助于更容易更快速地找到表中的一个特定的记录。
✅5.FOREIGN KEY - 保证一个表中的数据匹配另一个表中的值的参照完整性。(表的数据必须在另一个表中存在)
✅6.CHECK - 保证列中的值符合指定的条件。对于MySQL数据库,对CHECK子句进行分析,但是忽略CHECK子句。

1.2null约束

说明:创建表示,可以指定某一列不为空

//用法
CREATE TABLE 表名 (列名 类型 NOT NULL,列名 类型);

1.3unique:唯一约束

说明:指定列是唯一的,不重复的

//用法
create table 表名(列名 类型 unique,列名 类型);

1.4default:默认值约束

说明:指定插入数据时,该列为空,默认值unkown

//用法
create table 表名(列名 类名 default 'unkown',列名 类型);

1.5primary key:主键约束

说明:指定列名1为主键

//用法
create table 表名(列名1 类型 primary key,列名2 类型);
//对于整型类型的主键,常搭配自增长auto_increment来使用。插入数据对应的字段不给定值时,使用最大值+1
// 主键是 NOT NULL 和 UNIQUE 的结合,可以不用 NOT NULL
列名 类型 PRIMARY KEY auto_increment;

1.6foreign key:外键约束

说明:外键用于关联其它表的主键或唯一键
语法:

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));

2.表的设计

2.1三大范式

1.一对一:就是一对一的关系,一个学生对应一个学号,一个学号也对应一个学生
2.一对多:就是一对多的关系,一个学生只能对应一个班级,一个班级可以对应多个学生
3.多对多:就是多对多的关系,一个学生可以选择多门课程,一门课程也能对应多名学生。

3.新增

插入结果查询
语法:

insert into 表名1(列名,列名....) select 列名1,列名2 from 表名2;
//先执行查找表名2的列名1,列名2,针对查到的每一个结果都执行插入操作,把列名查找的结果插入到表名1中。

4.查询

4.1聚合查询

4.1.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 表名;

4.1.2 group by子句

说明:SELECT 中使用 GROUP BY 子句可以对指定列进行分组查询。
需要满足:使用 GROUP BY 进行分组查询时,SELECT 指定的字段必须是“分组依据字段”,其他字段若想出现在SELECT 中则必须包含在聚合函数中。
语法:

select 列名1,sum(列名2,...) from 表名 group by 列名1,列名2;

4.1.3 having

GROUP BY 子句进行分组以后,需要对分组结果再进行条件过滤时,不能使用 WHERE 语句,而需要用HAVING。
如果我们使用where是可以的,不过是where的操作是在执行group by 分组操作之前执行。
语法:

select 列名1,sum(列名2,...) from 表名 group by 列名1 having 表达式;

4.2联合查询(面试重点)

多表查询就对多张表的数据进行笛卡尔积。
注意事项:
1.类似于排列组合,查询的列等于所有查询的表的列之和,查询的行等于所有查询的表的行之积。
2.这也是一个危险操作,数据量过大会导致事故。
3.关联查询可以对关联表使用别名。
4.如果查询表的列名有相同的列名,可以使用表名.列名来查询。

语法:

select * from 表名1,表名2......;
select * from 表名1.列名,表名2.列名.....;//表名可以省略
select * from 表名1,表名2......where 表达式;

4.2.1内连接

语法:

select 列名 from 表1 别名1 [inner] join 表2 别名2 on 连接条件 and 其它条件;
select 列名 from 表1 别名1,表2 别名2 where 连接条件 and 其它条件;
//连接条件是两个表的相同的字段,其它条件就是限制条件

4.2.2外连接

说明:外连接分为左外连接和右外连接。如果联合查询,左侧的表完全显示我们就说是左外连接;右侧的表完全显示我们就说是右外连接。没有数据的用null来填补。
语法:

// 左外连接,表1完全显示
select 列名  from 表名1 left join 表名2 on 连接条件;
//右外连接,表2完全显示
select 列名 from 表名1 right join 表名2 on 连接条件;

4.2.3自连接

说明:就是自己连接自己(把行转成列)
语法:

select * from 表名1 as 别名1,表名1 as 别名2 where 连接条件 and 其它条件;

4.2.4子查询

子查询就指嵌入在其它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子句中。这里要用到数据查询的技巧,把一个子查询当作一个临时表使用。

4.2.5合并查询

说明:就是把多个查询语句放在一起
在实际应用中,为了合并多个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 条件表达式;

标签:进阶,4.2,列名,MySQL,改查,查询,表名,where,select
来源: https://blog.csdn.net/weixin_58030464/article/details/123591558

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有