本节用到的员工信息管理表结构放到资源中,需要的同学自取。本节内容以此表为示例:

 

 

 

面试题:innodb与myisam的区别。

外键,事务

特性InnoDBMyISAM
事务支持支持不支持
外键支持不支持
锁粒度行级锁表级锁
索引结构聚簇索引非聚簇索引
崩溃恢复支持不支持
空间效率较高(但占用更多空间)较低(但更紧凑)
写性能高(行级锁)低(表级锁)
适用场景事务、高并发写静态数据、读密集型

一、简单查询

语法:

select [ 去重关键字distinct] 字段 from 表格名称;

字段:*代表所有字段

select 字段  as "字段别名"... from 表格名称;

as可以省略不写,后面空格直接跟别名。

 查询所有员工的编号,姓名,薪资

select empno"员工编号",ename"员工姓名",sal"员工薪资" from emp;

二、限定查询

语法:

select [ 去重关键字distinct] 字段 from 表格名称 [限定语法]

where >, < ,>= ,<= ,!=, between...and...,

查询公司中工资高于2000的员工

select * from emp where sal > 2000;

查询公司中工资1000到3000的员工

select * from emp where sal between 1000 and 3000;
select * from emp where sal > 1000 and sal < 3000;

查询有奖金的员工信息

select * from emp where comm > 0

查询没有奖金的员工信息

select * from emp where comm IS null or comm = 0

查询名称中以S开头 模糊匹配 %通配所有 _通配一位

select * from emp where ename like "s%" 以s开头select * from emp where ename like "%s" 以s结尾select * from emp where ename like "%s%" 名称中包含sselect * from emp where ename like "_o%" 第二位为o,其余无所谓

查询1981年入职的员工信息

select * from emp where HIREDATE BETWEEN '1981-01-01' and '1981-12-31'select * from emp where HIREDATE like '%1981%'

查询员工编号为7499,7521的员工信息

select * from emp where EMPNO = 7499 or EMPNO = 7521select * from emp where EMPNO in (7499,7521)

三、排序查询

语法:

select [ 去重关键字distinct] 字段 from 表格名称 [限定语法][排序条件]

排序关键字:order by

升序:asc

降序:desc

查询员工信息,根据薪资做倒序排序

select * from emp order by asl desc;

查询员工信息,根据入职日期做降序排序, 日期一致则按薪资升序排序。

select * from emp order by hiredate desc ,sal asc;

四、多表查询

语法:select [去重关键字DISTINCT] 字段 from 表格名称 , 表格名称 [限定语法][排序条件];

查询所有员工信息,包含部门信息

select * from emp,dept

以上查询方式将两张表进行简单堆积,查询中有无用的冗余数据,这种现象称之为笛卡尔积效应

在查询过程中,添加关联条件,用来在显示上消除笛卡尔积效应

select * from emp,dept where emp.deptno = dept.deptnoselect e.*,d.DNAME,d.loc from emp e,dept d where e.deptno = d.deptno

查询所有员工信息,包含员工编号、员工姓名、员工薪资、领导编号、领导姓名、领导薪资

确定需要的表格:emp e1,emp e2

确定需要的字段:e1.empno '员工编号',e1.ename '员工姓名',e1.sal '员工薪资',e2.empno '领导编号',e2.ename '领导姓名',e2.sal '领导薪资'

确定需要的关联条件:e1.mgr = e2.empno

组装sql:
 

SELECT
e1.empno '员工编号',
e1.ename '员工姓名',
e1.sal '员工薪资',
e2.empno '领导编号',
e2.ename '领导姓名',
e2.sal '领导薪资'
FROM
emp e1, emp e2
WHERE
e1.mgr = e2.empno;

以上sql查询完之后,显示13条结果,KING这条数据没有显示(边界值无法查询),如果向解决边界值问题,需要使用连接查询

五、连接查询

语法:

select [去重关键字DISTINCT] 字段 from 表格名称 [连接条件] 表格名称 [限定语法][排序条件];
左(外)连接:left(outer) join ...on...
右(外)连接:right(outer) join ...on...
以哪个表为重点就哪边连接;

 查询所有员工信息,包含员工编号、员工姓名、员工薪资、领导编号、领导姓名、领导薪资

SELECT e1.empno AS '员工编号',e1.ename AS '员工姓名',e1.sal AS '员工薪资',e2.empno AS '领导编号',e2.ename AS '领导姓名',e2.sal AS '领导薪资'
FROM emp e1
LEFT JOIN emp e2 ON e1.mgr = e2.empno;

 

