初入数据库

SQL:操作关系型数据库的编程语言,定义了一套操作关系型数据库的统一标准。

DDL(Data Definition Language)数据定义语言

数据库

  • show databases;
  • create database db01;
  • use db01;
  • select database(); 显示当前使用的数据库
  • drop database db01; 删除数据库

  • 创建
    create table 表名(
    字段1 字段类型 [约束] [comment 字段注释]

    字段n 字段类型 [约束] [comment 字段注释]
    )[comment 表注释];
  • 约束:作用在表中字段上的规则,用于限制存储在表中的数据,目的:保证数据库中数据的正确性、有效性和完整性。
    在这里插入图片描述
  • 查询
    • show tables 查询当前数据库所有表
    • desc 表名 查询表结构
    • show create table 表名 查询建表语句
  • 修改
    alter
  • 删除
    drop table [if exists] 表名;
    删除表时,表中数据都会被删除

DML(Data Manipulation Language) 数据操作语言

添加数据INSERT

修改数据UPDATE

在这里插入图片描述如果没有添加where条件则代表更新所有行的对应字段。

删除数据DELETE

在这里插入图片描述
如果没有添加where条件则代表删除所有行的。
如果目的是要删除某个字段的值,无法使用delete可以使用UPDATE,将字段值更新为NULL。

DQL(Data Query Language) 数据查询语言

在这里插入图片描述

普通查询

在这里插入图片描述

条件查询

在这里插入图片描述

在这里插入图片描述

聚合函数

将一列数据作为一个整体,进行纵向计算。
select 聚合函数(字段列表) from 表名

在这里插入图片描述

count

count(字段):统计该字段非null值的个数
count(*):求行数

max

max(字段):找最大值

min

min(字段):找最小值

avg

avg(字段):求该字段所有值的平均值

sum

sum(字段):求该字段所有值的和

Tips:聚合函数只可以放在select后面

select name, price
from dish
where price < (select avg(price) from dish);

分组查询

group by :分组字段
having :条件筛选过滤
在这里插入图片描述分组查询中select可以查询的字段为分组字段和聚合函数

select gender from tb_emp group by gender;

select gender,count(*) from tb_emp group by gender;

在这里插入图片描述
若是分组过后的过滤要将条件放在having中

select job,count(*) from tb_emp where entrydate<='2015-01-01' group by job having count(*) >=2;

在这里插入图片描述
执行顺序: where->聚合函数->having

select c.name, count(*)
from dish d,category c
where d.category_id = c.idand d.status = 1
group by c.name
having count(*) >= 3;

先执行where消除多余笛卡尔积,之后根据group分类 计算出 count ,最后根据having 消除掉不符合条件的分组

where和having区别:

  • 执行时机不同:where是分组之前进行过滤,不满足where条件,不参与分组;而having是分组之后对结果进行过滤。
  • 判断条件不同:where不能对聚合函数进行判断;而having可以对聚合函数进行判断。

排序查询

在这里插入图片描述
升序:ASC (默认) , 降序:DESC

嵌套排序

若一级排序值相同,根据二级排序继续比较

select * from tb_emp order by entrydate, update_time desc ;

分页查询

在这里插入图片描述
起始索引计算公式:( 页码 - 1 ) * 每页展示记录数

样例

-- 查询用户表:条件:姓名:某张某,性别:男,入职时间:2002-01-01  2015-01-01select *
from tb_emp
where name like '%张%'and gender = 1and entrydate between '2002-01-01' and '2015-01-01'
order by update_time desc
limit 0,10;

if判断式if(条件判断式,true取值,false取值),可以用于查询结果重命名

select if(gender = 1, '男性员工', '女性员工') 性别, count(*)
from tb_emp
group by gender;

'性别’是给字段进行重命名,省略了as
在这里插入图片描述在这里插入图片描述
case表达式case 表达式 when 值1 then 结果1 when 值2 then 结果2 .... else 结果n end

select (case job when 1 then '班主任' when 2 then '讲师' when 3 then '学工主管' when 4 then '教研主管' else '未分配' end) 职位,count(*)
from tb_emp
group by job;

在这里插入图片描述

多表设计

外键

