数据库(DQL,多表设计,事务,索引)

目录

查询数据库表中数据

where  条件列表

group by  分组查询

having  分组后条件列表

order  by  排序字段列表

limit  分页参数 

多表设计

一对多

多对多

一对一

多表查询

事物

索引


查询数据库表中数据

关键字:SELECT

 中间有空格,加引号

select  字段列表

查询多个字段:select  字段1, 字段2, 字段3  from   表名; 

查询所有字段(通配符):select  *  from   表名;

设置别名:select  字段1  [ as  别名1 ] , 字段2  [ as  别名2 ]   from   表名;

去除重复记录:select  distinct  字段列表  from   表名;

from    表名列表

where  条件列表

条件查询:select  字段列表  from   表名   where   条件列表 ;

比较运算符

功能

>

大于

>=

大于等于

<

小于

<=

小于等于

=

等于

<>  或 !=

不等于

between ... and ...

在某个范围之内(含最小、最大值)

in(...)

在in之后的列表中的值,多选一

like  占位符

模糊匹配(  _匹配单个字符, %匹配任意个字符)

is null

是null

逻辑运算符

功能

and  或  &&

并且 (多个条件同时成立)

or  或  ||

或者 (多个条件任意一个成立)

not  或  !

非 , 不是

-- 1. 查询 姓名 为 杨逍 的员工
select * from emp where name = '杨逍';

-- 2. 查询在 id小于等于5 的员工信息
select * from emp where id <= 5;

-- 3. 查询 没有分配职位 的员工信息  -- 判断 null , 用 is null
select * from emp where job is null;

-- 4. 查询 有职位 的员工信息  -- 判断 不是null , 用 is not null
select * from emp where job is not null ;

-- 5. 查询 密码不等于 '123456' 的员工信息
select * from emp where password != '123456';

-- 6. 查询入职日期 在 '2000-01-01' (包含) 到 '2010-01-01'(包含) 之间的员工信息
select * from emp where entrydate between '2000-01-01' and '2010-01-01' ;

-- 7. 查询 入职时间 在 '2000-01-01' (包含) 到 '2010-01-01'(包含) 之间 且 性别为女 的员工信息
select * from emp where (entrydate between '2000-01-01' and '2010-01-01') and  gender = 2;

-- 8. 查询 职位是 2 (讲师), 3 (学工主管), 4 (教研主管) 的员工信息
select * from emp where job = 2 or job = 3 or job = 4;

select * from emp where job in (2,3,4);

-- 9. 查询姓名为两个字的员工信息
select * from emp where name like '__';

-- 10. 查询姓 '张' 的员工信息  ---------> 张%
select * from emp where name like '张%';

-- 11. 查询姓名中包含 '三' 的员工信息
select * from emp where name like '%三%';                                                                                       

group by  分组查询

聚合函数

定义:将一列数据作为一个整体,进行纵向计算

语法:select  聚合函数(字段列表)  from   表名 ;

函数

功能

count

统计数量

max

最大值

min

最小值

avg

平均值

sum

求和

null值不参与所有聚合函数运算。

统计数量可以使用:count(*)   count(字段)   count(常量),推荐使用count(*)。 

-- 聚合函数

-- 1. 统计该企业员工数量 -- count
-- A. count(字段)
select count(id) from emp;
select count(job) from emp; -- null值不参与聚合函数运算

-- B. count(*)
select count(*) from emp;

-- C. count(值)
select count(1) from emp;

-- 2. 统计该企业员工 ID 的平均值
select avg(id) from emp;

-- 3. 统计该企业最早入职的员工的入职日期
select min(entrydate) from emp;

-- 4. 统计该企业最近入职的员工的入职日期
select max(entrydate) from emp;

-- 5. 统计该企业员工的 ID 之和
select sum(id) from emp;

having  分组后条件列表

分组查询:select  字段列表  from   表名  [ where   条件 ]  group   by  分组字段名  [ having  分组后过滤条件 ];

-- 1. 根据性别分组 , 统计男性和女性员工的数量  -- count(*)
select gender , count(*) from emp group by gender;

-- 2. 先查询入职时间在 '2015-01-01' (包含) 以前的员工 , 并对结果根据职位分组 , 获取员工数量大于等于2的职位 -- count
select job ,count(*)  from emp where entrydate <= '2015-01-01'  group by job having count(*) >= 2;
 

here与having区别

1.执行时机不同:where是分组之前进行过滤,不满足where条件,不参与分组;而having是分组之后对结果进行过滤。

