【数据库入门】关系型数据库入门及SQL语句的编写

1.数据库的类型:

数据库分为网状数据库,层次数据库,关系型数据库和非关系型数据库四种。
目前市场上比较主流的是:关系型数据库非关系型数据库
关系型数据库使用结构化查询语句(SQL)对关系型数据库进行操作。

2.关系型数据库

数据以二维表的形式进行存储,表和表之间可以建立关联关系(1VS1, 1VSN , NVSN ,通过主外键关系建立的:添加,修改,删除,都是有约束的)

3.mysql

mysql是一种开放源码的,轻量级的关系型数据库。
优点:体积小,成本低,速度快,开放源码等优点。

4.一款操作关系型数据库的语言---SQL(结构化查询语言)

SQL的组成
SQL=DQL+DML+TCL+DCL+DDL

5.DDL(数据的定义语言)+DML(数据的操纵语言)

5.1创建一张表(了解)

create table t_student(
        sno int(6) primary key auto_increment,    
        sname varchar(5) not null, 
        sex char(1) default '男' check(sex='男' || sex='女'),
        age int(3) check(age>=18 and age<=50),
        enterdate date,
        classname varchar(10),
        email varchar(15) unique
);

5.2约束:限制字段的

【以保证数据库中数据的准确性和一致性,这种机制就是完整性约束】

  • 主键约束:非空+唯一
  • 非空约束:
  • 唯一约束:
  • 检查约束:
  • 默认值约束:
  • 自增约束:
  • 外键约束:

根据约束的位置,可以分为表级约束和行级约束
行级约束:直接写在字段名的后面
表级约束:脱离建表语句:写在建表语句的最下方