拓展语法:SQL1999语法

交叉连接:select * from emp join dept; 类似于“,”进行笛卡尔积, 查询显示56条结果

自然连接:select * from emp natural join dept; 自动组合共同字段,查询显示14条结果

join...on+条件:select * from emp join dept on emp.deptno = dept.deptno; 查询显示14条结果

join...using(两边表的共同字段):select * from emp join dept using(deptno); 查询显示14条结果

六、分组查询

分组前提:需要分组的字段有重复值

语法:

select [去重关键字DISTINCT] 字段 from 表格名称 [限定语法][分组条件][排序条件];
分组关键字:group by

注意事项:
1.一旦出现分组条件,那么select后边只允许出现统计函数和分组字段
2.分组之后如果还想使用限定条件筛选,那么不允许使用where,需要使用having

 查询每一个部门的平均工资

确定需要的表:emp
确定需要的字段:avg(sal)
确定需要的分组条件:group by deptno
组装sql:select avg(sal) from emp group by deptno

优化sql:select deptno,avg(sal) from emp group by deptno

发现上述sql中没有40部门(边界值)
确定需要的表:emp e,dept d
确定需要的字段:d.deptno,avg(sal)
确定需要的分组条件:group by d.deptno
组装sql:

SELECT d.deptno, IFNULL(AVG(sal), 0) '平均工资' 
FROM emp e 
RIGHT JOIN dept d ON e.deptno = d.deptno 
GROUP BY d.deptno;

查询部门的平均薪资,要求显示平均薪资高于2000的信息

SELECT d.deptno, IFNULL(AVG(e.sal), 0) AS '平均工资' 
FROM dept d 
LEFT JOIN emp e ON d.deptno = e.deptno 
GROUP BY d.deptno 
HAVING IFNULL(AVG(e.sal), 0) > 2000;  -- 确保在过滤时处理 NULL 值AVG(sal) > 2000

七、统计查询

平均avg   最大值max   最小值min   统计数量 count   求和 sum

拓展技术:

单行函数参考单行函数文档。

八、子查询

where 子查询

当查询的结果为单行单列或多行单列的时候

查询比smith工资高的所有员工信息。

SELECT *
FROM emp
WHERE sal > (SELECT sal FROM emp WHERE ename = 'SMITH');

 查询公司中和经理一样工资的员工信息

SELECT *
FROM emp
WHERE sal in (SELECT sal FROM emp WHERE job = 'manager')

 小贴士:

=ang        等同于       in

<ang        等同于        比最大值小的数据

>ang        等同于        比最小值大的数据

<all        等同于        比最小值小的数据

>all        等同于        比最大值大的数据

 from 子查询

当查询的结果为多行多列

查询部门编号、部门名称、部门位置、部门人数、部门平均薪资

第一步:查询部门单表信息(4条结果)

select * from dept

第二步:查询员工表,得到部门人数、部门平均(3条结果)

确定需要的表格:emp e
确定需要的字段:e.deptno deptno,count(e.empno) num,avg(e.sal) sal
确定需要的分组条件:group by e.deptno
组装sql:
select e.deptno deptno,count(e.empno) num,avg(e.sal) sal from emp e group by e.deptno

第三步:将上述sql进行左右连接查询

确定需要的表格:
dept d,
(select e.deptno deptno,count(e.empno) num,avg(e.sal) sal from emp e group by e.deptno) temp
确定需要的字段:d.deptno,d.dname,d.loc,temp.num,temp.sal
确定需要的关联条件:d.deptno = temp.deptno
​
组装sql:
SELECT d.deptno,d.dname,d.loc,temp.num,temp.sal
FROM dept d
LEFT JOIN (SELECT e.deptno AS deptno,COUNT(e.empno) AS num,AVG(e.sal) AS salFROM emp eGROUP BY e.deptno) temp 
ON d.deptno = temp.deptno;

九、分页查询

为什么需要分页查询?

语法:select [去重关键字DISTINCT] 字段 from 表格名称 [限定语法][分组条件][排序条件][分页条件]
分页:limit n,m
n:数据索引,从0开始
m:每一页显示多少条

查询第一页员工数据,一页显示10条

select * from emp limit 0,10;

当n为0的时候,可以省略不写:select * from emp limit 10;

第二页:

select * from emp limit 10,10;

 事务

  数据库事务( transaction)是访问并可能操作各种数据项的一个数据库操作序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。事务由事务开始与事务结束之间执行的全部数据库操作组成。

