初入数据库

news/2024/5/19 2:13:05

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.mrgr.cn/p/53111525

相关文章

05、应急事件检测

应急事件检测 1.Windows 系统 1.1.Windows 系统用户账号收集 查找本地用户和组:lusrmgr.msc 查找用户:net user 查找本地管理员组用户:net localgroup administrators 使用 powershell 查找用户:Get-LocalUser 1.2.Windows 系统进程信息收集 任务管理器(Ctrl+Shift+Esc)(…

SEGGER Embedded Studio IDE移植FreeRTOS

SEGGER Embedded Studio IDE移植FreeRTOS 一、简介二、技术路线2.1 获取FreeRTOS源码2.2 将必要的文件复制到工程中2.2.1 移植C文件2.2.2 移植portable文件2.2.3 移植头文件 2.3 创建FreeRTOSConfig.h并进行配置2.3.1 处理中断优先级2.3.2 configASSERT( x )的处理2.3.3 关于系…

mybatis中<if>条件判断带数字的字符串失效问题

文章目录 一、项目背景二、真实错误原因说明三、解决方案3.1针对纯数字的字符串值场景3.2针对单个字符的字符串值场景 四、参考文献 一、项目背景 MySQL数据库使用Mybatis查询拼接select语句中进行<if>条件拼接的时候&#xff0c;发现带数字的或者带单个字母的字符串失效…

md5绕过

md5绕过 ($a != $b && md5($a) == md5($b))的绕过 传参a=s1885207154a,b=s1836677006aMD5值:md5("s1885207154a") => 0e509367213418206700842008763514md5("s1836677006a") => 0e481036490867661113260034900752在PHP中 0e开头表示为科学…

Hadoop——Yarn基础架构

Hadoop——Yarn基础架构 Hadoop YARN&#xff08;Yet Another Resource Negotiator&#xff09;是Apache Hadoop生态系统中的一个子项目&#xff0c;它是用于集群资源管理的框架&#xff0c;负责为运算程序提供服务器运算资源&#xff0c;相当于一个分布式的操作系统平台&…

js的算法-交换排序(冒泡)

交换排序 所谓交换排序&#xff0c;是指根据序列中两个元素关键字的比较结果来对换这两个记录在序列中的位置。基于交换的排序算法很多&#xff0c;本次介绍冒泡排序和快速排序。 冒泡 基本思想 从后往前&#xff08;或从前往后&#xff09;两两比较相邻元素的值&#xff0…

01_Linux最简单驱动-helloworld

Linux最简单驱动-helloworld 驱动分为四个部分: ​ 头文件 ​ 驱动模块的入口和出口 ​ 声明信息 ​ 功能实现 第一步,包含头文件 #include <linux/init.h> 包含宏定义的头文件 #include <linux/module.h> 包含初始化加载模块的头文件 第二步,驱动模块的入口和出…

《QT实用小工具·四十二》圆形发光图像

1、概述 源码放在文章末尾 该项目实现了图像的发光效果&#xff0c;特别适合做头像&#xff0c;项目demo演示如下所示&#xff1a; 项目部分代码如下所示&#xff1a; import QtQuick 2.7 import QtGraphicalEffects 1.12Item {id: rootwidth: 80height: 80property int ra…

Grid 布局

文章目录 容器属性display 属性grid-template-columns 和 grid-template-rows 属性row-gap、column-gap、gap 属性grid-template-areas 属性grid-auto-flow 属性justify-items、align-items、place-items 属性justify-content、align-content、place-content 属性grid-auto-col…

KNN算法思想与Python实现

古语说得好,物以类聚,人以群分;近朱者赤,近墨者黑。这两句话的大概意思就是,你周围大部分朋友是什么人,那么你大概率也就是这种人,这句话其实也就是K最近邻算法的核心思想。kNN(k- Nearest Neighbor)法即k最邻近法,最初由 Cover和Hart于1968年提出,是一个理论上比较…

数据结构练习-算法与时间复杂度

----------------------------------------------------------------------------------------------------------------------------- 1. 设n是描述问题规模的非负整数&#xff0c;下列程序段的时间复杂度是( )。 x0;while(n>(x1)*(x1)xx1; A.O(logn) B.O(n^(1/2)) C.O(n)…

递归神经网络(RNN)在AI去衣技术中的深度应用

在人工智能&#xff08;AI&#xff09;技术飞速发展的今天&#xff0c;图像处理和计算机视觉领域不断取得新的突破。其中&#xff0c;AI去衣技术作为一个具有挑战性的研究方向&#xff0c;引起了广大研究者和公众的关注。递归神经网络&#xff08;RNN&#xff09;作为深度学习的…

HarmonyOS 应用生命周期有哪些? 按返回键会调用哪些生命周期?

UIAbility 生命周期:onCreate :页面初始化,变量定义,资源加载。 onWindowStageCreate:设置 UI 界面加载、设置 WindowStage 的事件订阅。 onForeground:切换至前台,申请系统需要的资源,或者重新申请在 onBackground()中释放的资源。 onBackground:切换至后台,释放 U…

(007)Blender 根据顶点组分离模型

1.选中模型&#xff0c;并且进入【3D视图】【编辑模式】&#xff1a; 2.选择顶点组&#xff1a; 3.分离选中项&#xff1a;

DRF之过滤 排序 分页

DRF之过滤 排序 分页使用【过滤 排序 分页】都需要在继承了GenericAPIView的视图类下使用 并指定类属性【queryset 和 serializer_class】【一】过滤 # 所有过滤类都继承 【BaseFilterBackend】 from rest_framework.filters import BaseFilterBackend【1】drf自带的过滤 # 导入…

图文结合手把手教你创建SpringCloud项目

前言 什么是SpringCloud? Spring Cloud 是一系列框架的有序集合,它利用 Spring Boot 的开发便利性简化了分布式系统的开发,比如服务注册、服务发现、网关、路由、链路追踪等。Spring Cloud 并不是重复造轮子,而是将市面上开发得比较好的模块集成进去,进行封装,从而减少了…

redis中的缓存穿透问题

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

ubuntu无法用快捷键启动终端(CTRL+AIT+T)

我的电脑不知道安装什么东西之后&#xff0c;就不能用快捷键&#xff08;CTRLAITT&#xff09;打开终端了 只能在文件夹内&#xff0c;点击鼠标右键选择终端&#xff0c;然后打开终端 一直这么用了几个月&#xff0c;今天实在受不了了&#xff0c;所以解决此问题 本文参考文章…

力扣-118. 杨辉三角

1.题目介绍 题目地址(118. 杨辉三角 - 力扣(LeetCode)) https://leetcode.cn/problems/pascals-triangle/ 题目描述 给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中,每个数是它左上方和右上方的数的和。 示例 1: 输入: numRows = 5 输出: …

IDEA中springboot项目编译两次的问题

原因:因为在导入项目的之后,项目无法运行,问题1:显示缺少org.springbootframe的依赖,不知道怎么解决,网上搜了个方法,就是勾选下图的选项,意思是把build操作由IDEA交给Maven,勾选之后确实可以启动项目了但是后面在执行Mybatis时,问题2:我发现无论如何都会报一个唯一…