数据库增删改查II

news2024/9/30 5:31:59

目录

1.约束

1.1null约束

1.2唯一约束

1.3默认值约束

1.4主键约束

1.5外键约束

2.新增

3.查询

3.1聚合查询

3.1.1.聚合函数

3.1.2group by子句

3.1.3 having

3.2联合查询

3.2.1内连接

3.2.2外连接

3.2.3 自连接

3.2.4子查询

3.2.5合并查询


1.约束

1.1null约束

语法

create table 表名( 列名 类型 not null);

指定某列不能存储null值--必填项

 create table student(id int not null,sn int,name varchar(20));

 

1.2唯一约束

语法

create table 表名( 列名 类型 unique);

先查询,看数据是否存在,如果存在,则插入/删除失败,如果不存在,则能插入/删除

create table student(id int not null,sn int unique,name varchar(20));

 sn用unique约束,sn的值则唯一,已经插入sn=1时,再次插入sn=1会插入失败

mysql> insert into student values(1,1,'wang');
Query OK, 1 row affected (0.00 sec)

mysql> insert into student values(2,1,'wan');
ERROR 1062 (23000): Duplicate entry '1' for key 'sn'

1.3默认值约束

语法

create table 表名( 列名 类型 default '默认值')

insert指定列插入,其他未被指定到的列就按默认值填充

 create table student(id int not null,sn int unique,name varchar(20) default'unkrown');

 name用默认值约束,当name列为空时,用默认值unkrown填充

insert into student(id,sn) values(2,2);

+----+------+---------+
| id | sn   | name    |
+----+------+---------+
|  1 |    1 | wang    |
|  2 |    2 | unkrown |
+----+------+---------+

1.4主键约束

语法

create table 表名( 列名 类型 primary key);

特点:

1.唯一,不为空, 一个表一个主键

2.可以是一个列,可以是多个列

3.主键是not null和unique的结合,可以不用not null

create table student(id int not null primary key,sn int unique,name varchar(20));

+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | NO   | PRI | NULL    |       |
| sn    | int(11)     | YES  | UNI | NULL    |       |
| name  | varchar(20) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+

自增主键:整数类型的主键,可以搭配auto_increment使用.当插入的数据对应字段没有值时,为最大值+1

列名 类型 primary key auto_increment;
mysql> insert into student values(1,1,'wang');

mysql> insert into student(sn,name) values(2,'li');

+----+------+------+
| id | sn   | name |
+----+------+------+
|  1 |    1 | wang |
|  2 |    2 | li        |
+----+------+------+

1.5外键约束

外键用于关联其他表的主键或者唯一键

语法

foreign key(字段名) references 主表(列);

创建班级表 

CREATE TABLE classes (id INT PRIMARY KEY auto_increment,name VARCHAR(20),`desc` VARCHAR(100));

学生表,学生班级是一对多的关系,id为主键,classes_id为外键,关联班级表id

create table student(id int primary key auto_increment,sn int unique,name varchar(20) default'unkrown',classes_id int,foreign key(classes_id) references classes(id));

student表中每一个记录的classid在classes表的id都存在

student收到classes的约束,把classes叫做student的父表,student是class的子表

 

2.新增

插入查询结果:查询结果,得到的列数,类型需要和插入表的列数,类型相同.(列名可以不同)

语法

insert into 表名A(...) select...from 表名B;

把表名b中的信息复制到表名a中

3.查询

3.1聚合查询

3.1.1.聚合函数

1.count:计数

字段名中为null的数据不会计入结果

select count(字段名) from 表名;

2.sum:求和

只对数字列有效,自动跳过结果为null的行

select sum(字段名) from 表名 (where ...);

3.avg:平均值

select avg(字段名+..) (as) 别名 from 表名;

4.max:最大值

select max(字段名) from 表名;

5.min:最小值

select min(字段名) from 表名;

3.1.2group by子句

对指定列先分组在查询

注:指定字段必须是分组依据字段,如果要有其他字段,必须要有聚合函数

select 字段名1, 聚合函数(字段名2),... from 表名 group by 字段名1,...;

3.1.3 having

group by 分组后,不能用where ,要用having代替where

select 字段名1, 聚合函数(字段名2),... from 表名 group by 字段名1,...having ...;

3.2联合查询

多表查询的步骤

1.分析清除需求中,涉及的信息在哪些表中

2.针对多个表进行笛卡尔积

3.筛选出其中有效数据(此处用学生id做关联条件)

4.结合需求中的条件,进行加强条件

5.针对列进行

3.2.1内连接

语法

1.join对两张表

select 字段 from 表1 (别名1) join 表2 (别名2) on 连接条件1;

select * from student join score on stsudent.id=score.student_id ;

2.join对多张表

select 字段 from 表1 (别名1) join 表2 (别名2) on 连接条件1 join 表3 (别名3) 
 on 连接条件2)...;

select * from student join score on stsudent.id=score.student_id join course on course.id=score.course_id;

3.2.2外连接

外连接分为左外连接和右外连接。如果联合查询,左侧的表完全显示我们就说是左外连接;右侧的表完全显示我们就说是右外连接。