事务的四大特性:

1、原子性(Atomicity):事务中的全部操作在数据库中是不可分割的,要么全部完成,要么全部不执行。 

2、一致性(Consistency):几个并行执行的事务,其执行结果必须与按某一顺序 串行执行的结果相一致。 

3、隔离性(Isolation):事务的执行不受其他事务的干扰,事务执行的中间结果对其他事务必须是透明的。 

4、持久性(Durability):对于任意已提交事务,系统必须保证该事务对数据库的改变不被丢失,即使数据库出现故障。 

脏读 幻读

MySQL数据库事务测试

mysql的事务是默认提交机制

事务提交机制有两种:自动提交,手动提交

修改数据库事务提交机制:
关闭自动提交:set autocommit = 0;

开启自动提交:set autocommit = 1;

如果关闭自动提交,那么在发生增删改以后需要程序员提交(commit)或回滚(rollback)

  MySQL数据库事务隔离级别

MySQL 提供了四种事务隔离级别,以确保数据的一致性和完整性。这四种隔离级别分别是:读未提交(Read Uncommitted)、读已提交(Read Committed)、可重复读(Repeatable Read)和可串行化(Serializable)

读未提交(Read Uncommitted):
        定义:事务可以读取其他未提交事务的更改。

        问题:可能导致脏读(Dirty Read)

        适用场景:对数据一致性要求不高的场景。


读已提交(Read Committed):(oracle默认级别)

        定义:事务只能读取其他已提交事务的更改。

        问题:避免了脏读,但可能导致不可重复读(Non-repeatable Read)

        适用场景:大多数数据库系统的默认隔离级别,如oracle。


可重复读(Repeatable Read):(MySQL默认级别)

        定义:在同一事务中多次读取相同数据时,结果一致。

        问题:避免了脏读和不可重复读,但可能导致幻读(Phantompead)。

        适用场景:MySQL 的默认隔离级别,适用于大部分应用。


可串行化(serializable):
        定义:最高的隔离级别,事务按顺序逐个执行,完全隔离。
        问题:避免了脏读、不可重复读和幻读,但并发性能最差。
        适用场景:对数据一致性要求极高的场景。

脏读(Dirty Read)‌。

   定义‌:读取到其他事务未提交的修改数据,若该事务回滚则导致数据无效
   示例‌:事务A修改账户余额后未提交,事务B读取到该临时值;若事务A回滚,事务B基于脏数据操作将引发错误

不可重复读(Non-repeatable Read)‌

   定义‌:同一事务内多次读取同一数据,因其他事务已提交的修改导致结果不一致
   示例‌:事务A第一次查询余额为1000元,事务B修改为800元并提交后,事务A再次查询结果变为800元

幻读(Phantom Read)‌

   定义‌:同一事务内两次范围查询的结果行数不同,因其他事务插入或删除数据
   示例‌:事务A首次查询年龄>30的用户共10人,事务B新增1人后,事务A再次查询结果为11人

隔离级别测试:

数据库默认隔离级别查看: 

  • 查看全局默认隔离级别(5.7版本之前):SELECT @@global.tx_isolation;
  • 查看全局默认隔离级别(5.7版本之后):SELECT @@global.transaction_isolation;
  • 查看当前会话隔离级别(5.7版本之前):SELECT @@session.tx_isolation;
  • 查看当前会话隔离级别(5.7版本之后):SELECT @@session.transaction_isolation;

第一步:修改数据库隔离级别

SET [GLOBAL|SESSION} TRANSACTION ISOLATION LEVEL 
[READ UNCOMMITTED|READ COMMITTED|REPEATABLE READ|SERIALIZABLE]

第二步:设置手动提交

set autocommit = 0;

第三步:开启事务

start transaction;

第四步:测试业务

update t_person set sal = sal-500 where id = 1;update t_person set sal = sal+500 where id = 3;

 索引、优化、b+tree后续再了解。

python连接数据库

安装模块pymysql

第一步:导入模块

import pymysql

 第二步:创建连接

conn = pymysql.connect
(host='locohost', user='user', password='password', port=3306,database='database')

第三步:创建数据库对象

cursor = conn.cursor()

 第四步:执行sql语句

sql = "select * from emp"#通过数据库对象执行sql
cont = cursor.execute(sql)
#执行sql语句,返回查询结果的行数。
result = cursor.fetchall()
#执行 execute() 后查询的所有结果

第五步:关闭连接

cursor.close()
conn.close()

