Oracle和Mysql数据库

数据库

Oracle 体系结构与基本概念

体系结构

Oracle服务器 :是一个数据管理系统(RDBMS),它提供开放的、 全面的、近乎完整的信息管理。由1个数据库和一个(或多个)实例组成。数据库位于硬盘上,实例位于内存中。

基本概念

表空间(users)和数据文件

1:n(表空间:数据文件)

逻辑概念:表空间由多个数据文件组成。位于实例上,在内存中。

物理概念:数据文件,位于硬盘之上。(C:\app\Administrator\oradata\orcl目录内后缀为.DBF的文件)

一个表空间可以包含一个或者是多个数据文件。

/home/oracle/app/oradata/orcl

段、区、块

段存在于表空间中;段是区的集合;区是数据块的集合;数据块会被映射到磁盘块。

Oracle数据库的基本元素

  • 方案schema
    方案就是一个集合,包含多个表(tables)、视图(views)、序列(sequences)、存储过程(store procudures)、索引(indexes)、同义词(synonyms)。
    oracle中每个用户都对应一个方案,方案名就是用户名。
  • 表table
    表示存储数据的逻辑容器,类似excel多行多列的表格。表创建的时候要定义它的每一列的列名以及该列的数据类型。(如:name char(10),表示定义列名为name类型为字符串型)
    创建表之后才可以往里边添加数据。
  • 视图view
    从多张表或者其他视图提取出用户所关心数据的一张虚表
  • 存储过程
    一组为了完成特定功能的SQL 语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译。
  • 序列sequence
    是oracle提供的用于产生一系列唯一数字的数据库对象。
  • 索引index
    用于加快数据的检索,类似于书籍的索引。
  • 同义词synonyms
    别名的意思,和视图的功能类似。就是一种映射关系。

Oracle数据库启动和关闭

前提条件: 使用Oracle用户登录Linux操作系统
[root@localhost ~]# su - oracle

数据库管理员用户:

用户名:sys

密 码:sys

Oracle数据库启动

第一步: 通过数据库管理员登录Oracle数据库
[oracle@localhost ~]$ sqlplus / as sysdba;

第二步: 启动Oracle数据库
SQL> startup

第三步: 启动监听服务

SQL> quit
[oracle@localhost ~]$ lsnrctl start

Oracle数据库关闭

第一步: 通过数据库管理员登录Oracle数据库
[oracle@localhost ~]$ sqlplus / as sysdba;

第二步: 关闭Oracle数据库

SQL> shutdown immediate

第三步: 关闭监听服务
SQL> quit
[oracle@localhost ~]$ lsnrctl stop

Sqlplus

Oracle的sqlplus是与oracle数据库进行交互的客户端工具 ,借助sqlplus可以查看、修改数据库记录 。在sqlplus中,可以运行sqlplus命令与sql语句

Sqlplus命令是用来修改以及调整sqlplus工具的命令。

Sql语句是用来让服务器执行相关动作的命令。

sqlplus 登录数据库管理系统

前提条件是Oracle数据库必须启动。

使用sqlplus登录Oracle数据库

sqlplus 用户名/密码
[oracle@localhost ~]$ sqlplus scott/11

远程登录

sqlplus 用户名/密码@//ip/实例名 ↙