2.判断条件不同:where不能对聚合函数进行判断,而having可以。

注意:分组之后,查询的字段一般为聚合函数和分组字段,查询其他字段无任何意义。

执行顺序: where  >  聚合函数 > having 。

order  by  排序字段列表

条件查询:select  字段列表  from   表名   [ where   条件列表 ] [ group by  分组字段 ] order  by  字段1  排序方式1 , 字段2 排序方式2;

ASC:升序(默认值)

DESC:降序

如果是多字段排序,当第一个字段值相同时,才会根据第二个字段进行排序。

-- 1. 根据入职时间, 对员工进行升序排序  -- 排序条件
select * from emp order by entrydate asc ; -- 默认升序, asc可以省略的

-- 2. 根据 入职时间 对公司的员工进行 升序排序 , 入职时间相同 , 再按照 ID 进行降序排序
select * from emp order by entrydate asc , id desc ;
 

limit  分页参数 

分页查询:select  字段列表  from   表名  limit  起始索引, 查询记录数 ;

-- 1. 查询第1页员工数据, 每页展示10条记录
select * from emp limit 0,10;

select * from emp limit 10;


-- 2. 查询第2页员工数据, 每页展示10条记录
select * from emp limit 10,10;

-- 公式 : 页码 ---> 起始索引  ------->  起始索引 = (页码 - 1) * 每页记录数

 案例:select *from emp where name like '%张' and gender = 1 and entrydate between '2000-01-01' and '2015-12-31' order by update_time desc  limt 10 ;

多表设计

一对多

一对多关系实现:在数据库表中多的一方,添加字段,来关联一的一方的主键。

(父表)部门及员工(子表)模块的表结构

