【MySQL】表的约束、基本查询、内置函数

目录

  • 1. 表的约束
    • 1.1 空属性
    • 1.2 默认值
    • 1.3 列描述
    • 1.4 zerofill
    • 1.5 主键
    • 1.6 自增长
    • 1.7 唯一键
    • 1.8 外键
  • 2. 基本查询
    • 2.1 表的增删改查
      • 2.1.1 插入数据
      • 2.1.2 插入否则更新
      • 2.1.3 替换插入
    • 2.2 Retrieve
      • 2.2.1 select ----- 查询
      • 2.2.2 where ----- 筛选
      • 2.2.3 order by ----- 结果排序
      • 2.2.4 limit ----- 筛选分页结果
    • 2.3 Update
    • 2.4 Delete
    • 2.5 插入查询结果
    • 2.6 聚合函数
    • 2.7 group by子句的使用
  • 3. 内置函数
    • 3.1 日期函数
    • 3.2 字符串函数
    • 3.3 数学函数

1. 表的约束

1.1 空属性

  • 两个值:null(默认的)和not null(不为空)
  • 建表时,若未指明是否可以为空,则默认可以为空

1.2 默认值

  • 默认值的设置
mysql> create table tt10 (
-> name varchar(20) not null,
-> age tinyint unsigned default 0,
-> sex char(2) default '男'
-> );
Query OK, 0 rows affected (0.00 sec)
  • 如果设置了default,用户将来插入,有具体的数据,就用用户的,没有就用默认的

  • 关于defaultnot null

  • 设置了not null,有一种情况下,不插入具体数据,也符合语法:那就是设置了default默认值
  • 可看出:defaultnot null不冲突,而是互相补充的
  • 当用户没有设置default值没有设置了not null时,MySQL会自动优化,添加 default null

1.3 列描述

列描述只是注释而已。
实例:

mysql> create table tt12 (
-> name varchar(20) not null comment '姓名',
-> age tinyint unsigned default 0 comment '年龄',
-> sex char(2) default '男' comment '性别'
-> );

1.4 zerofill

zerofill不会改变数据大小,只会使数据格式化显示。

  • 变量只有添加了zerofill,才能格式化显示(若数据位数不够,在前面补0;位数够了,则不用管)
  • int(n):指若格式化显示,则显示n位数
  • int 默认为int(11)
  • int unsigned默认为int(10) unsigned