语法

1.join对两张表

左外连接:select 字段 from 表1 (别名1) left  join 表2 (别名2) on 连接条件1;

右外连接:select 字段 from 表1 (别名1)  right join 表2 (别名2) on 连接条件1;

左连接:select * from student left join score on stsudent.id=score.student_id ;
右连接:select * from student right join score on stsudent.id=score.student_id ;

2.join对多张表

左外连接:select 字段 from 表1 (别名1) left join 表2 (别名2) on 连接条件1 join 表3 (别名3)  on 连接条件2)...;

右外连接:select 字段 from 表1 (别名1) right  join 表2 (别名2) on 连接条件1 join 表3 (别名3)  on 连接条件2)...;

左外连接:select * from student left join score on stsudent.id=score.student_id left join course on course.id=score.course_id;
右外连接:select * from student right join score on stsudent.id=score.student_id right join course on course.id=score.course_id;

注:内外连接的区别

1.内连接-->两个表中都体现的数据

select name,score from student join score on student.id=score.student_id;
+------+-------+
| name | score |
+------+-------+
| 张三 |    90 |
| 李四 |    80 |
+------+-------+

2.左外连接,以左侧表为准,左侧表中的所有数据都能体现出来

select name,score from student left join score on student.id=score.student_id;
+------+-------+
| name | score |
+------+-------+
| 张三 |    90 |
| 李四 |    80 |
| 王五 |  NULL |
+------+-------+

3.右外连接,以右侧表为准,右侧表中的所有数据都能体现出来

select name,score from student right join score on student.id=score.student_id;
+------+-------+
| name | score |
+------+-------+
| 张三 |    90 |
| 李四 |    80 |
| NULL |    70 |
+------+-------+

3.2.3 自连接

自连接是指在同一张表连接自身进行查询。(本质把行转换成列)-->实现行中的比较

自连接要指定表的别名

select * from 表名 as 别名1,表名 as 别名2(where...);

3.2.4子查询

子查询是指嵌入在其他sql语句中的select语句,也叫嵌套查询

  • 单行子查询:返回一行记录的子查询

select 字段名1 from 表名1 where 字段名2 =(select 字段名3 from 表名2 where... )

字段名2和字段名3对应

字段名1,字段名2属于表名1

字段名3属于表名2

1.(not)in关键字

select 字段名1 from 表名1 where 字段名2 (not)in(select 字段名3 from 表名2 where... )

字段名2和字段名3对应

字段名1,字段名2属于表名1

字段名3属于表名2

2.(not) exists关键字

select 字段名1 from 表名1 where (not) exists(select 字段名3 from 表名2 where... )

字段名2和字段名3对应

字段名1属于表名1

字段名3属于表名2

  • 在from子句中使用子查询:子查询语句出现在from子句中。这里要用到数据查询的技巧,把一个子查询当做一个临时表使用。

3.2.5合并查询

为了合并多个select的执行结果,可以使用集合操作符 union,union all.

使用UNION和UNION ALL时,前后查询的结果集中,字段需要一致。

1.union

该操作符用于取得两个结果集的并集。当使用该操作符时,会自动去掉结果集中的重复行。

select * from 表名1 where... union select * from 表名2 where...;

可以用or实现

select * from 表名1 where... or select * from 表名2 where...;

2.union all

该操作符用于取得两个结果集的并集。当使用该操作符时,不会去掉结果集中的重复行。

select * from 表名1 where... union all select * from 表名2 where...;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/381090.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

两个适配器网络冲突,限制访问特定网址

两个适配器网络冲突,限制访问特定网址说明命令说明说明 因为工作需要,有线网络访问局域网服务器,限制特别策略访问,如禁止远程。此时如果想要远程,在连接手机热点就可以,但由于两个网络的存在优先级。就出…

五分钟学会接口自动化测试框架

今天,我们来聊聊接口自动化测试是什么?如何开始?接口自动化测试框架怎么做? 自动化测试 自动化测试,这几年行业内的热词,也是测试人员进阶的必备技能,更是软件测试未来发展的趋势。 特别是在…

怎么从零搭建vue项目(使用webpack手动搭建)

目录一、前提条件二、手动搭建vue项目的步骤:1. 创建项目2. 生成package.json文件3. 引入webpack和创建webpack.config.js文件4. 创建index.html,main.js文件5. 使用webpack命令编译6. 引入vue2,修改index.html,main.js文件7. 引入…

物理机不能访问虚拟机kali的web服务解决方案记录

目录 环境 问题描述 解决方案 知识补充 效果测试 其他思路 环境 kali(nat模式),物理机,可互ping 问题描述 kali的web服务器不能在物理机上访问。 1.本机能ping通虚拟机 2.虚拟机也能ping通本机 3.虚拟机能访问自己的web …

Python基础知识——列表