create table tb_dept(

      id int unsigncd primary kcy auto increment commont '上键ID',

     name varchar(10) not null unique comment '部门名称',

    create_time datetime not null comment  '创建时间',

    update_time datetime not null commenl  '修改时间'

comment '部门表';

dept_id int unsigned comment '归属的部门 ID';

create table tb_emp(
id int unsigned primary key auto_increment comment 'ID',
username varchar(20) not null unique comment '用户名',
password varchar(32) default '123456 comment '密码',
name varchar(10) not null comment '姓名',
gender tinyint unsigned not null comment "性别,说明:1 男,2 女',
image varchar(300) comment '图像',
job tinyint unsigned comment '职位,说明:1 班主任,2 讲师,3 学工主管,4 教研主管',
entrydate date comment '入职时间',

dept_id int unsigned comment '归属的部门ID';
create time datetime not null comment '创建时间,
update time datetime not null comment '修改时间'
) comment '员工表';

在数据库层面,并未建立关联,所以是无法保证数据的一致性和完整性的

外键约束

-- 1.创建表时指定

create table 表名(     

            字段名    数据类型,   

             ...   

            [constraint]   [外键名称]  foreign  key (外键字段名)   references   主表/父表 (字段名)    

);

-- 2.建完表后,添加外键

alter table  表名  add constraint  外键名称  foreign key (外键字段名) references  主表(字段名);

概念:在业务层逻辑中,解决外键关联。

通过逻辑外键,就可以很方便的解决上述问题。

多对多

案例: 学生 与 课程的关系

关系: 一个学生可以选修多门课程,一门课程也可以供多个学生选择

实现:建立第三张中间表,中间表至少包含两个外键,分别

一对一

案例: 用户 与 身份证信息 的关系

关系: 一对一关系,多用于单表拆分,将一张表的基础字段放在一张表中,其他字段放在另一张表中,以提升操作效率

实现:在任意一方加入外键,关联另外一方的主键,并且设置外键为唯一的(UNIQUE)

constraint fk_user_id foreign key (user_id) references  tb_user(id)

案例

 

主键:int unsigned  无符号int

tinyint unsigned  排序(0-99数字)

varchar(20)   长度不固定   变相说明不能为空

decimal(8,2)  总长8,2位的小数

图片 varchar(300)

多表查询

select * from tb_emp,tb_dept;

笛卡尔积,在数学中,两个集合的所用组合情况

select * from tb_emp,tb_dept where tb_emp.dept_id = tb_dept.id;

内连接:相当于查询A,B交集部分数据

隐式内连接:select 字段列表 from 表1,表2 where 条件 ...;

查询员工的姓名,及所属的部门名称

select tb_emp.name , tb_dept.name from tb_emp,tb_dept where tb_emp.dept_id =

tb_dept.id;

起别名

select e.name,d.name from tb_emp e,tb_dept d where e.dept_id = d.id;

显示内连接:select 字段列表 from 表1 [inner] join 表2 on 连接条件...;

查询员工的姓名,及所属的部门名称

select tb_emp.name , tb_dept.name from tb_emp inner join tb_dept on  tb_emp.dept_id = tb_dept.id;

外连接

左外连接:查询左表所有数据(包括两张表交集部分数据)

select 字段列表 from 表1 left join 表2 on 连接条件...;

查询员工表 所有 员工的姓名,和对应的部门名称

select e.name,d.name from tb_emp e left join tb_dept d on e.dept_id = d.id;

右外连接:查询右表所有数据(包括两张表交集部分数据)

 

查询部门表 所有 部门的名称,和对应的员工姓名

select e.name,d.name from tb_emp e right join tb_dept d on e.dept_id = d.id;

子查询

SQL语句中嵌套select语句,嵌套查询,又称子查询。

select* from t1 where colurmn1 = (select column from t2 ...);

标量子查询:子查询返回的结果为单个值

子查询返回的结果是单个值(数字、字符串、日期等),最简单的形式

常用的操作符:=   <>    >     >=     <    <=

-- . 查询 "教研部" 的所有员工信息
-- 1. 查询 教研部 的部门ID - tb_dept
select id from tb_dept where name = '教研部';

-- 2. 再查询该部门ID下的员工信息 - tb_emp
select * from tb_emp where dept_id = (select id from tb_dept where name = '教研部');

 列子查询:子查询返回的结果为一列 (可以是多行)

常用的操作符:in  、not in等


-- A. 查询 "教研部" 和 "咨询部 " 的所有员工信息
-- a. 查询 "教研部" 和 "咨询部" 的部门ID - tb_dept
select id from tb_dept where name = '教研部' or name = '咨询部';

-- b. 根据部门ID, 查询该部门下的员工信息 - tb_emp
select * from tb_emp where dept_id in (select id from tb_dept where name = '教研部' or name = '咨询部');

行子查询:子查询返回的结果是一行(可以是多列)。

常用的操作符:=  、<> 、in 、not  in


-- A. 查询与 "韦一笑" 的入职日期 及 职位都相同的员工信息 ;
-- a. 查询 "韦一笑" 的入职日期 及 职位
select entrydate,job from tb_emp where name = '韦一笑';

-- b. 查询与其入职日期 及 职位都相同的员工信息 ;
-- 方式一
select * from tb_emp where entrydate = (select entrydate from tb_emp where name = '韦一笑') and job = (select job from tb_emp where name = '韦一笑');

-- 方式二
select * from tb_emp where (entrydate,job)=(select entrydate,job from tb_emp where name = '韦一笑');
 

表子查询:子查询返回的结果是多行多列,常作为临时表

常用的操作符:in

-- A. 查询入职日期是 "2006-01-01" 之后的员工信息 , 及其部门名称
-- a. 查询入职日期是 "2006-01-01" 之后的员工信息
select * from tb_emp where entrydate > '2006-01-01';

-- b. 查询这部分员工信息及其部门名称 - tb_dept
select e.* , d.name from (select * from tb_emp where entrydate > '2006-01-01') e , tb_dept d where e.dept_id = d.id;

事物

事务 是一组操作的集合,它是一个不可分割的工作单位。事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作 要么同时成功,要么同时失败。

注意:默认MySQL的事务是自动提交的,也就是说,当执行一条DML语句,MySQL会立即隐式的提交事务。

开启事务:start transaction;  /  begin ;

提交事务:commit;

回滚事务:rollback;

四大特性

 原子性:事务是不可分割的最小单元,要么全部成功,要么全部失败

一致性:事务完成时,必须使所有的数据都保持一致状态

隔离性:数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行

持久性:事务一旦提交或回滚,它对数据库中的数据的改变就是永久的

索引

是帮助数据库 高效获取数据 的 数据结构 /树形结构

select * from tb_sku where sn = '100000003145008'; -- 14s


select count(*) from tb_sku;


create index idx_sku_sn on tb_sku(sn);

-- 创建 : 为tb_emp表的name字段建立一个索引 .

create  [ unique ]  index 索引名 on  表名 (字段名,... ) ;
create index idx_emp_name on tb_emp(name);

-- 查询 : 查询 tb_emp 表的索引信息 .

show  index  from  表名;
show index from tb_emp;

-- 删除: 删除 tb_emp 表中name字段的索引 .

drop  index  索引名  on  表名;
drop index idx_emp_name on tb_emp;

注意:主键字段,在建表时,会自动创建主键索引。

添加唯一约束时,数据库实际上会添加唯一索引。

优点:提高数据查询的效率,降低数据库的IO成本。 通过索引列对数据进行排序,降低数据排序的成本,降低CPU消耗。

缺点:索引会占用存储空间。 索引大大提高了查询效率,同时却也降低了insert、update、delete的效率。 

结构:

MySQL数据库支持的索引结构有很多,如:Hash索引、B+Tree索引、Full-Text索引等。我们平常所说的索引,如果没有特别指明,都是指默认的 B+Tree 结构组织的索引。

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

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

相关文章

day4 驱动开发

【ioctl函数的使用】 1.概述 linux有意将对设备的功能选择和设置以及硬件数据的读写分成不同的函数来实现。让read/write函数专注于数据的读写&#xff0c;而硬件功能的设备和选择通过ioctl函数来选择 2.ioctl函数分析 int ioctl(int fd,unsigned long request) 通过&…

[Linux]进程状态

[Linux]进程状态 文章目录 [Linux]进程状态进程状态的概念阻塞状态挂起状态Linux下的进程状态孤儿进程 进程状态的概念 了解进程状态前&#xff0c;首先要知道一个正在运行的进程不是无时无刻都在CPU上进行运算的&#xff0c;而是在操作系统的管理下&#xff0c;和其他正在运行…

开启元宇宙农场的绝世盛宴——Fram world

近年科技突飞猛进&#xff0c;元宇宙横扫游戏与金融领域&#xff0c;其中震惊全球的Fram world&#xff0c;不仅为玩家带来崭新娱乐&#xff0c;更在游戏与经济的融合中掀起惊人革命&#xff01;凭借Cardano基金会的强大支持&#xff0c;与英国英利区块链研究所的密切合作&…

无公网IP内网穿透使用vscode配置SSH远程ubuntu随时随地开发写代码

文章目录 前言1、安装OpenSSH2、vscode配置ssh3. 局域网测试连接远程服务器4. 公网远程连接4.1 ubuntu安装cpolar内网穿透4.2 创建隧道映射4.3 测试公网远程连接 5. 配置固定TCP端口地址5.1 保留一个固定TCP端口地址5.2 配置固定TCP端口地址5.3 测试固定公网地址远程 前言 远程…

网络安全等级保护2.0

等保介绍 信息系统运维安全管理规定&#xff08;范文&#xff09;| 资料 等保测评是为了符合国家法律发挥的需求&#xff0c;而不是安全认证&#xff08;ISO&#xff09; 一般情况没有高危安全风险一般可以通过&#xff0c;但若发现高位安全风险则一票否决 二级两年一次 三…

SpringSession

Spring Session 是 Spring 的项目之一。Spring Session 提供了一套创建和管理 Servlet HttpSession 的方案&#xff0c;默认采用外置的 Redis 来存储 Session 数据&#xff0c;以此来解决 Session 共享的 问题。(springsession储存session数据的方式有很多&#xff0c;我们常…

ARM开发,stm32mp157a-A7核SPI总线实验(实现数码管的显示)

1.目标&#xff1a; a.数码管显示相同的值 0000 1111 ......9999&#xff1b; b.数码管显示不同的值 1234&#xff1b; 2.分析m74hc595芯片内部框图&#xff1b; 真值表&#xff1a; 3.代码&#xff1b; ---spi.h头文件--- #ifndef __SPI_H__ #define __SPI_H__#include &quo…

守护进程(精灵进程)

目录 前言 1.如何理解前台进程和后台进程 2.守护进程的概念 3.为什么会存在守护进程 4.如何实现守护进程 5.测试 总结 前言 今天我们要介绍的是关于守护进程如何实现&#xff0c;可能有小伙伴第一次听到守护进程这个概念&#xff0c;感觉很懵&#xff0c;知道进程的概念&…

RK3568评估板外接屏幕修改竖屏为横屏显示

问题 使用RK3568评估板外接HDMI屏幕时竖屏显示内容&#xff0c;需要修改为横屏显示。 解决办法 修改weston.ini配置文件&#xff0c;配置output输出参数 查看显示屏名称 使用ls /sys/class/drm/ 命令查看显示屏名称&#xff0c;如下图所示&#xff0c;示例屏为HDMI屏&#xff0…

装备制造企业如何执行精益管理?

导 读 ( 文/ 2358 ) 精益管理是一种以提高效率、降低成本和优化流程为目标的管理方法。装备制造行业具备人工参与度高&#xff0c;产成品价值高&#xff0c;质量要求高的特点。 在装备制造企业中实施精益管理可以帮助企业提高竞争力、提升生产效率并提供高质量的产品。本文将…

java+springboot+mysql农业园区管理系统

项目介绍&#xff1a; 使用javaspringbootmysql开发的农业园区管理系统&#xff0c;系统包含超级管理员、管理员、用户角色&#xff0c;功能如下&#xff1a; 超级管理员&#xff1a;管理员管理&#xff1b;用户管理&#xff1b;土地管理&#xff08;租赁&#xff09;&#x…

Window Server 与 Windows 系统开关机日志查看方法

目录 Windows/Windows Server 查看日志Windows 系统常用的事件 ID 环境&#xff1a;Windows Server 2019 &#xff08;也适用于 Windows 其他系统&#xff09;。 不同版本的 Windows 图标可能有所不同&#xff0c;但是服务器级 Windows Server 与普通桌面级 Windows 还会有些操…

企业微信电脑端开启chrome调试

首先&#xff1a; Mac端调试开启的快捷键&#xff1a;control shift command d Window端调试开启的快捷键: control shift alt d 这边以Mac为例&#xff0c;我们可以在电脑顶部看到调试的入口&#xff1a; 然后我们点击 『浏览器、webView相关』菜单&#xff0c;勾选上…

ARM开发,stm32mp157a-A7核IIC实验(采集温湿度传感器值)

1.实验目标&#xff1a;采集温湿度传感器值&#xff1b; 2.分析框图&#xff08;模拟IIC控制器&#xff09;&#xff1b; 3.代码&#xff1b; ---iic.h封装时序协议头文件--- #ifndef __IIC_H__ #define __IIC_H__ #include "stm32mp1xx_gpio.h" #include "st…

【IMX6ULL驱动开发学习】09.Linux之I2C框架简介和驱动程序模板

参考&#xff1a;Linux之I2C驱动_linux i2c驱动_风间琉璃•的博客-CSDN博客​​​​​​ 目录 一、I2C驱动框架简介 1.1 I2C总线驱动 1.2 I2C设备驱动 二、I2C总线-设备-驱动模型 2.1 i2c_driver 2.2 i2c_client 2.3 I2C 设备数据收发和处理 三、Linux I2C驱动程序模板…

QuantLib学习笔记——利用quantlib绘制零息利率(zero rate)期限结构曲线

⭐️ 引言 利率&#xff0c;这个看似简单的概念&#xff0c;在金融领域有很多内涵。以这个词为基础&#xff0c;扩展出类似零息利率&#xff08;即期利率&#xff09;、远期利率等概念。本文就零息利率展开讨论&#xff0c;并绘制零息利率期限结构曲线。 ⭐️ 一些金融概念 …

前端进阶Html+css10----定位的参照对象(高频面试题)

1.relative的参照对象 1&#xff09;元素按照标准流进行排布&#xff1b; 2&#xff09;定位参照对象是元素自己原来的位置&#xff0c;可以通过left、right、top、bottom来进行位置调整&#xff1b; 2.absolute&#xff08;子绝父相&#xff09; 1&#xff09;元素脱离标准流…

2023国赛数学建模思路 - 案例:退火算法

文章目录 1 退火算法原理1.1 物理背景1.2 背后的数学模型 2 退火算法实现2.1 算法流程2.2算法实现 建模资料 ## 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 退火算法原理 1.1 物理背景 在热力学上&a…

阿里云容器镜像服务ACR(Alibaba Cloud Container Registry)推送镜像全过程及总结

前提&#xff1a;安装配置好docker&#xff0c;可参考我这篇 基于CentOS7安装配置docker与docker-compose。 一、设置访问凭证 1.1 容器镜像服务ACR 登录进入阿里云首页&#xff0c;点击 产品-容器-容器镜像服务ACR 点击管理控制台 1.2 进入控制台-点击实例列表 个人容器…

亚信科技AntDB数据库通过GB 18030-2022最高实现级别认证,荣膺首批通过该认证的产品之列

近日&#xff0c;亚信科技AntDB数据库通过GB 18030-2022《信息技术 中文编码字符集》最高实现级别&#xff08;级别3&#xff09;检测认证&#xff0c;成为首批通过该认证的数据库产品之一。 图1&#xff1a;AntDB通过GB 18030-2022最高实现级别认证 GB 18030《信息技术 中文编…