在这里插入图片描述当一个字段中的取值被外部表作为外键关联时,这个字段的这个项无法删除

物理外键

使用foreign key 定义外键关联的另外一张表称为物理外键:影响增删改的效率(要检查外键关系);仅用于单节点数据库,不适用于分布式、集群场景;容易引发数据库的死锁问题,消耗性能。

逻辑外键

在业务层逻辑中,解决外键关联。通过逻辑外键,可以很方便解决上述问题。

表对应关系

一对多

eg:部门和员工
一的一方成为父表,多的一方称为子表
实现方式:在数据库中多的一方,添加字段,来关联一的一方的主键(外键)
如果一个表的一个字段是关联至另一个表的,则我们要进行外键处理,否则其实只是字段名相同而已,并无任何关系

一对一

eg:用户和身份证
多用于单表拆分,将一张表的基础字段放在一张表中,其他字段放在另一张表中,以提升效率。
实现:在任意一方加入外键,关联另外一方的主键,并且设置外键为唯一的(UNIQUE)

多对多

eg:学生和课程
实现方法:建立第三张表作为中间表,中间表至少包含两个外键,分别关联两方主键。

多表查询

查询时如果直接使用select * from 表1,表2,得到的结果为两个表的笛卡尔积。
所以我们要进行筛选,如加上where tb_emp.dept_id = tb_dept.id;

连接查询

内连接

相当于查询A,B交集部分的数据
在这里插入图片描述

隐式内连接
select 表1.name,表2.name from 表1 表2 where 表1.two_id = 表2.id;
显式内连接
select 表1.name,表2.name from 表1 inner join 表2 on 表1.two_id = 表2.id;

Tips:还可以进行表的重命名

select a.name b.name from 表1 a 表2 b where a.two_id = b.id;

外连接

在这里插入图片描述
连接条件就是外键等的连接关系,对结果的筛选(查询条件)就要通过where

select d.name, d.price, c.name
from dish dleft join category c on (d.category_id = c.id)
where d.price between 10 and 50and d.status = 1;
左外连接

查询左表所有数据(包括两张表交集部分数据)
完全包含表1的数据

右外连接

查询右表所有数据(包括两张表交集部分数据)
完全包含表2的数据

子查询

在这里插入图片描述在这里插入图片描述

标量子查询

子查询返回的结果是单个值(数字、字符串、日期等),最简单的形式
常用操作符:= , <> , > ,>= , < , <=

select * from 表1 where two_id = (select id from 表2 where name = '教研部')

列子查询

子查询返回的结果是一列(可以是多行)
常用操作符:in 、not in 等

select * from 表1 where two_id in (select id from 表2 where name = '教研部' or name = '咨询部')

行子查询

子查询返回的结果是一行(可以是多列)
常用操作符:=、<>、in、not in

select * from 表1 where (entrydate, job) = (select entrydate, job from 表1 where name = '韦一笑');

注意(value1,value2)这种查询形式

表子查询

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

select e.*, d.name from(select * from 表1 where entrydate > '2016-01-01') e , 表2 d where e.two_id = d.id

将查询得到的临时表作为查询表,并且进行多表查询。

MySQL事务

我们在进行数据删除的时候,如果有两个表内有关联的数据,就需要先删除其中一个表,再删除另一个表内的数据,如果两步中有一步执行失败,则就会造成数据不一致的问题,由此我们需要通过事务来解决
事务:一组操作的集合,是不可分割的工作单位,事务会把所有操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。
Mysql默认一个DML语句是一个事务。所以我们如果要让多个DML语句组成一个事务就需要通过事务控制
在这里插入图片描述
在要组成的事务的DML语句组前加上开启事务,之后加上提交事务,这样就代表这些DML语句为同一个事务。如果失败了就可以用rollback,将修改的数据撤销。

四大特性

原子性:不可分割的最小单元,要么全部成功,要么全部失败。
一致性:事务完成时,必须使所有数据都保持一致状态。
隔离性:数据库提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。
持久性:事务一旦提交或回滚,对数据库的数据的改变就是永久的。

数据库优化

索引