远程登录oracle服务器方式,如(sqlplus scott/11@//192.168.161.130/orcl)

解锁用户

[oracle@localhost ~]$ sqlplus / as sysdba;
SQL> alter user scott account unlock;

修改用户密码

[oracle@localhost ~]$ sqlplus / as sysdba;
SQL> alter user scott identified by 11;

查看当前语言环境

SQL> select userenv('language') from dual;

sqlplus基本操作

前提条件是使用scott用户登录

oracle@localhost \~\]$ sqlplus scott/11 #### 显示当前用户 SQL\> show user ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/9312c6f0123fb884408d28d7a12ec45b.webp) #### 查看当前用户下的表 `SQL> select *from tab; ` ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/8a278e80f193cfa785ad20b4f7f96d9a.webp) #### 查看员工表的结构 `SQL> desc dept;` ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/114a65ce02fe2b323fe3995378dcc275.webp) #### 设置行宽 默认显示不好看,因此需要设置行宽。 ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/7fbdd106f77b69a5547049dcf7e7eb7a.webp)`SQL> set linesize 140; ` ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/5436bc1a81b7c627a012800fa999e246.webp) #### 设置页大小 `SQL> set pagesize 100;` ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/4ac707b7cb2efea7e4422d83865c1a2d.webp) #### 永久设置行宽、页宽 ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/582d6d88ed9adba5dac564a32daeb8e0.webp) ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/7980317004bea46885797b91a9ea1b6a.webp) 永久设置edit打开为gedit。 ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/dd783490749564743b68e03472bcbb77.webp) #### 设置员工ename的列宽 ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/56e932a13d10dde802e600f3ccd890a3.webp) `SQL> col ename for a6` (a表示字符串) ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/27480edec3eb164ff22d18b9c04ddebf.webp) #### 设置薪水的列宽 `col sal for 9999`(一个9表示一位数字) ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/5ce669ce9621489fd39083ed4da3cb8d.webp) ### Oracle默认方案 安装oracle数据库默认会自动创建scott和hr两个用户以及其方案,这些都是oracle提供给我们学习和练习的数据,我们直接在上边练习就好。 #### scott方案 ##### 业务场景 Scott(斯科特)是一家软件公司的数据分析师,公司为其提供专门的数据库管理账号以及方案。 公司有总裁一名(president)、经理(manager)、店员(clerk)、销售专员(salesman),分析师(analyst)若干。 公司设置有多个部门:会计部(accounting)、研发部(researching)、销售部(sales)。 ##### 根据公司业务抽离出的表 * 员工信息表EMP(Employee) * 部门表DEPT(Department) * 工资等级表(SALGRADE) * 奖金表(BONUS) ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/15681ff48be2c7cf7fd67b0046a3c77d.webp) grade: 薪水等级 losal: 最低薪水 hisal: 最高薪水 ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/c029d364523c755dfa6dbb46ef95d1b8.webp) deptno: 部门编号 dname: 部门名称 loc: 部门位置 ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/30cc8f6e70ce2c7eaef1a0c2dba8d694.webp) empno: 员工编号 ename: 员工姓名 job: 员工工种 mgr: 员工上司 hiredate: 雇佣日期 sal: 员工薪水 comm: 员工奖金 deptno: 员工部门编号 ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/a1ca9c7ffac6166c7a2710db210c01d4.webp) #### hr方案 ![0](https://file.jishuzhan.net/article/1753850775194308610/2d3dd1cf75841eddf8ed61c20d93b5a0.webp) ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/73b446ae25a744dfc0a9a1b7a551267c.webp) ## SQL 结构化查询语言(Structured Query Language)简称SQL,是对数据库进行增、删、查、改等操作的语言。 SQL 是1986年10 月由美国国家标准局(ANSI)通过的数据库语言美国标准,接着,国际标准化组织(ISO)颁布了SQL正式国际标准。1989年4月,ISO提出了具有完整性特征的SQL89标准,1992年11月又公布了SQL92标准. **各种不同的数据库对SQL语言的支持与标准存在着细微的不同,这是因为,有的产品的开发先于标准的公布,另外,各产品开发商为了达到特殊的性能或新的特性,需要对标准进行扩展。** ### SQL语言的类型 #### DML 数据库中,称呼增删改查,为DML语句。(Data Manipulation Language 数据操纵语言),如: 增 insert 删 delete 改 update 查 select #### DDL 数据定义语言(Data Definition Language)。如: create table(创建表) alter table(修改表) truncate table(清空表) drop table(删除表) create view(视图) create index(索引) create sequence(序列) create synonym(同义词) #### DCL 数据控制语言(Data Control Language)。如: commit(提交) rollback(回滚) ### 基本 SELECT 语句 基本语法格式为: ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/14a49dab3219dd2502f8175f3ff603e4.webp) 语法描述说明: 花括号{}括起的部分为必填部分。 中括号\[\]括起来的部分为可选部分。 多种形式的语法用竖线\|来表示并列单选,或者的意思。 SQL语句使用注意事项: * SQL 语言大小写不敏感。 * SQL 可以写在一行或者多行,以分号;作为一条sql语句的结束标志。 * 关键字不能被缩写也不能分行。 * 各子句一般要分行写。 * 使用缩进提高语句的可读性。 #### 查询案例 ##### 查询员工号、姓名、薪水 ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/cb96be33165fe2e41d0f10d48a7b345a.webp) 增加查询年薪(使用表达式) ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/c40d307235bde2882e0e03ffa5937193.webp) ##### 别名:as ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/cdcbc15c7c60642635c5e05278836afb.webp) 解决乱码问题,修改系统字符集。 ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/ffea226b0f43f015b28a43678a9f227e.webp) [解决方法](https://blog.csdn.net/lqx0405/article/details/44776733) ##### DISTINCT关键字 去除结果集重复的行。 ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/b7cda57d47a86831cfa51bc38cf03f7e.webp) ##### 算数运算 + - \* / 和 NULL值 * 乘除的优先级高于加减 * 优先级相同时,按照从左至右运算 * 可以使用括号改变优先级 查询: 员工号、姓名、月薪、年薪、奖金、年收入。 ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/1b7d870f131da4b5dd5f061f0b109664.webp) 结果不正确。没有奖金的员工,年收入不正确。 **NULL值问题:** **包含NULL值的表达式都为空。** **NULL != NULL** 任何算数运算碰到NULL值都变成NULL,任何逻辑运算碰到NULL值都变成假 `解决:滤空函数:nvl(a, b) 如果a为NULL, 函数返回b。所以:sal * 12 + nvl(comm, 0) 年收入。` ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/f795e92809e677d2e76cc81648dc5ff2.webp) NULL != NULL举例: ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/7ab62a200397df5ef4e6982d2dddcbde.webp) 在SQL中,判断一值是否等于另外一值不用"=" 和"!="而使用is和is not。 ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/72922ee056cdba08a0d9a3c50a9df0ed.webp) #### 过滤和排序数据 ##### where条件过滤 ###### 查询10号部门的员工信息 ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/5e902eadadeb92b48ab544cb27698932.webp) ###### 查询"KING"的信息 ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/aed15bcad169fcbec3011a85419ac87e.webp) ###### 修改系统当前日期格式 查询入职日期为1981年11月17日的员工: ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/9b97e63849e7393d51ee4e6091a5d795.webp) 查看系统当前的日期格式: ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/4822f8b7b524a15fb592a61a395e67ab.webp) 获取系统当前日期格式: `SQL> select * from v$nls_parameters`![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/a6ab88beef5f4b576aba01b356e870b2.webp) 修改日期格式: ` SQL> alter session set NLS_DATE_FORMAT = 'yyyy-mm-dd '` ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/a9de7cb73c64118163852a3aaac77f37.webp) 再次查询: ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/ead6bb188346ebee2aa04f1751379658.webp) **改回系统默认格式:SQL\> alter session set NLS_DATE_FORMAT = 'DD-MON-RR';** ###### 比较运算 普通比较运算符: | | | |------------|------------------| | = 等于(不是==) | \> 大于 | | \>= 大于等于 | \< 小于 | | \<= 小于等于 | \<\> 不等于(也可以是!=) | 查询薪水不等于1250的员工信息: ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/da3bd9bb17c3ddd7f0889a0f015aae86.webp) 查询工资在1000-2000之间的员工: ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/b6a2840086de74b7d1158c8151f90b8d.webp) ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/4575bb2cd29cadd548994afd90996b14.webp) 查询81年2月至82年2月入职的员工信息: ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/c5d610b9fc829b64de767ea5dd7129a7.webp) **IN:在集合中。(not in 不在集合中)** ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/0bebab10d3a62d8279ab2f42ecb78c18.webp) 查询部门号为10或20的员工信息: ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/3db0be3ef1b1b53fbf1409bd81936a18.webp) ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/28d5d492b505a3e496ba36247a9a8441.webp) ###### like:模糊查询 '%'匹配任意多个字符。 '_'匹配一个字符。 查询名字以S开头的员工: ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/5332b2d45a7fb1f4785a4128df92f923.webp) 查询名字是4个字的员工: ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/5ed5112066922dc9629a4b10293a35e1.webp) **转义字符:** 增加测试例子:向表中插入员工: SQL\> insert into emp(empno, ename, sal, deptno) values(1001, ' TOM_ABC ', 3000, 10) 查询名字中包含_的员工: `SQL> select * from emp where ename like '%\_% ' escape '\'; ` ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/0b240cbb2ccb366daa8bd150119b236c.webp) **转义单引号本身:** `SQL> select 'hello '' world' from dual;` 使用两个单引号来完成转义。 ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/8b79f0c36be29308901afabe93e101ce.webp) ###### 逻辑运算 AND 逻辑与 OR 逻辑或 NOT 逻辑非 如果 ......where 表达式1 and 表达式2; ......where 表达式2 and 表达式1; 这两句SQL语句功能一样吗?效率一样吗? SQL在解析where的时候,是从右至左解析的。 所以and时应该将易假的值放在右侧,or时应该将易真的值放在右侧。 ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/b110846ce570dcb8858c01765763e86d.webp) ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/366e5d52eb83832989c07320743f48ff.webp) ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/3979a1c5cbaad00ed1d8eef34acd9e63.webp) ##### order by 排序 > order by + 列名,表达式,别名,序号。 注意:语法要求order by 子句应放在select的结尾。 ###### 使用 ORDER BY 子句排序 • ASC(ascend): 升序。默认采用升序方式。 • DESC(descend): 降序 查询员工信息,按月薪排序: ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/118488263fcc6cb4edbf9f5a15d4cb83.webp) order by后有多列时,列名之间用逗号隔分,order by会同时作用于多列。 ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/890c9f81540fa4516e2e9b5aeee2d03c.webp) ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/5abc9d8f0a6360c72ec2c8aa4ef7eebb.webp) desc 只作用于最近的一列,两列都要降序排,则需要两个desc。即: ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/7a0a397c05ae53421db947cd67853942.webp) order by + 列名,表达式,别名,序号。 ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/5fdf33e352f371658cd41fb72bc50ec6.webp) ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/c63970547e3aee3c3ab3b267badc94ce.webp) ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/c3191465db4e09f8c35a0b803fe44966.webp) 查询员工信息, 按奖金由高到低排序: ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/37f6a084c510b857c2697d21f3a76833.webp) 结果前面的值为NULL, 数据在后面,如果是一个100页的报表,这样显示肯定不正确。较为人性化的显示应该将空值放在最后, 即: ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/bd54960774a0b52746dca2151cf16b27.webp) **排序的规则** * 可以按照select语句中的列名排序 * 可以按照别名列名排序 * 可以按照select语句中的列名的顺序值排序 * 如果要按照多列进行排序,则规则是先按照第一列排序,如果相同,则按照第二列排序;以此类推 #### 单行函数 单行函数:只对一行数据进行计算,产生一个结果。函数可以没有参数,但必须要有返回值。如:concat、nvl * 操作数据对象 hello world * 接受参数返回一个结果 * 只对一行进行变换 * 每行返回一个结果 * 可以转换数据类型 * 可以嵌套 * 参数可以是一列或一个值 ##### 字符函数 操作对象是字符串。 大致可分为两大类:一类是大小写控制函数,主要有 lower 转小写 ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/8acb0a3d15488061237d2c0581dfad4f.webp) upper 转大写 ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/1113769e70296c33ad0ab2b4b2f949ac.webp) initcap 首字母大写 ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/3c256258462ed866d31207077451cc86.webp) 另一类是字符控制函数:有CONCAT、SUBSTR、LENGTH/LENGTHB、INSTR、LPAD \| RPAD、TRIM、REPLACE concat(a,b):连接字符串a和b,只能连接两个 ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/9ab45353f29c64d35e38acc94dc3e791.webp) **注意:SQL双引号""表示别名,使用''来表示字符串。** 另一种连接字符串的方法,使用\|\|,可以做到多个字符串连接 ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/8e4f73f746bdffccedcef111e17a2319.webp) ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/8074d51b811fde28a006ae9812be5570.webp) substr(a, b):从a中,第b位开始取(计数从1开始),取到结尾。 ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/361de7cb50b17a0f2bc46ccc3d16eb36.webp) substr(a, b, c):从a中,第b位开始,向右取c位。 ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/e281505e3e0e532947bb041114755b1c.webp) length:字符数, lengthb:字节数 ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/5aa26e11be930b0e00817f7cfa5c3f59.webp) instr:在母串中查找子串, 找到返回下标,计数从1开始。没有返回0 ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/4c3515d877933016376a4145815db496.webp) lpad:左填充,参1:待填充的字符串,参2:填充后字符串的总长度(字节), 参3:填充什么 rpad:右填充。 ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/40b4cfbc59775154772597377eb05afb.webp) trim:去掉前后指定的字符 ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/717ee93c32daebb77ec7cf7f8b4f3259.webp) ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/6b3e409a489510006320434ac428800f.webp) replace:替换 ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/e0ca9847a32a4dae632f6fc9db553e1b.webp) ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/206dee22e8def30b8c1d7059e451b4d9.webp) ##### 数值函数 ROUND: 四舍五入 ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/4f1a56e05366a0fcb2ff5141a321ed86.webp) TRUNC: 截断 ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/0ea9bed5d1f9443194ba8cd2c3b29197.webp) MOD: 求余 ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/874555786b99b0b80e0d07f366f4f814.webp) ##### 时间函数 在Oracle中日期型的数据,既有日期部分,也有时间部分。下一节介绍日期部分。 ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/bf6a440209861696ffdd1237177c05ec.webp) 显示 昨天、今天、明天: ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/1179dba61b8a560be67b57ef8525a6f5.webp) 计算员工的工龄: ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/c7f9c0ec56c7d2e9cdb4c3c76ce1bdec.webp) ##### 日期函数 上面求取员工工龄的结果不精确,如果想将其算准确,可以使用日期函数来做。 months_between:两个日期值相差的月数(精确值) 跟between...and无关 ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/8eeb1e4c36357de8225214aa386fa0d3.webp) add_months:在某个日期值上,加上多少的月,正数向后计算,负数向前计算。 ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/1f327d58d39b000c63567f31734eab40.webp) last_day:日期所在月的最后一天。 ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/aecc277bbf929c4b2f134817f82ed60f.webp) next_day:指定日期的下一个日期 ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/e008983e77adc1b5608e4c19cf100503.webp) ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/6023552656fec9a84bc67788dd0aff08.webp) ##### 转换函数 在不同的数据类型之间完成转换。将"123" 转换为 123。有隐式转换和显式转换之分。 隐式转换: ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/b3070371f550987fae2700edfafe9d40.webp) 显式转换: ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/e1c05372c6af028fb431e338bcd566a7.webp) 隐式转换的前提条件是:被转换的对象是可以转换的。 ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/811b64d1f1eddaa9f57de9db3529190b.webp) 显示转换:借助to_char(数据,格式)、to_number、to_date函数来完成转换。 ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/048366edac9854f6717f96259426bb38.webp) ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/09c025c755217050c19b46ce06b35621.webp) ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/4e9e82f3c50c2637ca054d3272604d35.webp) 如果隐式转换和显示转换都可以使用,应该首选哪个呢? **SQL优化:如果隐式、显式都可以使用,应该首选显式,这样可以省去Oracle的解析过程。** 在固定的格式里加入自定义的格式,是可以的,必须要加""。 ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/f257a472c84f8371d2fbdbeee40b0dab.webp) 反向操作:已知字符串"2024-2-1 18:30:20 "转化成日期。 ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/5b66edfd9fc474fd8f0307975c3f3ba0.webp) ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/ee0463907f54c3d08d94edd78e01a017.webp) 查询员工的薪水:2位小数, 本地货币代码, 千位符 ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/296cdd4b23064658ccd246861bb32931.webp) 将$2,975.00转化成数字: ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/bac72a93e90ca1e161506c19d4ef40ed.webp) ##### 通用函数 这些函数适用于任何数据类型,同时也适用于空值: * NVL (expr1, expr2) ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/568eb265e4bfbea29537a4d58ebe89f5.webp) * NVL2 (expr1, expr2, expr3) * NULLIF (expr1, expr2) * COALESCE (expr1, expr2, ..., exprn) nvl2: 是nvl函数的增强版。 nvl2(a, b, c) 当a = null 返回 c, 否则返回b。 ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/7c868988186952d83459701950d646f8.webp) nullif: nullif(a, b) 当 a = b 时返回null, 不相等的时候返回a值。 ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/55d8a19f8921f5eedf0b7a483a023f46.webp) coalesce: coalesce(a, b, c, ..., n) 从左向右找参数中第一个不为空的值。 ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/058c7508546173d659affeb6d2cfc222.webp) ##### 条件表达式 例子:老板打算给员工涨工资, 要求: 总裁(PRESIDENT)涨1000,经理(MANAGER)涨800,其他人涨400。请将涨前、涨后的薪水列出。 但是在SQL中无法实现if else 逻辑。当有这种需求的时候,可以使用case 或者 decode case: 是一个表达式,其语法为: ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/0b33a6e5295f29795473adc3010f469f.webp) ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/135b8b69f8e25019a8e26fed616fbeef.webp) ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/2a533f23cc156899e1722911e0f01b8c.webp) decode:是一个函数,其语法为: ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/ddb8431d5ffae75cddb524da08dcd951.webp) ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/8baab31aa89e217be45d85d9b72d1688.webp) ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/d325beab28483ae74b94eaef9fc9020f.webp) #### 分组函数 分组函数作用于一组数据,并对一组数据返回一个值。 如:AVG、COUNT、MAX、MIN、SUM操作的是一组数据,返回一个结果。 求员工的工资总额: ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/0fe56d5eea2e7c4215e14597b25294b0.webp) 员工人数: ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/40b6b39c955294b0335cf262c12a5289.webp) 平均工资: ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/e84ca175190e4e6b3addf9ed7b7bd71c.webp) **求员工的平均奖金:** ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/9017c5f364c8258ab0e73c4cd654717a.webp) **☆NULL空值:组函数都有自动滤空功能(忽略空值),所以:** ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/5de5bcf174f2b501b7508e7e3d0bfb55.webp) 如何屏蔽 组函数 的滤空功能: ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/6c05e2b6b8a821a307078d3f799cd9ca.webp) 但是实际应用中,结果为14和结果为4都有可能对,看问题本身是否要求统计空值。 count函数:求个数,如果要求不重复的个数,使用distinct。 求emp表中的工种: ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/9a9d284e444c93fc68328e6047fdc28e.webp) ##### 分组数据 group by 按照group by 后给定的表达式,将from后面的table进行分组。针对每一组,使用组函数。 ###### 查询"部门"的平均工资 ` SQL> select deptno,avg(sal)from emp group by deptno;` ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/c7f9903d9e295dc1acb92c25c7234603.webp) 上述SQL语句可以抽象成:select a, 组函数(x) from 表 group by a; 这样的格式。 如果select a, b 组函数(x) ...... group by 应该怎么写? 注意:在SELECT 列表中所有**没有包含在组函数中的列,都必须在group by的后面出现** 。所以上问应该写成group by a, b;没有b语法就会出错,不会执行SQL语句。**但,反之可以。group by a,b,c; c可以不出现在select语句中。** ###### group by后面有多列的情况 `SQL> select deptno,job,avg(sal) from emp group by deptno,job order by 1;` 因为deptno, job 两列没有在组函数里面,所以必须同时在group by后面。 该SQL的语义:按部门,不同的职位统计平均工资。先按第一列分组,如果第一列相同,再按第二列分组。 所以查询结果中,同一部门中没有重复的职位。 ##### having 使用 HAVING 过滤分组: 1. 行已经被分组。 2. 使用了组函数。 3. 满足HAVING 子句中条件的分组将被显示。 语法: ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/b0475a5a939e9d0d764538f83d1bb91a.webp) ###### 查询平均薪水大于2000的部门 分析:该问题实际上是在分组的基础上过滤分组。 `SQL> select deptno,avg(sal) from emp group by deptno having avg(sal) > 2000;` ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/ffbad213f00f52f41531aea45720ae16.webp) `注意:` **不能在 WHERE 子句中使用组函数。 可以在 HAVING 子句中使用组函数。** 从功能上讲,where和having都是将满足条件的结果进行过滤。但是差别是where子句中不能使用 组函数!所以上句中的having不可以使用where代替。 ###### 求10号部门的平均工资 ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/d3b112654dc721804f07328663cfcfe3.webp) 在子句中没有使用组函数的情况下,where、having都可以,应该怎么选择? SQL优化: 尽量采用where。 如果有分组的话,where是先过滤再分组,而having是先分组再过滤。当数据量庞大如1亿条,where优势明显。 #### 多表查询 多表查询的过程中其实就会构造多个表的一个笛卡尔积。 ##### 笛卡尔积 笛卡尔积就是两个集合的乘积计算,其实跟我们普通的乘法分配律相像,不过是作用于集合: 如果有一个集合M(a,b) 和集合N(c,d) , 那么集合的乘积 M x N = (a,b) x (c,d)= ( a x (c,d), b x (c,d) ) = ( ac,ad,bc,bd) 具体到我们的数据库表如下: ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/0e9d70a9692048e769028e7e0c55c4f9.webp) **笛卡尔积的行数 = table1的行数 x table2的行数 笛卡尔积的列数 = table1的列数 + table2的列数** 比如: select \* from emp,dept; 会得到如下的一个表 ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/009f103493d3d318fd26fdd997cf41e2.webp) **多表查询就是按照给定条件(连接条件),从笛卡尔全集中选出正确的结果。** 比如上图理应该两个deptno 相同的数据才是有意义的数据。 根据连接条件的不同可以划分为:等值链接、不等值链接、外链接、自连接 。 ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/4699ed23d6c68913eba83b0f728f626b.webp) ##### 等值连接 从概念上,区分等值连接和不等值连接非常简单,只需要辨别where子句后面的条件,是"="为等值连接。不是"="为不等值连接。 查询员工信息:员工号 姓名 月薪和部门名称 通常在进行多表查询的时,会给表起一个别名,使用"别名.列名"的方式来获取数据,直接使用"表名.列名"语法上是允许的,但是实际很少这样用。 ` SQL> select e.empno,e.ename,e.sal,e.deptno,d.dname,d.deptno from emp e , dept d where e.deptno= d.deptno;` ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/c4cea4961a93c7c61dbdb5d05ced277a.webp) 如果:select e.empno, e.ename, e.sal, e.deptno, d.dname, d.deptno from emp e, dept d; 直接得到的是笛卡尔全集。其中有错误结果。所以应该加 where 条件进行过滤。 如果有N个表,where后面的条件至少应该有N-1个。 ##### 不等值连接 将上面的问题稍微调整下,查询员工信息:员工号 姓名 月薪 和 薪水级别(salgrade表) 分析: ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/bffcad2b478494f23a0fac1dbf0876eb.webp) 看到员工总的薪水级别,共有5级,员工的薪水级别应该满足 \>=当前级别的下限,\<=该级别的上限: ` SQL> select e.empno,e.ename,e.sal,s.grade from emp e,salgrade s where e.sal between s.losal and s.hisal;` ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/ea3beda404684c30e1f25948cb17a545.webp) ##### 外连接 按部门统计员工人数,显示如下信息: 部门号 部门名称 人数 分析: 人数:一定是在emp表中,使用count()函数统计emp表中任一非空列均可。 部门名称:在dept表dname中,直接读取即可。 部门号:任意,两张表都有。 ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/fcc995686e731e9c2beacdf6965a2d61.webp) 注意:由于使用了组函数count(),所以组函数外的d.deptno和d.dname必须放到group by后。 但是select \* from dept发现40号部门没有显示出来,原因是40号部门没有员工,where没满足。结果不对,40号部门没有员工,应该在40号部门位置显示0。 ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/90b1167f93aab79e49f09b5fdf8508c1.webp) 我们希望: 在最后的结果中,包含某些对于where条件来说不成立的记录 (**外连接的作用)** 左外连接:当 where e.deptno=d.deptno 不成立的时候,=左边所表示的信息,仍然被包含。 写法:与叫法相反:where e.deptno=d.deptno(+) 右外连接:当 where e.deptno=d.deptno 不成立的时候,=右边所表示的信息,仍然被包含。 写法:依然与叫法相反:where e.deptno(+)=d.deptno 以上我们希望将没有员工的部门仍然包含到查询的结果当中。因此应该使用外链接的语法。 右外链接写法 ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/3ad0f6412d62c4caba4f3a7aef8c4902.webp) 左外链接写法 ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/181088aa22c5e73e70196c45e48edfd9.webp) ##### 自连接 **核心,通过表的别名,将同一张表视为多张表。** 查询员工信息:xxx的主管是 yyy ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/ff1c0c2f43c0863d2f35691758109d7e.webp) ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/a8ed5aa46db13af719f25c0db4e0473c.webp) 可是观察结果我们发现,老板KING没有,老板KING的上司应该是老板KING。 因此使用左自连接,当条件不满足,=左边所表示的信息,仍然被包含。 ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/63cfd46b7e89a307aa1a16ea2341a53d.webp) #### 子查询 子查询语法很简单,就是select 语句的嵌套使用。 查询工资比SCOTT高的员工信息: 分析:两步即可完成 1.查出SCOTT的工资 SQL\> select ename, sal from emp where ename='SCOTT' ,其工资为3000。 2.查询比3000高的员工 SQL\> select \* from emp where sal\>3000 通过两步可以将问题结果得到。子查询,可以将两步合成一步。 `------子查询解决的问题:问题本身不能一步求解的情况。 ` ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/6ce5ec6309d211378cd02a7e5ca06904.webp) 子查询语法格式: ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/a9b33ed44c72867296f1496493f761f7.webp) ##### 定义子查询需要注意的问题 1. 小括号( ) 2. 主查询和子查询可以是不同表,只要子查询返回的结果主查询可以使用即可 3. 可以在主查询的where、select、having、from后都可以放置子查询 4. 不可以在主查询的group by后面放置子查询 (SQL语句的语法规范) 5. 一般先执行子查询(内查询),再执行主查询(外查询);但是相关子查询除外 6. 一般不在子查询中使用order by, 但在Top-N分析问题中,必须使用order by 7. 单行子查询只能使用单行操作符;多行子查询只能使用多行操作符 8. 子查询中的null值 ##### 主、子查询在不同表间进行 查询部门名称是"SALES"的员工信息 ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/aa31167e24dd1edc549c835b6016974c.webp) 主查询:查询员工信息。select \* from emp; 子查询:负责得到部门名称(在dept表中)、部门号对应关系。select deptno from dept where dname='SALES' 主查询,查询的是员工表emp,子查询,查询的是部门表dept。是两张不同的表。 将该问题使用"多表查询"解决: ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/f48ee8a197d68b2420ae2a75e824af1a.webp) 两种方式哪种好呢? ※SQL优化: 理论上,既可以使用子查询,也可以使用多表查询,尽量使用"多表查询"。子查询有2次from,但是还得看数据量,如果数据量比较大,那么做多表查询产生的笛卡尔积也会相当庞大。 不同数据库处理数据的方式不尽相同,如Oracle数据库中,子查询地位比较重要,做了深入的优化。有可能实际看到结果是子查询快于多表查询。 ##### 在主查询的where select having from 放置子查询 子查询可以放在select后,但,要求该子查询必须是 单行子查询:(该子查询本身只返回一条记录,2+叫多行子查询)。 ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/607d991944fd2f9ce1c173108d79e932.webp) ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/b2a044e492a2f6d556dda91083a56f78.webp) ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/89ddf081b80bf2751efc7a8ea51dfda8.webp) ##### 在from后面放置的子查询 表,代表一个数据集合、查询结果(SQL)语句本身也代表一个集合。 查询员工的姓名、薪水和年薪: ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/9b7ca032e6b66aa8b2c6d45049912ec5.webp) 将select 语句放置到from后面,表示将select语句的结果,当成表来看待。这种查询方式在Oracle语句中使用比较频繁。 ##### 单行子查询只能使用单行操作符,多行子查询只能使用多行操作符 ###### 单行子查询 单行子查询就是该条子查询执行结束时,只返回一条记录(一行数据)。 使用单行操作符: =、\>、\>=、\<、\<=、\<\> ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/8dcb7c1e1f7796004c8d92344ec8b12c.webp) ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/39ea3ba88811d817efe2c5064111e6f9.webp) 也可以在having子句中使用: ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/6e82971df3ab0c08133f8b8985c163fc.webp) 上面的例子告诉我们: 1. 单行子查询,只能使用单行操作符(=号、\>号等) 2. 在一个主查询中可以有多个子查询。 3. 子查询里面可以嵌套多层子查询。 4. 子查询也可以使用组函数。子查询也是查询语句,适用于前面所有知识。 ###### 多行子查询 子查询返回2条记录以上就叫多行。 多行操作符有: IN:等于列表中的任意一个 ANY :和子查询返回的任意一个值比较 ALL:和子查询返回的所有值比较 IN(表示在集合中): 查询部门名称为SALES和ACCOUNTING的员工信息。 ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/f470942f0514b8497fc92ae64055ad23.webp) 使用 多表查询 来解决该问题: ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/86f024ad21313e61098d1c69a9825621.webp) ANY(表示和集合中的任意一个值比较): 查询薪水比30号部门任意一个员工高的员工信息: **SQL\> select \* from emp where sal \> (select sal from emp where deptno=30);** 正确吗? 这样是错的,子句返回多行结果。而'\>'是单行操作符。 ------应该将'\>'替换成'\> any' ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/a3ca08f3b74be67e0a66970e8f3b6680.webp) 实际上\>集合的任意一个值,就是大于集合的最小值。 ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/54012efa15a719ac5e8fe10c08b3b9d0.webp) ALL(表示和集合中的所有值比较): 查询薪水比30号部门所有员工高的员工信息。 ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/df54bc8af9ad91a791d3669e9b54977a.webp) ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/7f9da45a6732d460f6172a6d05553fde.webp) ##### 子查询中null 判断一个值等于、不等于空,不能使用=和!=号,而应该使用is 和 not。 如果集合中有NULL值,不能使用not in。如: not in (10, 20, NULL),但是可以使用in。为什么呢? 先看一个例子: 查询不是老板的员工信息: 在emp表中有列mgr,该列表示该员工的上司的员工号是多少。那么,如果一个员工的这列是空值,那么说明这员工是老板。 ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/30d59c10182285802b94c09cacd04d0b.webp) ##### 一般不在子查询中使用order by 一般情况下,子查询使用order by或是不使用order by对主查询来说没有什么意义。子查询的结果给主查询当成集合来使用,所以没有必要将子查询order by。 但,在Top-N分析问题中,必须使用order by。 ##### 一般先执行子查询,再执行主查询 含有子查询的SQL语句执行的顺序是,先子后主。 但,相关子查询例外。 #### 集合运算 查询部门号是10和20的员工信息 思考有几种方式解决该问题 ? ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/39b69e26102d7d9b18c742d3952088c2.webp) ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/f4227f0502155227eec9423f26a47abb.webp) ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/a845faf5356172b218505a7df8cd6e93.webp) 还可以用集合运算 select \* from emp where deptno=10 加上 select \* from emp where deptno=20 集合运算所操作的对象是两个或者多个集合,而不再是表中的列(select一直在操作表中的列) ##### 集合运算符 集合运算的操作符。A∪B、A∩B、A -- B ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/14b3dbbf0a1acfa8444f5a02b98217fa.webp) ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/96db4ee161e8d1d47c079b649f50c537.webp) ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/90f339128b4e0ef3a0f6dcb562fbd953.webp) ###### 集合运算需要注意的问题 1.参与运算的各个集合必须列数相同,且类型一致。 2.采用第一个集合的表头作为最终使用的表头。 (列名别名也只能在第一个集合上起) 3.可以使用括号()先执行后面的语句。 问题:按照部门统计各部门不同工种的工资情况,要求按如下格式输出: ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/88fa3fef11d5f57b231a2a905446d44e.webp) ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/c1715b24d03e5abf0a3d9c1cb190d7f9.webp) 第一部分数据是按照deptno和job进行分组;select 查询deptno、job、sum(sal) 第二部分数据是直接按照deptno分组即可,与job无关;select 只需要查询deptno,sum(sal) 第三部分数据不按照任何条件分组,即group by null;select 查询sum(sal) ### 数据处理 #### 插入数据insert 使用 INSERT 语句向表中插入数据。其语法为: ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/58767bd238d4f5de905b7fc30fc75879.webp) 如果:values后面的值,涵盖了表中的所有列,那么table的列名可以省略不写。 ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/ec35015e8468d36beec915c3f43e891a.webp) ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/6f7abd9e7d44452abfcb44abe3718607.webp) ![在这里插入图片描述](https://file.jishuzhan.net/article/1753850775194308610/ef8e5299044b0dc75af9feca6fff4514.webp)

相关推荐
影子24012 小时前
Navicat导出mysql数据库表结构说明到excel、word,单表导出方式记录
数据库·mysql·excel
java_heartLake2 小时前
PostgreSQL15深度解析(从15.0-15.12)
数据库·postgresql
nuc-1274 小时前
sqli-labs学习记录8
数据库·学习·sqli-labs
余华余华5 小时前
计算机等级考试数据库三级(笔记3)
服务器·数据库·oracle
南風_入弦6 小时前
Oracle logminer详解
数据库·oracle·恢复
小安同学iter7 小时前
SpringBoot (二) 日志系统
数据库·spring boot·后端
Chandler247 小时前
Redis:事务
数据库·redis·缓存
开发小能手-roy7 小时前
ubuntu 安装mysql
mysql·ubuntu·adb
是阿建吖!8 小时前
【MySQL】事务
数据库·mysql
Asuka078 小时前
MySQL数据库和表的操作
数据库·mysql