传参问题

  • 方式一:直接字符串拼接
    把变量(如 usernamepasswordid )拼接到 SQL 语句里,有严重 SQL 注入风险 ,比如用户输入恶意内容可篡改查询逻辑。
    示例:
    sql = 
    "select * from t_user where username = '"
    +username+
    "' and password = '"
    +password+
    "'"
    
  • 方式二:简单格式化拼接(仍有风险)
    用 % 做占位符拼接参数,看似规范但本质还是字符串拼接,仍可能被 SQL 注入 (如输入 lufei' or 1=1 -- 可绕过校验 )
    sql = "select * from t_user where username = '%s' and password = '%s'"%(username,password)
    
  • 方式三:参数化查询(推荐)
    用 %s 做占位符,但实际执行时由数据库驱动自动处理参数转义,可有效避免 SQL 注入 ,是安全的传参方式
    sql = "select * from t_user where username = %(name)s and password = %(pwd)s" 
    cursor.execute(sql, {"name": username, "pwd": password})
    

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

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

相关文章

Windows 10/11 磁盘清理操作指南:彻底解决系统盘空间不足问题

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家、CSDN平台优质创作者&#xff0c;高级开发工程师&#xff0c;数学专业&#xff0c;10年以上C/C, C#,Java等多种编程语言开发经验&#xff0c;拥有高级工程师证书&#xff1b;擅长C/C、C#等开发语言&#xff0c;熟悉Java常用开发…

b-up:Enzo_Mi:深度学习基础知识

1.最近邻差值&#xff08;Neareast Neighbor Interpolation&#xff09; 插值算法 &#xff5c; 最近邻插值法_哔哩哔哩_bilibili 上图中最后一行&#xff0c;第一个图像&#xff0c;因为目标像素&#xff08;放大后&#xff0c;位于第1行第0列的像素&#xff09;距离它最近的…

微信小程序商品结算功能

整体结算流程概述微信小程序的商品结算涉及前端交互、API调用和数据管理。典型流程包括&#xff1a;用户交互&#xff1a;用户选择商品、填写地址和时间。数据获取&#xff1a;从小程序缓存或后端服务器获取订单信息。逻辑处理&#xff1a;验证参数、应用红包折扣。提交订单&am…

2025年7月份最新一区算法——向光生长算法

注&#xff1a;该算法已按照智能优化算法APP标准格式进行整改&#xff0c;可直接集成到APP中&#xff0c;方便大家与自己的算法进行对比。&#xff08;近期智能优化算法APP将会迎来超级大更新&#xff01;请时刻保持关注哦&#xff01;&#xff09;向光生长算法&#xff08;Pho…

脚手架新建Vue2/Vue3项目时,项目文件内容的区别

一. package.json vue版本号不同vue2中会多一个依赖&#xff1a;vue-template-compiler&#xff0c;作用是预编译Vue2模板为渲染函数&#xff0c;减少运行时开销。vue-template-compiler与vue版本要保持一致&#xff0c;否则会报错。eslintConfig中的extends不同 eslintConfig…

微信小程序入门实例_____从零开始 开发一个每天记账的微信小程序

在前面的微信小程序实例中我们开发了体重记录等实用小程序&#xff0c;今天来尝试一个和生活消费紧密相关的 ——“每日记账小程序”。它能帮你随时记录收支情况&#xff0c;让每一笔花费都清晰可查。下面就跟着步骤&#xff0c;一步步构建这个小程序。​体验一个开发者的快乐。…

2026python实战——如何利用海外代理ip爬取海外数据

家人们&#xff01;随着跨境电商的发展&#xff0c;是不是越来越多的小伙伴们也开始搞海外的数据分析了&#xff1f;不过虽然我们已经整天爬虫、数据采集打交道了&#xff0c;但一到海外数据&#xff0c;还是有不少人掉进坑里。你们是不是也遇到过以下情况&#xff1a;花了一堆…

Spring Boot启动原理:从main方法到内嵌Tomcat的全过程

Spring Boot的启动过程是一个精心设计的自动化流程&#xff0c;下面我将详细阐述从main方法开始到内嵌Tomcat启动的全过程。 1. 入口&#xff1a;main方法 一切始于一个简单的main方法&#xff1a; SpringBootApplication public class MyApplication {public static void m…

小白学Python,网络爬虫篇(1)——requests库

目录 一、网络爬虫的介绍 1.网络爬虫库 2.robots.txt 规则 二、requests 库和网页源代码 1.requests 库的安装 2.网页源代码 三、获取网页资源 1.get () 函数 &#xff08;1&#xff09;get() 搜索信息 &#xff08;2&#xff09;get() 添加信息 2.返回 Response 对象…

平板可以用来办公吗?从文档处理到创意创作的全面测评

在快节奏的现代职场&#xff0c;一个核心疑问始终萦绕在追求效率的职场人心中&#xff1a;平板电脑&#xff0c;这个轻薄便携的设备&#xff0c;真的能替代笔记本电脑&#xff0c;成为值得信赖的办公伙伴吗&#xff1f; 答案并非简单的“是”或“否”&#xff0c;而是一个充满潜…

docker gitlab 备份 恢复 版本升级(16.1.1到18.2.0)

docker 启动 # 在线 docker pull gitlab/gitlab-ce:latest # 离线 docker save -o gitlab-ce-latest.tar gitlab/gitlab-ce:latest docker load -i gitlab-ce-latest.tardocker run --detach \--publish 8021:80 --publish 8023:22 \ --name gitlab_test \--restart always \-…

web3 区块链技术与用

#53 敲点算法题 瑞吉外卖day4 调整心态 睡眠 及精神 web3 以下是应北京大学肖臻老师《区块链技术与用》公开课的完整教学大纲&#xff0c;综合课程内容、技术模块及前沿扩展&#xff0c;分为核心章节与专题拓展两部分&#xff0c;引用自公开课资料及学员笔记。 &#x1f4…

Redis1:高并发与微服务中的键值存储利器

redis中存储的数据格式为键值对&#xff08;Key,Value&#xff09;在高并发的项目和微服务的项目会频繁的用到redisNoSQL型数据库1.初始Redis1.1认识NoSQLSQL&#xff1a;structure query language关系型数据库结构化&#xff1a;有固定格式要求&#xff08;表关系&#xff0c;…

/字符串/

字符串 个人模板 5. 最长回文子串 93. 复原 IP 地址 43. 字符串相乘 227. 基本计算器 II

我的开发日志:随机数小程序

文章目录前言UI设计代码前言 为什么我要设计这个程序呢&#xff1f;因为我要用&#xff0c;懒得在网上下载了&#xff0c;于是干脆写了一个。 UI设计 UI是我凹出来的&#xff0c;你们要使用&#xff0c;直接新建一个UI.ui文件&#xff0c;然后把下面的东西输进去就可以了。 …

《Oracle SQL:使用 RTRIM 和 TO_CHAR 函数格式化数字并移除多余小数点》

select RTRIM(to_char(1222.11123344,fm9999990.9999),.) from dual 这条 SQL 语句主要用于对数字进行格式化处理&#xff0c;并移除格式化结果右侧多余的小数点。下面将详细拆解该语句的执行过程和各部分作用。语句详细拆解1. to_char(1222.11123344,fm9999990.9999)函数功能&…

「Java案例」方法重装求不同类型数的立方

利用方法重装实现不同类型数值的立方计算 立方计算方法的重载实现 编写一个程序,要求编写重载方法xxx cube(xxx value)实现对不同类型数值计算立方。 # 源文件保存为“CubeCalculator.java” public class CubeCalculator {public static void main(String[] args) {// 测试…

API 接口开发与接入实践:自动化采集淘宝商品数据

在电商数据分析、价格监控等场景中&#xff0c;自动化采集淘宝商品数据具有重要价值。本文将详细介绍如何通过 API 接口开发实现淘宝商品数据的自动化采集&#xff0c;包含完整的技术方案和代码实现。 一、淘宝 API 接入基础 1. 接入流程概述 注册淘宝账号获取 ApiKey 和 Ap…

python-pptx 的layout 布局

一、布局基础概念 在 PowerPoint 中&#xff0c;布局&#xff08;Layout&#xff09; 决定了幻灯片的占位符&#xff08;如标题、内容、图片等&#xff09;的排列方式。python-pptx 提供了对布局的编程控制。二、默认布局类型及索引 通过 prs.slide_layouts[index] 访问&#x…

服务器mysql数据的简单备份脚本

服务器mysql数据的简单备份脚本 一个小型项目mysql数据库数据的定时备份 通过crontab定时执行脚本: 0 1 * * * /home/yuyu/mysqlbak.sh备份文件加入时间戳,防止覆盖支持删除超过x天的备份数据文件&#xff0c;防止备份数据文件太多 #!/bin/bash# 配置变量 DB_HOST"127.0.…