6.DML(数据的操作语言

6.1添加语句

给表里的所有字段赋值,表名后面可以不写字段名

insert into t_student values(null,"张三",default,50,'2023-12-12','定制14班','asd@qq.com');
insert into t_student 
values(null,"李四",'女',22,now(),'dz14b','aaa@qq.com');

now()表示的是当前时间,可以用SYSDATE()来代替,这个是系统时间,代表电脑上的当前时间

建表后,添加外键约束
加一个班级表

create table t_class(
        cno int(4) primary key auto_increment,
        cname varchar(10) not null,
        room char(4)
)

在学生表里加一个cno
在这里插入图片描述

然后增加一个外键约束

alter table t_student add constraint fk_student_cno foreign key(cno) references t_class(cno);
delete from t_class where cno=3;

执行上面的句子是不行的,因为班级内还有学生

在这里插入图片描述

但是一般我们并不会在数据库增添各种约束,一般压力不会给到数据库,而是会把这些操作给到前端或其他部分

6.2删除语句:

delete from 表名 where 主键=值;

6.3修改语句

update 表 set 列名1=新值,列名2=新值,列名3=值 where 主键=值

删除数据操作 :清空数据

delete from t_student;
truncate table t_student;

#delete #truncate #drop

面试题重点:delete、truncate和drop的区别:

drop全部删除掉:表结构+约束+数据 都删掉

delete 只删除数据(一行一行删除数据)--效率低
truncate 删除数据(删除整张表,重新创建表)--效率高

delete属于DML语句;truncate属于DDL语句
delete 继续延续下标;truncate下标从1重新开始
delete 属于DML语句 可以拥有事务,可以回滚
truncate 属于DDL语句 自动提交事务,没办法回滚

7.DQL数据的查询语言:

查询语句的结构:
select 字段名,字段名,字段名,字段名(如果是表里所有的字段,可以换成*)
from 表名1,表名2,表名3,
where 字段=值 and/or &&|| 字段=值
group by 字段名
having 分组后 数据的筛选条件
order by 字段名,字段名

介绍select部分:

  • a.给字段设置别名
select empno,ename,job,deptno depno from emp;

给deptno起个别名depno,这样如果类的创建的时候名字没有与数据库的对应,可以通过这种方式避免使用反射时修改类里的属性和方法

select concat(empno,'_',ename) '员工基本信息',hiredate '入职时间' from emp;

在这里插入图片描述

  • b.简单的运算:
    --显示所有员工的年薪:
select ename,sal*12+ifnull(comm,0) 年薪 from emp;

由于有的员工的奖金comm为null,无法进行算术运算,导致总年薪无法得到,因此使用ifnull函数,如果为空,赋值为0

--去重:

select distinct deptno from emp;

--显示经理的编号

select distinct mgr from emp order by mgr desc;  //按经理编号倒序排

介绍where部分

等值查询:
--例子:查询部门编号为30,同时mgr编号为7361或者7788的员工信息

select * from emp where deptno=30 and (mgr=7361 or mgr=7781)

其余写法:

select * from emp where deptno=30 and mgr in (7361,7788)

范围查询:
如果是范围查询则用以下两种方法:

select * from emp where deptno=30 and mgr>=7361 and mgr<=7788
select * from emp where deptno=30 and mgr between 7361 and 7788

查询员工姓名,工资和工资等级

select ename,sal,grade,LOSAL,HISAL 
from emp inner join salgrade
on emp.sal>=salgrade.LOSAL and emp.sal<=salgrade.HISAL;

模糊查询:like+% _ --->替换=
%代表0位或者多位
_代表1位

例子:查询员工名字里,或者部门名字里带“发”的所有员工信息

select * from emp inner join dept on emp.deptno=dept.deptno where dname like '%发%' or ename like '%发%';

例子:查询没有奖金的员工信息

select * from emp where comm=0 or comm is null;

空不能用等值,只能用is

不为空的

select * from emp where comm is not null;

介绍from部分:
后面跟表名 别名

介绍sql里的函数:
单行函数:n条数据,得到n个结果
多行函数:多条数据 ,只得到一个结果
count():求总个数
sum():求总和
avg():求平均
max():求最大值
min():求最小值
---求员工的总个数,使用列的别名:工资总和,最大工资,最小工资,平均工资

select count(empno) 员工总个数,sum(sal) 工资总和,max(sal) 最大工资,min(sal) 最小工资,avg(sal) 平均工资 from emp;

---查询1981年最晚入职的员工

select max(hiredate)
from emp
where hiredate between '1981-01-01' and '1981-12-31';

也可以用这种方法:

select * 
from emp 
where hiredate between '1981-01-01' and '1981-12-31' order by hiredate desc 
limit 1;

查询入职时间3个月后的时间

select DATE_ADD(hiredate,INTERVAL 3 MONTH) from emp;

介绍group by分组查询

---显示每个部门最晚的入职时间

select max(hiredate) from emp group by deptno;

---查询每个部门的最晚入职时间,只显示2023以前的(最晚入职时间不可晚于2023-1-1)

select max(hiredate)
from emp
group by deptno
having max(hiredate)<'2023-01-01';

显示各部门的平均工资,按照平均工资倒序排列

select deptno,avg(sal)
from emp
group by deptno
order by avg(sal) desc;

刨除低于2000的员工,统计各部门的平均工资

select deptno,avg(sal)
from emp
where sal>=2000
group by deptno;

刨除低于2000的员工,统计各部门的平均工资,只显示高于3200的平均工资,对显示的数据做正序排列

select deptno,avg(sal)
from emp
where sal>=2000
group by deptno
having avg(sal)>3200;
order by svg(sal)

如果select出现了多行函数,那么剩余的字段必须要出现在group by子句里

介绍多表查询

a.普通多表查询

select e.*,d.dname
from emp e,dept d
where e.deptno=d.deptno and dname='SALES'

b.内连接多表查询

内连接的两张表,没有主次之分,数据根据关联字段进行判断显示
【等上的才显示,没等上的都不显示】

select e.*,d.dname
from emp e
inner join dept d on e.deptno=d.deptno
where dname='sales'

在这里插入图片描述

inner join …on

c.外连接多表查询

外连接的两张表,有主次之分,主表里的数据,一定会都显示出来,而次表的数据,只显示值相当的
【等上显示,没等不显示】
外连接分为左外连接和右外连接
在查询语句里,出现的第一个表为左表,第二个表为右表
如果使用左外连接进行查询,左表就是主表,那么左表里的数据就会全部显示出来
右表只显示值相等的数据

select e.*,d.dname
from emp e
left join dept d on e.deptno=d.deptno
where dname='sales'
select e.*,d.dname
from emp e
right join dept d on e.deptno=d.deptno

在这里插入图片描述

d.关联表中,关联列的名相同:

select e.*,d.dname
from emp e
inner join dept d using (deptno)    --on e.deptno=d.deptno
where dname='sales'

e.关联表中,关联列的名相同,类型相同

select e.*,d.dname
from emp e
natural join dept d   --inner join dept on e.deptno=d.deptno
where dname='sales'  --自然连接

这个是自然连接

扩展:模糊查询

select* from emp where ename like '%M%' and hiredate>='1981-1-03' and hiredate<='1981-12-31'

结果:
在这里插入图片描述

子查询:

例子:查询所有员工中,最低工资是多少,同时显示是哪位员工

select ename,min(sal) from emp 

查询跟上题那个人是同一个部门的所有员工信息
--不相关子查询

select *
from emp
where deptno=
	(select deptno
	from emp 
	where ename='SMITH123'
)

在这里插入图片描述

查询和最低工资的人在同一个部门的所有员工信息

select *
from emp
where deptno=(
	select deptno
	from emp
	where sal=(
		select min(sal)
		from emp	
	)
)

查询和张发处于同一个工资等级的所有员工的信息

select *
from emp
inner join salgrade s on emp.sal>=s.losal and emp.sal<=s.hisal
where s.grade=(
	select grade
	from salgrade
	inner join emp on emp.sal>=salgrade.losal and emp.sal<=salgrade.hisal
	where ename='张发'
)

查询跟SCOTT同一年入职所有员工信息

select *
from emp
where YEAR(hiredate)=(select year(hiredate) from emp where ename='scott')

year(hiredate)表示的是hiredate的年的信息

数据库对象:事务,视图,索引

视图:~表
学习视图的原因?

保证查看者在权限范围内,查看对应的字段。
可以帮忙简化复杂的查询语句

创建一个视图:

create view v_empnoAndSal
	as
	select empno,sal
	from emp;

创建视图连接3个表:

create view v_info
            as
            select e.*,d.dname,d.loc,s.*
            from emp e inner join dept d on e.deptno=d.deptno
                    inner join salgrade s on e.sal>=s.LOSAL and e.sal<=s.HISAL

事务:

  • 使用场合:事务应用在 业务层,在业务层做功能的整合
    京东下单---控制层调用业务层的付款方法---17个各个dao层里的方法。

  • 作用:让多个DML语句作为一个整体,这些DML语句要么同时成功,要么同时失败

  • 事务的特征:【重要!要背!】ACID
    一致性、隔离性、持久性、原子性

  • 事务的并发问题:
    (1)读了别人事务中没提交的数据叫脏读(Dirty read)【不可接受】
    (2)读到了别人事务提交后的数据(修改操作)
    不可重复读【可以接受】
    (3)读到了别的事务提交后的数据(添加/删除操作),幻读【可以接受】==>针对以上三种事务的并发问题,mysql

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

day07(单片机高级)继电器模块绘制

目录 继电器模块绘制 原理图 布局 添加板框 布线 按tab修改线宽度 布线换层 泪滴 铺铜 铺铜的作用 铺铜的使用规范 添加丝印 步骤总结 继电器模块绘制 到淘宝找一个继电器模块 继电器模块的使用&#xff08;超详细&#xff09;_继电器模块工作原理-CSDN博客文章浏览阅读4.8w次&…

1+X应急响应(网络)病毒与木马的处置:

病毒与木马的处置&#xff1a; 病毒与木马的简介&#xff1a; 病毒和木马的排查与恢复&#xff1a;

【电路笔记 TMS320F28335DSP】时钟+看门狗+相关寄存器(功能模块使能、时钟频率配置、看门狗配置)

时钟源和主时钟&#xff08;SYSCLKOUT&#xff09; 外部晶振&#xff1a;通常使用外部晶振&#xff08;如 20 MHz&#xff09;作为主要时钟源。内部振荡器&#xff1a;还可以选择内部振荡器&#xff08;INTOSC1 和 INTOSC2&#xff09;&#xff0c;适合无需高精度外部时钟的应…

CCE-基础

背景&#xff1a; 虚拟化产生解决物理机资源浪费问题&#xff0c;云计算出现实现虚拟化资源调度和管理&#xff0c;容器出现继续压榨虚拟化技术产生的资源浪费&#xff0c;用命名空间隔离&#xff08;namespace&#xff09; 灰度升级&#xff08;升级中不影响业务&#xff09…

基于LLama_factory的Qwen2.5大模型的微调笔记

Qwen2.5大模型微调记录 LLama-facrotyQwen2.5 模型下载。huggingface 下载方式Modelscope 下载方式 数据集准备模型微调模型训练模型验证及推理模型导出 部署推理vllm 推理Sglang 推理 LLama-facroty 根据git上步骤安装即可&#xff0c;要求的软硬件都装上。 llama-factory运行…

提取图片高频信息

提取图片高频信息 示例-输入&#xff1a; 示例-输出&#xff1a; 代码实现&#xff1a; import cv2 import numpy as npdef edge_calc(image):src cv2.GaussianBlur(image, (3, 3), 0)ddepth cv2.CV_16Sgray cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)grad_x cv2.Scharr(g…

移动充储机器人“小奥”的多场景应用(上)

一、高速公路服务区应用 在高速公路服务区&#xff0c;新能源汽车的充电需求得到“小奥”机器人的及时响应。该机器人配备有储能电池和自动驾驶技术&#xff0c;能够迅速定位至指定充电点&#xff0c;为待充电的新能源汽车提供服务。得益于“小奥”的机动性&#xff0c;其服务…

怎么只提取视频中的声音?从视频中提取纯音频技巧

在数字媒体的广泛应用中&#xff0c;提取视频中的声音已成为一项常见且重要的操作。无论是为了学习、娱乐、创作还是法律用途&#xff0c;提取声音都能为我们带来诸多便利。怎么只提取视频中的声音&#xff1f;本文将详细介绍提取声音的原因、工具、方法以及注意事项。 一、为什…

Windows环境GeoServer打包Docker极速入门

目录 1.前言2.安装Docker3.准备Dockerfile4.拉取linux环境5.打包镜像6.数据挂载6.测试数据挂载7.总结 1.前言 在 Windows 环境下将 GeoServer 打包为 Docker&#xff0c;可以实现跨平台一致性、简化环境配置、快速部署与恢复&#xff0c;同时便于扩展集成和版本管理&#xff0c…

《Vue零基础入门教程》第四课: 应用实例

往期内容 《Vue零基础入门教程》第一课&#xff1a;Vue简介 《Vue零基础入门教程》第二课&#xff1a;搭建开发环境 《Vue零基础入门教程》第三课&#xff1a;起步案例 参考官方文档 https://cn.vuejs.org/api/application#create-app 示例 const {createApp} Vue// 通…

NUXT3学习日记四(路由中间件、导航守卫)

前言 在 Nuxt 3 中&#xff0c;中间件&#xff08;Middleware&#xff09;是用于在页面渲染之前或导航发生之前执行的函数。它们允许你在路由切换时执行逻辑&#xff0c;像是身份验证、重定向、权限控制、数据预加载等任务。中间件可以被全局使用&#xff0c;也可以只在特定页…

使用docker快速部署Nginx、Redis、MySQL、Tomcat以及制作镜像

文章目录 应用快速部署NginxRedisMySQLTomcat 制作镜像镜像原理基于已有容器创建使用 Dockerfile 创建镜像指令说明构建应用创建 Dockerfile 文件创建镜像 应用快速部署 Nginx docker run -d -p 80:80 nginx使用浏览器访问虚拟机地址 Redis docker pull redis docker run --…

02微服务系统与设计(D1_走出微服务误区:避免从单体到分布式单体)

目录 学习前言 一、回顾&#xff1a;从单体到微服务到 Function 二、分布式单体 分布式单体起因之一&#xff1a;通过共享库和网络客户端访问分布式能力 分布式单体起因之二&#xff1a;简单用远程调用替代进程内方法调用 分布式单体起因小结 三、引入非侵入式方案&#…

WEB攻防-通用漏洞文件上传js验证mimeuser.ini语言特性

知识点&#xff1a; 1、文件上传-前端验证 2、文件上传-黑白名单 3、文件上传-user.ini妙用 4、文件上传-php语言特性 详细点&#xff1a; 1、检测层面&#xff1a;前端&#xff0c;后端等 2、检测内容&#xff1a;文件头&#xff0c;完整型&#xff0c;二次渲染等 3、检…

鸿蒙学习高效开发与测试-集成开发环境(4)

文章目录 1、工程管理2、代码编辑3、界面预览4、编译构建5、代码调试6、性能调优7、设备模拟8、命令行工具9、端云一体化开发 HUAWEI DevEco Studio 是面向鸿蒙生态的集成开发环境&#xff0c;提供了一站式的鸿蒙生态应用、元服务开发能力&#xff0c;详细能力如图所示。 1、工…

基于yolov8、yolov5的茶叶等级检测识别系统(含UI界面、训练好的模型、Python代码、数据集)

摘要&#xff1a;茶叶等级检测在茶叶生产、质量控制和市场销售中起着至关重要的作用&#xff0c;不仅能帮助相关部门实时监测茶叶质量&#xff0c;还为智能化检测系统提供了可靠的数据支撑。本文介绍了一款基于YOLOv8、YOLOv5等深度学习框架的茶叶等级检测模型&#xff0c;该模…

Spire.PDF for .NET【页面设置】演示:打开 PDF 时自动显示书签或缩略图

用户打开 PDF 文档时&#xff0c;他们会看到 PDF 的初始视图。默认情况下&#xff0c;打开 PDF 时不会显示书签面板或缩略图面板。在本文中&#xff0c;我们将演示如何设置文档属性&#xff0c;以便每次启动文件时都会打开书签面板或缩略图面板。 Spire.PDF for .NET 是一款独…

从 HTML 到 CSS:开启网页样式之旅(开篇之一)——CSS 初体验与网页样式新征程

从 HTML 到 CSS&#xff1a;开启网页样式之旅&#xff08;一&#xff09;——CSS 初体验与网页样式新征程 前言一、为什么需要 CSS&#xff1f;二、CSS的引用&#xff08;一&#xff09;行内样式&#xff08;二&#xff09;内部样式&#xff08;三&#xff09;外部样式&#xf…

Android音频采集

在 Android 开发领域&#xff0c;音频采集是一项非常重要且有趣的功能。它为各种应用程序&#xff0c;如语音聊天、音频录制、多媒体内容创作等提供了基础支持。今天我们就来深入探讨一下 Android 音频采集的两大类型&#xff1a;Mic 音频采集和系统音频采集。 1. Mic音频采集…

数据结构C语言描述4(图文结合)--栈的实现,中序转后序表达式的实现

前言 这个专栏将会用纯C实现常用的数据结构和简单的算法&#xff1b;有C基础即可跟着学习&#xff0c;代码均可运行&#xff1b;准备考研的也可跟着写&#xff0c;个人感觉&#xff0c;如果时间充裕&#xff0c;手写一遍比看书、刷题管用很多&#xff0c;这也是本人采用纯C语言…