mysql> show create table tt3\G
***************** 1. row *****************
Table: tt3
Create Table: CREATE TABLE `tt3` (
`a` int(11) DEFAULT NULL,
`b` int(10) unsigned DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=gbk
1 row in set (0.00 sec)

1.5 主键

主键:primary key是用来约束该字段里面的数据,使其不能重复,不能为空,一张表中最多只能有一个主键;主键所在的列通常是整数类型

  • 添加完primary key后,其字段会自动设置为not null
  • 创建表的时候直接在字段上指定主键
mysql> create table tt13 (
-> id int unsigned primary key comment '学号不能为空',
-> name varchar(20) not null);
Query OK, 0 rows affected (0.00 sec)
  • 删除主键
alter table 表名 drop primary key;
  • 当表创建好以后但是没有主键的时候,可以再次追加主键
    注意:若要添加主键的那一列的数据重复或空,则添加主键会失败;要修改数据后,再添加主键
alter table 表名 add primary key(字段列表); 字段列表:例如id,name
  • 只有一个主键,当一个主键想约束多个字段时,则使用复合主键
mysql> create table tt14(
-> id int unsigned,
-> course char(10) comment '课程代码',
-> score tinyint unsigned default 60 comment '成绩',
-> primary key(id, course) -- id和course为复合主键
-> );

实例理解:若插入[ 1223(id),数学(course) ],则可以插入[ 1224,数学 ]、[ 1223,语文 ],但是不可以插入[ 1223,数学 ],若id, course都对应相同,则不可以插入。

1.6 自增长

auto_increment:当对应的字段,不给值,会自动的被系统触发,系统会从当前字段中已经有的最大值+1操作,得到一个新的不同的值。通常和主键搭配使用,作为逻辑主键。(如果没有插入,则第一个插入的主键字段是系统默认的auto_increment值,为1

  • 自增长的特点:
  • 任何一个字段要做自增长,前提是本身是一个索引(key一栏有值)
  • 自增长字段必须是整数
  • 一张表最多只能有一个自增长
mysql> create table tt21(
-> id int unsigned primary key auto_increment,
-> name varchar(10) not null default ''
-> );
mysql> insert into tt21(name) values('a');
mysql> insert into tt21(name) values('b');
mysql> select * from tt21;
+----+------+
| id | name |
+----+------+
|  1 |   a  |
|  2 |   b  |
+----+------+

在插入后获取上次插入的 AUTO_INCREMENT 的值:

mysql > select last_insert_id();
+------------------+
| last_insert_id() |
+------------------+
|        2         |
+------------------+

1.7 唯一键

  • 唯一键:数据可以为空,也可多个为空,但是数据不可以重复。
  • 唯一键的本质和主键差不多,唯一键允许为空,而且可以多个为空,空字段不做唯一性比较。
  • 唯一键和主键是互相补充的关系。
  • unique也可以和not null 结合一起用,相当于主键作用
mysql> create table student (
-> id char(10) unique comment '学号,不能重复,但可以为空',    //unique
-> name varchar(10)
-> );

1.8 外键

外键用于定义主表和从表之间的关系:外键约束主要定义在从表上,主表则必须是有主键约束或unique约束。当定义外键后,要求外键列数据必须在主表的主键列存在或为null。

语法:

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

案例:
在这里插入图片描述

对上面的示意图进行设计:

  • 先创建主键表(班级表)
create table myclass (id int primary key,name varchar(30) not null comment'班级名'
);
  • 再创建从表(学生表)
create table stu (id int primary key,name varchar(30) not null comment '学生名',class_id int,foreign key (class_id) references myclass(id)
);

2. 基本查询

2.1 表的增删改查

2.1.1 插入数据

单行插入:
insert into students values (101, 10001, '孙悟空', '11111');
多行插入:用逗号
insert into students values (101, 10001, '孙悟空', '11111'), (102, 20001, '曹孟德','22222');

2.1.2 插入否则更新

插入否则更新:插入如果不成功,则更改,如果成功,则只插入
详细是指由于 主键 或者 唯一键 对应的值已经存在而导致插入失败,则将使其失败的那一行进行更改。整改的结果on duplicate key update在后面。

insert into students (sn, name) values (20001, '曹阿瞒') on duplicate key update  sn = 10010, name = '唐大师';

可能会出现的结果:

-- 0 row affected: 表中有冲突数据,但冲突数据的值和 update 的值相等
-- 1 row affected: 表中没有冲突数据,数据被插入
-- 2 row affected: 表中有冲突数据,并且数据已经被更新

2.1.3 替换插入

主键 或者 唯一键 没有冲突,则直接插入;
主键 或者 唯一键 如果冲突,则删除使其插入失败的那一行后再插入。
指由于 主键 或者 唯一键 对应的值已经存在而导致插入失败。

replace into students (sn, name) VALUES (20001, '曹阿瞒');

结果:

-- 1 row affected: 表中没有冲突数据,数据被插入
-- 2 row affected: 表中有冲突数据,删除后重新插入

2.2 Retrieve

在这里插入图片描述

2.2.1 select ----- 查询

  • 通常情况下不建议使用 * 进行全列查询
    1. 查询的列越多,意味着需要传输的数据量越大;
    1. 可能会影响到索引的使用。
全列查询:
select * from exam_result;指定列查询:
select id, name, english from exam_result;查询字段为表达式:
select id, name, 10 from exam_result;
SELECT id, name, chinese + math + english  from exam_result; 为查询结果指定别名:
select id 编号, name 名字, chinese + math + english 总分 from exam_result;  //把chinese + math + english取为别名总分,把id取别名为编号,把name取别名为名字查询结果去重:
select  distinct math from  exam_result;   //把math相同的数据出掉

2.2.2 where ----- 筛选

比较运算符:
在这里插入图片描述
逻辑运算符:
在这里插入图片描述
实例:

筛选数学成绩为58599899的学生(这只是其中一种方法):
select name, math from exam_result where math in (58, 59, 98, 99); 筛选姓孙的人:
select name from exam_result where name like '孙%';
select name from exam_result where name like '孙_';筛选不姓孙的人:
select name from exam_result where name not like '孙%';

添加知识点:如果NULL通过>, >=,<,<=和别的数,进行比较时,结果永远是:NULL;只有通过<=>,<>才能得到正确结果,正确为1,错为0。

2.2.3 order by ----- 结果排序

asc 为升序(从小到大)
decs 为降序(从大到小)
默认为 asc

同学及数学成绩,按数学成绩升序显示:
select name, math from exam_result order by math;
select name, math from exam_result order by math decs;  //降序多字段排序,排序优先级随书写顺序:
select name, math, english, chinese from exam_result order by math decs, english, chinese;   //数学降序,英语升序,语文升序order by 子句中可以使用列别名:
select name, chinese + english + math 总分 from exam_result order by 总分 decs;

关于别名:
mysql按下面的顺序进行识别:
在这里插入图片描述
所以,order by 和 limit 子句中可以使用列别名,而只有where后是不可以使用别名的,因为where识别不了

2.2.4 limit ----- 筛选分页结果

起始下标为 00 开始,筛选 n 条结果:
select ... from table_name [where ...] [order by ...] limit n;从 s 开始,筛选 n 条结果:
select ... from table_name [where ...] [order by ...] limit s, n
select ... from table_name [where ...] [order by ...] limit n offset s;

建议:对未知表进行查询时,最好加一条 LIMIT 1,避免因为表中数据过大,查询全表数据导致数据库卡死

2.3 Update

实例:

把张三语文改成60分,数学80:
update exam_result set math = 80 chinese = 60 where name = '张三';  把全表同学语文成绩改为2:
update exam_result set chinese = chinese * 2;  

2.4 Delete

delete from table_name [where ...] [order by ...] [limit ...]、删除张三的成绩:
delete * from exam_result where name = '张三';删除所有人的成绩:
delete from exam_result;截断表:
truncate exam_result;

注意:
delete删除所有人的成绩 和 用truncate截断表 的异同:
相同点:进行操作后整个表一行数据都没有
不同点:truncate是对表进行处理,而delete是对进行删除数据操作
      truncate后会重置 AUTO_INCREMENT 项,而delete不会

2.5 插入查询结果

指:将查询的结果插入表中

insert into table_name [(column [, column ...])] select ...将table1查询的全部结果都插入table2中:
insert into table2 select distinct* from table1;

知识点:

创建一个和table结构一样的表table2(只是结构一样,数据不同):
creat table table2 like table1;

2.6 聚合函数

在这里插入图片描述
实例:

统计班级共有多少同学:
select count(*) from students;
select count(1) from students;统计本次考试的数学成绩分数个数:
select count(math) from students;
select count(distinct math) from students;   统计的是去重数学成绩数量统计数学成绩总分,不及格 < 60 的总分,没有结果,返回 NULL:
select sum(math) from exam_result where math < 60;

小知识点:

将在/home/xl/中的scott data.sql文件拷贝到存放mysql文件的目录下-----导入:
mysql > source /home/xl/scott data.sql;

2.7 group by子句的使用

在select中使用group by 子句可以对指定列进行分组查询:

select column1, column2, .. from table group by column;

实例:

显示每个部门的平均工资和最高工资: 
select deptno,avg(sal),max(sal) from EMP group by deptno;显示每个部门的每种岗位的平均工资和最低工资:
select avg(sal),min(sal),job, deptno from EMP group by deptno, job;显示平均工资低于2000的部门和它的平均工资:
select avg(sal) 平均 from EMP group by deptno having myavg<2000;
having经常和group by搭配使用,作用是对分组进行筛选,作用有些像where。

wherehaving 的区别:条件筛选的阶段是不同的。
where:对具体的任意列进行条件筛选
having:对分组聚合之后的结果进行条件筛选

显示平均工资低于2000的部门和它的平均工资(SMITH员工不参与统计):
select avg(sal) 平均 from EMP where ename != 'SMITH' group by deptno having myavg<2000;

在这里插入图片描述

3. 内置函数

3.1 日期函数

在这里插入图片描述

3.2 字符串函数

在这里插入图片描述

3.3 数学函数

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++11——基础新增特性

目录 C11介绍统一的列表初始化对内置类型initializer_list 声明autodecltypenullptr 范围for容器新增接口emplace容器的新方法 C的前身是“C with Classes”&#xff0c; 最早于 1979年由 祖师爷Bjarne Stroustrup&#xff08;本贾尼斯特劳斯特鲁普&#xff09; 在贝尔实验室…

#HarmonyOS:页面和自定义组件生命周期

页面生命周期 即被Entry装饰的组件生命周期 onPageShow&#xff1a;页面每次显示时触发一次&#xff0c;包括路由过程、应用进入前台等场景。onPageHide: 页面每次隐藏时触发一次&#xff0c;包括路由过程、应用进入后台等场景。onBackPress: 当用户点击返回按钮是触发 组件…

成都睿明智科技有限公司解锁抖音电商新蓝海

在这个短视频风靡的时代&#xff0c;抖音已不仅仅是一个娱乐平台&#xff0c;它更是商家们竞相追逐的电商新战场。成都睿明智科技有限公司&#xff0c;作为抖音电商服务领域的佼佼者&#xff0c;正以敏锐的洞察力和专业的服务&#xff0c;助力众多品牌在这片蓝海中乘风破浪&…

RHCE-多IP访问网站

关闭防火墙 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0下载nginx工具 [rootlocalhost ~]# yum install nginx Updating Subscription Management repositories. Unable to read consumer identityThis system is not registered with an …

面对AI算力需求激增,如何守护数据中心机房安全?

随着人工智能&#xff08;AI&#xff09;技术飞速发展&#xff0c;AI算力需求呈现爆发式增长&#xff0c;导致对数据设备电力的需求指数级攀升。这给数据中心带来前所未有的挑战和机遇&#xff0c;从提供稳定的电力供应、优化高密度的部署&#xff0c;到数据安全的隐私保护&…

【unity小技巧】Unity6 LTS版本安装和一些修改和新功能使用介绍

文章目录 前言安装新功能变化1、官方推荐使用inputsystem进行输入控制2、修复了InputSystem命名错误导致listen被遮挡的bug3、自带去除unity启动画面logo功能4、unity官方的behavior行为树插件5、linearVelocity代替过时的velocity方法待续 完结 前言 2024/10/17其实unity就已…

前端拦截302重定向

背景: 根据业务场景需要拦截302做后续的逻辑处理 尝试一: : axios拦截 、、、、、async created() {// 获取302请求返回的location后手动修改video的src路径let targetSrc;try {await axios.get(this.video).then((res) > {const { headers, status } res;const { locat…

Spring Cloud 解决了哪些问题?

大家好&#xff0c;我是锋哥。今天分享关于【Spring Cloud 解决了哪些问题&#xff1f;】面试题&#xff1f;希望对大家有帮助&#xff1b; Spring Cloud 解决了哪些问题&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Spring Cloud 是一个为构建分布式…

如何删除Maven

1.找到Maven安装路径 方法一&#xff1a; 可以直接在文件资源管理器里面选中“此电脑”然后右上角搜“apache-maven”&#xff0c;这个过程可能长达几分钟甚至更久 方法二&#xff1a; 这里推荐一个名叫“Everything”的软件&#xff0c;能够快速的查找到需要的文件 2.找到本…

每日一道算法题(Leetcode 20)

Whats past is prologue. 凡是过去&#xff0c;皆为序章。 题目 分析 1. 我们可以用栈的结构来解决这道题。 2. 我们使用while循环&#xff0c;每次读取字符串中一个元素进行操作&#xff0c;直到最后读取到 \0为止。 3. 如果遇见 (, [ ,{ 这三种左括号&#xff0c;则把该左…

【AIGC】AI如何匹配RAG知识库:关键词搜索

关键词搜索 引言jieba库简介TF-IDF简介实践例子用jieba库提取关键词计算TF-IDF计算文档和查询相似度结果完整代码&#xff1a; 总结 引言 RAG作为减少模型幻觉和让模型分析、回答私域相关知识最简单高效的方式&#xff0c;我们除了使用之外可以尝试了解其是如何实现的。在实现…

写一个自动采集地球前30行业的小程序

创建一个自动采集地球前30行业信息的小程序可以使用Python和一些常用的库&#xff0c;如BeautifulSoup和Requests。以下是一个基本示例&#xff0c;展示如何从网页上抓取行业信息&#xff1a; 环境准备 安装Python&#xff1a;确保你的计算机上已安装Python。安装库&#xff…

电影评论网站开发:Spring Boot技术指南

3系统分析 3.1可行性分析 通过对本电影评论网站实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本电影评论网站采用SSM框架&#xff0c;JAVA作为开发语言&#…

从传统到智能,从被动监控到主动预警,解锁视频安防平台EasyCVR视频监控智能化升级的关键密钥

视频监控技术从传统监控到智能化升级的过程是一个技术革新和应用场景拓展的过程。智能视频监控系统通过集成AI和机器学习算法&#xff0c;能够实现行为分析、人脸识别和异常事件检测等功能&#xff0c;提升了监控的准确性和响应速度。这些系统不仅用于传统的安全防护&#xff0…

【linux009】文件操作命令篇 - touch 命令

文章目录 touch 命令1、基本用法2、常见选项3、举例4、注意事项 touch 命令 touch 是 Linux 系统中的一个常用命令&#xff0c;用于创建空文件或更新已有文件的时间戳。它既可以用来快速生成新文件&#xff0c;也可以用来修改文件的访问时间&#xff08;access time, atime&am…

react18中如何监听localstorage的变化获取最新的本地缓存

有时候业务中会需要监听缓存的变化&#xff0c;实时更新页面的内容获取发送接口请求。这就要我们来监听对localstorage的修改&#xff0c;实时响应变化&#xff01;&#xff01;一下方法同样实用于vue项目。 同一个项目中不同页面的实现 实现效果 代码分析 修改localstoare的…

【算法】KMP算法

写在前面 在学习KMP算法前&#xff0c;不才也曾在众多博客中阅读过KMP算法的文章&#xff0c;但是都看得迷迷糊糊&#xff0c;所以不才在学透了KMP算法后&#xff0c;详细编写了这篇笔记&#xff0c;希望对你有帮助&#x1f970;&#x1f970;。 KMP算法的核心思想不分任何语…

二叉树习题其二Java【力扣】【算法学习day.9】

前言 前言 书接上篇文章二叉树习题其一&#xff0c;这篇文章我们将基础拓展 ###我做这类文档一个重要的目的还是给正在学习的大家提供方向&#xff08;例如想要掌握基础用法&#xff0c;该刷哪些题&#xff1f;&#xff09;我的解析也不会做的非常详细&#xff0c;只会提供思…

云计算第四阶段-----CLOUND二周目 04-06

cloud 04 今日目标&#xff1a; 一、Pod 生命周期 图解&#xff1a; [rootmaster ~]# vim web1.yaml --- kind: Pod apiVersion: v1 metadata:name: web1 spec:initContainers: # 定义初始化任务- name: task1 # 如果初始化任务失败&#…

目前最新 dnSpy V6.5.1版本,最好的 .NET 程序调试、编辑、反编译软件

目前最新 dnSpy V6.5.1版本&#xff0c;最好的 .NET 程序调试、编辑、反编译软件 一、 简介二、新发布程序更新功能三、官方下载&#xff1a; 一、 简介 dnSpy 是一个调试器 .NET 程序集的编辑器。即使没有源代码&#xff0c;也可以使用它来编辑和调试程序集。主要特点&#x…