帮助数据库高效获取数据的数据结构(可能为二叉搜索树这种,关于某个字段值的搜索树)
Tips:
主键默认有索引。
若字段上带有unique约束,则默认创建唯一索引

缺点:占用存储空间,增删改速度减慢
优点:查速度加快

结构

默认为B+树索引

语法

创建索引:create [unique] index 索引名 on 表名 (字段名,...);(unique表示唯一索引)(索引名命名规范:index_表名_字段名)
查看索引:show index from 表名;
删除索引:drop index 索引名 on 表名;

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

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

相关文章

Springboot的Test单元测试操作

Springboot的Test单元测试操作 简单总结需要操作的步骤 1&#xff0c;导入依赖 2&#xff0c;创建目录&#xff08;目录和启动类的目录保持一致&#xff09; 3&#xff0c;添加注解 4&#xff0c;写方法测试 1&#xff0c;导入依赖 <dependency><groupId>org.spri…

(八)小案例银行家应用程序-排序-数组排序

排序一直有很多的算法&#xff0c;今天我们仅仅来说JavaScript内置的排序方法 ● 字符串 const owners [Jonas, Zach, Adam, Martha]; console.log(owners.sort()); console.log(owners);但是注意&#xff0c;这个方法会改变原有的数组&#xff1b; ● 我们在试试数字 cons…

使用excel文件生成sql脚本

目录 1、excel文件脚本变量2、公式示例 前言&#xff1a;在系统使用初期有一些基础数据需要从excel中导入到数据库中&#xff0c;直接导入的话可能有些字段用不上&#xff0c;所以就弄一个excel生成sql的导入脚本&#xff0c;这样可以将需要的数据填到指定的列即可生成sql。 1、…

BootLooder引导传参和镜像编译

引导传参 所传数据结构必须约定一至 引导程序与内核之间必须约定一个参数存放的地址DDR Base+0x100 数据格式约定一至 比如用户传给内核的参数: 1 bootargs root =/ dev / mmcblk0p8 rw rootfstype = ext4 init =/ linuxrc lcd = wy070ml tp = gslx680 参数数据结构及…

很多事情不是有意义了才做,而是因为做了才有意义

引言 我们常常陷入一个误区&#xff0c;认为只有当一件事情被普遍认为有意义时&#xff0c;我们才会去做。然而&#xff0c;真正的意义往往来源于行动本身。本文将探讨如何通过行动来发现和创造个人生活和工作的意义&#xff0c;以及如何通过日常行为来确定自己的人生方向。 …

探索AI大模型在央国企的落地实践|爱分析活动

在这个人工智能技术迅猛发展的时代&#xff0c;AI大模型在央国企的落地实践正成为推动数字化转型和智能化升级的重要引擎。为了深入探讨AI大模型在央国企的应用场景、技术挑战与落地路径&#xff0c;爱分析邀请到一家头部互联网公司作为本次闭门研讨会的联合主办方&#xff0c;…

美国网站服务器解决方案

在当今互联网时代&#xff0c;网站是企业宣传、营销和销售的最好方式&#xff0c;因此&#xff0c;选择一个适合自己企业的网站服务器解决方案很重要。美国作为全球网络基础设施最发达的国家之一&#xff0c;其网站服务器解决方案具有以下特点&#xff1a; 一、安全性高 作为全…

IDEA使用中, 设置平展软件包。使用IDEA遇到的问题:src里为什么创建包为什么不在包里面

使用IDEA遇到的问题&#xff1a;src里为什么创建包为什么不在包里面 如下图所示 &#xff1a; 点击齿轮设置 如何搞回来&#xff1f; 看下面的Flatten Packages&#xff08;平展软件包&#xff09;取消掉。

【算法刷题 | 回溯思想 07】4.18(全排列、全排列 ||)

文章目录 11.全排列11.1题目11.2解法&#xff1a;回溯11.2.1回溯思路&#xff08;1&#xff09;函数返回值以及参数&#xff08;2&#xff09;函数返回值&#xff08;3&#xff09;遍历过程 11.2.2代码实现 12.全排列 ||12.1题目12.2解法&#xff1a;回溯12.2.1回溯思路12.2.3代…