列表 列表是可以存放任何数据,包括整型,浮点型,字符串,布尔型等等,是常用的数据类型之一。 1.列表的创建 列表也是一个可迭代对象 1. 普通形式l [1,2,3,4,5] ---整型列表l ["a","b","c&…

一篇搞懂tcp,http,socket,socket连接池之间的关系

前言 作为一名开发人员我们经常会听到HTTP协议、TCP/IP协议、UDP协议、Socket、Socket长连接、Socket连接池等字眼,然而它们之间的关系、区别及原理并不是所有人都能理解清楚,这篇文章就从网络协议基础开始到Socket连接池,一步一步解释他们之…

激光雷达上车「热」背后的焦虑

激光雷达的上车节奏正在加速。 高工智能汽车研究院监测数据显示,从2022年9月至今,中国市场乘用车月度前装标配搭载激光雷达一直保持在1.5万台以上,其中,去年12月更是单月冲破3万台大关。 本周,Luminar宣布扩大与梅赛德…

实现小说自由,国产浏览器出手了,吊打各类阅读软件

喜欢看小说的朋友都知道,有时候看小说看到一定的章节就要收费了,那我们怎么实现小说阅读自由,免费看完整部小说呢?下面给大家分享可以免费看小说的良心浏览器,吊打各类阅读软件,真的是巨好用。无论是古代穿…

【读论文】THFuse

【读论文】THFuse介绍网络架构多分支CNN特征提取块基于VIT的全局特征提取快图像重建块损失函数总结参考论文: https://www.sciencedirect.com/science/article/abs/pii/S0925231223000437如有侵权请联系博主介绍 一篇基于CNN和VIT的关于红外可视图像融合的论文&…

【wpf】ItemsControl 的Binding 小技巧

ItemsControl 非常常用和好用的控件,我经常将之用于配置界面! 比如这么一个配置界面: 整体是一个ItemsControl,每个子界面就是其中的一个Item。 ItemsControl 的 ItemsSource 绑定到 ParameterInfo 的集合 public ObservableCo…

最简单的微信多开防撤回方式

微信,大家工作中生活中用的最多的一款应用;很多公司喜欢用微信来作为工作沟通的工具,官方原版只支持登陆一个微信,这对于需要在电脑上登陆多个微信账号的朋友来说肯定是极其的不方便。另外有的时候别人撤回了一些重要消息&#xf…

目前医疗器械数据库有哪些?最推荐哪些?

在英特网发达的今天,医疗器械信息查询应该是一件便捷的事情,但不知道大家有没有遇到过这种类似情况,就是在查询医疗器械信息时,如果通过百度去检索,查到的结果往往会不尽人意,比如信息陈旧、太分散、来源不…

Spring security 个人理解

改文章写的很好:https://zhuanlan.zhihu.com/p/342755411 Spring security 分为两个部分 登陆认证权限认证 登陆认证 其实就是就是登陆注册,然后获取登陆凭证的问题 操作如下 登陆账号密码,通过账号查询出用户数据,然后密码进…

如何使用DeadFinder寻找失效链接

关于DeadFinder DeadFinder是一款功能强大的链接分析工具,该工具可以帮助广大研究人员快速地寻找目标页面中的无效链接(死链)。所谓死链,即一个页面中存在的无法被连接的一条链接。这些链接如果一直保留在页面中的话,…

Hive中的高阶函数(二)

1、UDTF之explode函数 explode(array)将array列表里的每个元素生成一行; explode(map)将map里的每一对元素作为一行,其中key为一列,value为一列; 一般情况下,explode函数可以直接使用即可,也可以根据需要结…

[python入门(53)] - python中的OS模块(包) - 2

目录 ❤ OS模块和path模块(函数) ❤ os模块中操作目录以及文件的函数 ❤ os模块中遍历目录数 ❤ 一些表现形式参数 ❤ 获取在进程的控制终端上登录的用户的名称: os.getlogin() (即此时pc登录的用户名) ❤ 总结 ❤ os.listdir()…

3月4日线下讲座《项目经理五项管理锦囊》

在项目管理过程中,你是否有过因为人际关系紧张,而导致团队协作不顺畅? 项目团队内耗严重,成员之间缺乏信任冲突较多,影响士气项目质量及项目周期等问题? 为什么会导致这样的结果?如何避免踩坑&a…

TAS5411QPWPRQ1引脚图LP873220RHDRQ1汽车应用开关稳压器

8W单声道汽车类D类音频放大器:TAS5411QPWPRQ1引脚图 【概述】TAS5411-Q1是一款单声道D类音频放大器,非常适用于汽车类紧急呼叫(eCall)、远程信息处理、仪表板应用。该器件采用14.4VDC汽车电池供电,可在负载为4Ω且THDN不超过10%的情况下提供高…

MQTT的学习之Mosquitto集群搭建

文章钢要: 1、进行双服务器搭建 2、进行多服务器搭建 一、Mosquitto的分布式集群部署 如果需要做并发量很大的时候就需要考虑做集群处理,但是我在查找资料的时候发现并不多,所以整理了一下,搭建简单的Mosquitto集群模式。 首…

Win11搜索栏无法使用怎么办?

随着Windows 11的正式发布,许多用户已经升级了他们的操作系统。但是安装Win11系统之后,人们发现它有一些问题。例如,Win11搜索栏无法使用,这极大地影响了用户体验。那我们该如何解决Windows搜索栏用不了这一问题?方法1…