HTTP接口调用时报错 java.io.IOException: Connection reset by peer解决办法

问题描述 在接口调用时,遇到如下报错:Caused by: java.io.IOException: Connection reset by peer at sun.nio.ch.FileDispatcherImpl.write0(Native Method) ~[?:1.8.0_241] at sun.nio.ch.SocketDispatcher.write(SocketDispatcher.java:47) ~[?:1.8.0_…

【Redis 开发】缓存穿透解决

缓存穿透 缓存穿透缓存空对象布隆过滤缓存空对象实现其他缓解方式 缓存穿透 缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在&#xff0c;这样缓存就永远不会生效&#xff0c;这些请求都会打到数据库 常见的解决方案有两种&#xff1a; 缓存空对象&#xff0c;布隆过…

Postman - 设置变量

场景&#xff1a; 比如你接口都有权限&#xff0c;访问需要每调一个接口都手动放token的值&#xff0c;这个时候就可以搞个全局的变量&#xff0c;只设置一次就可以了 1、设置变量 Environments -> Globals - > 设置key 、value 2、使用变量 {{你得变量名-key}} 3…

redis中的缓存穿透问题

缓存穿透 缓存穿透问题&#xff1a; 一般请求来到后端&#xff0c;都是先从缓存中查找数据&#xff0c;如果缓存中找不到&#xff0c;才会去数据库中查询数据。 而缓存穿透就是基于这一点&#xff0c;不断发送请求查询不存在的数据&#xff0c;从而使数据库压力过大&#xff…

MySQL主从的应用

说明&#xff1a;本文介绍MySQL主从在实际中的应用。主从搭建和问题参考下面两篇文章&#xff1a; MySQL主从结构搭建 搭建MySQL主从结构时的问题 数据迁移 当我们搭建完MySQL主从&#xff0c;第一步当然是把历史数据导入到主从结构中。有以下两种方式&#xff1a; 开启主从…

Python如何安装本地的.whl文件

在Python中&#xff0c;.whl文件&#xff08;也被称为wheel文件&#xff09;是一种二进制包格式&#xff0c;它允许用户在没有源代码的情况下安装Python库。这对于那些没有编译环境或者希望快速安装的用户来说非常有用。在本文中&#xff0c;我们将探讨如何在本地安装.whl文件。…

Linux之 USB驱动框架-usb_submit_urb和usb_fill_*_urb分析(6)

一、usb_fill_*_urb 函数调用流程 // 控制 static inline void usb_fill_control_urb(struct urb *urb, struct usb_device *dev, unsigned int pipe, unsigned char *setup_packet, void *t…

CST Studio初级教程 一

本教程将详细介绍CST Studio Project创建。 新建Project 1. 点击New and Recent&#xff0c;然后点击New Template。 然后依据我们的仿真属类&#xff0c;在下图中做选择需要的模板。 如果做高频连接器信号完整性&#xff08;SI&#xff09;仿真&#xff0c;我们就选Microwaves…

数据结构之二叉搜索树底层实现洞若观火!

目录 题外话 正题 二叉搜索树 底层实现 二叉搜索树查找操作 查找操作思路 查找代码实现详解 二叉搜索树插入操作 插入操作思路 插入代码详解 二叉搜索树删除操作 删除操作思路 删除代码详解 小结 题外话 我的一切都是党给的,都是人民给的,都是家人们给的!! 十分感…

Java分布式ID

1 什么是分布式ID 分布式ID是指在分布式系统中生成的唯一标识符&#xff0c;用于标识不同实体或数据的唯一性。在分布式系统中&#xff0c;多台机器并行处理任务&#xff0c;为了确保生成的ID在整个系统中的唯一性&#xff0c;需要采用特殊的算法来生成分布式ID。 在传统的单机…

Docker的数据管理、网络通信和dockerfile

目录 一、Docker的数据管理 1. 数据卷 1.1 数据卷定义 1.2 数据卷配置 2. 数据卷容器 2.1 创建数据卷容器 2.2 使用--volume-from来挂载test1 二、端口映射 三、容器互联 1. 创建容器互联 ​编辑2. 进入test2测试&#xff08;ping 容器名/别名&#xff09; 四、Dock…