MySQL(CRUD)

MySQL

mysql -u root -ply

MySQL的三层结构

1.安装MySQL数据库本质就是在主机安装一个数据库管理系统(DBMS),这个管理程序可以管理多个数据库.

2.一个数据库中可以创建多个表,以保存数据

SQL语句分类

1.DDL:数据定义语句[create 表,库]

2.DML:数据操作语句[增加insert,修改update,删除delete]

3.DQL:数据查询语句[select]

4.DCL:数据控制语句[管理数据库:比如用户权限 grant 撤回 revoke]

创建数据库

查看,删除数据库

显示数据库语句:SHOW DATABASE

显示数据库创建语句:SHOW CREATE DATABASE db_name

数据库删除语句:DROP DATABASE [IF EXISTS] db_name

创建数据库,表的时候,为了规避关键字,可以使用反引号解决

备份恢复数据库

备份数据库(注意: 在DOS执行)命令行

mysqldump -u 用户名(本机是root) -p -B数据库1 数据库2 数据库n>路径 文件名.sql (如 >d:\\bak.sql)

恢复数据库

在MySQL命令行在执行 source 文件名.sql

备份表

mysqldump -u 用户名-p 数据库 表1 表2 表n>路径 文件名.sql

恢复表

source 文件名.sql 也可以直接把备份文件复制到SQLyog执行

创建表

MySQL常用的数据类型

1.整型:如果没有指定unsinged,就是有符号,否则无.

2.字符串的基本使用:char最大255字符,可变长度字符串varchar最大65532字节,utf8最大21844字符,gbk最大32766个字符,1-3个字节用于记录大小

3.decimal[M,D][大小不确定,m-d的范围可指定,否则默认是10-30]

4.char(4)和varchar(4)区别在于,char不是字节数,不管是中文还是字母都放四个,即是定长(大小固定,占用分配四个字符的空间),varchar这个4表示字符数,不管是字母还是中文都以定义好的表的编码来存放数据(即变长.按实际占用空间分配)

修改表(添加修改删除)

-- 在emp表添加一个image列,varchar类型,要求在resume后面  
ALTER TABLE emp   
    ADD COLUMN image VARCHAR(32) NOT NULL DEFAULT '' AFTER RESUME
  
-- 显示表结构(这通常是一个单独的命令,不是ALTER TABLE的一部分)  
-- DESC emp; -- 可以在这里运行,但不在ALTER TABLE操作中  
  
-- 修改job列,使其长度为60  
ALTER TABLE emp
    MODIFY COLUMN job VARCHAR(60) NOT NULL DEFAULT ''
  
-- 删除sex列  
ALTER TABLE emp  
    DROP COLUMN sex
  
-- 表名修改为employee 
RENAME TABLE emp TO employee
  
-- 修改表的字符集为utf8(建议使用utf8mb4以支持更广泛的Unicode字符)  
ALTER TABLE employee CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci
  
-- 列名name修改为user_name  
ALTER TABLE employee   
    CHANGE COLUMN `name` `user_name` VARCHAR(64) NOT NULL DEFAULT ''
  
-- 显示修改后的表结构  
DESC employee

注意没加分号;一条一条的执行编辑语句

数据库的CRUD语句

insert(添加)

如:

-- 创建一张商品表的goods
CREATE TABLE `goods` (
	id INT,
	goods_name VARCHAR(10),
	price DOUBLE);
-- 添加数据
INSERT INTO `goods`(id,goods_name,price)
	VALUES(10,'华为手机',2000);

insert细节

1.插入的数据应与字段的数据类型相同,且字段长度应在规定范围内

2.在values中列出的数据位置必须与被加入的列排列顺序相对应

3.字符和日期需要包含在单引号内

4.列可以插入控制[前提是该字段允许为空,看定义],insert into table value(null)

5.insert into 列名 values(),(),() 形式添加多条记录

6.如果是给表中的所有字段添加数据,可以不写前面的字段名称

7.默认值的使用,当不给某个字段值的时候,如果有默认值机会添加,否则报错.

可以指定,在创建表的时候指定,如 price DOUBLE NOT NULL DEFAULT 100

update(修改)

update细节

1.update语法可以用来更新原有表行中的列

2.set子句指示要修改哪些值和要给予哪些值

3.where子句指定应该更新哪些行.如果没有WHERE子句.则更新所有的行

4.如果要修改多个字段,可以通过 set 字段1=值1,字段2 = 值2.

delete语句

select语句**

在where子句中经常用到的运算符

使用order by子句排序查询的结果

使用group by 和having子句

合计/统计函数

-- 1.演示mysql的统计函数count的使用
SELECT COUNT(*) FROM student
-- 统计总分大于300的人数
SELECT COUNT(*)FROM student
	WHERE (math+english+chinese)>300
-- 解释:count(*)返回满足条件记录的行数
-- count(列): 统计满足条件的某列有多少个,会排除null
CREATE TABLE t2 (
	`name` VARCHAR(20));
INSERT INTO t2 VALUES('tom');
INSERT INTO t2 VALUES('luo');
INSERT INTO t2 VALUES('tang');
INSERT INTO t2 VALUES(NULL);
SELECT * FROM t2;
SELECT COUNT(*)FROM t2 -- 4
SELECT COUNT(`name`)FROM t2 -- 3

-- 2.演示sum函数,仅对数值起作用
-- 统计一个班级数学总成绩
SELECT SUM(math)FROM student
-- 统计一个班级语文平均分
SELECT SUM(chinese)/COUNT(*)FROM student;
-- 3.演示avg的使用
SELECT AVG(math)FROM student
-- 4.演示max 和min 
SELECT MAX(math+english+chinese),MIN(math+english+chinese)FROM student
SELECT MAX(math)AS math_high,MIN(math)FROM student

字符串相关函数

-- charset返回字串字符集
SELECT CHARSET(ename) FROM emp
-- concat,连接字符串
SELECT CONCAT(ename,'工作是',job)FROM emp
-- instr(str,substr)返回str中substr出现的位置,没有返回-1
-- dual 亚元表,可作为测试表使用,系统自带
SELECT INSTR('hangshunping','ping')FROM DUAL
-- ucase lcase 转大小写
-- left(str,length),right(str,length)从左从右返回该字符串的指定长度

-- replace(str,search_str,replace_str)
-- 从str中replace_str替换search_str
SELECT ename,REPLACE(job,'manager','经理') FROM emp
-- strcmp(string1,string2)逐字比较两字串大小

-- substring(str,position[,length])
-- 从str 指定位置开始取长度,length不指定就是全取
SELECT SUBSTRING(ename,1,2)FROM emp
-- ltrim(str) rhrim(str) trim去除左端/右端/全部空格

练习,把ename的名字首字母小写后面全大写

数学相关函数

日期相关函数

加密和系统函数

流程控制函数

查询增强

-- 查询增强
-- mysql中日期类型可直接比较,需要注意格式
-- 查询2012.1.1后入职的员工
SELECT * FROM emo
	WHERE datehire>'2012.01.01'
-- 使用like操作符(模糊)
-- 	%: 表示0到多个任意字符 _:表示任意单个字符
-- 如何显示是首字符为s的员工姓名和工资?
SELECT ename,sal FROM emp
	WHERE ename LIKE 's%'
-- 如何显示第三个字符为大o的所有员工姓名和工资
SELECT ename,sal FROM emp
	WHERE ename LIKE '__O%'-- --两个下划线
-- 判断某一列是否为null 用is

-- 使用order by子句 来一个升序排列
SELECT * FROM emp
	ORDER BY sal ASC
-- 工资升序 部门降序排列
SELECT * FROM emp
	ORDER BY sal ASC,dep DESC

分页查询

select ... limit start,rows表示从start+1行开始取,取出rows行,start从0开始计算

分组复习

多子句查询

顺序不能错

案例:

-- 顺序group by->having->order by->limit

SELECT dep ,AVG(sal)AS avg_sal

FROM emp

GROUP BY dep -- 分组

HAVING avg_sal>1000 -- 过滤

ORDER BY avg_sal DESC -- 排序

LIMIT 0,2 -- 分页

多表查询*

重复的如果想要指定显示某个表的列,需要 表.列表

找到两个表或多个表多余的列的共同点进行过滤

多表查询的过滤条件不能少于 表的个数-1

自连接

自连接是指在同一张表的连接查询[将同一张表看作两张表.这种查询方式在处理具有层级关系或递归关系的数据时非常有用,比如部门结构中的上下级关系、员工之间的管理关系等。

自连接的示例

假设我们有一个employees表,其中包含员工的ID、姓名以及他们上级的ID(作为外键指向同一张表中的某个员工ID)。表结构可能如下所示:

employees  
+----+-----------+----------+  
| id | name      | manager_id|  
+----+-----------+----------+  
|  1 | John Doe  | NULL      |  
|  2 | Jane Doe  |  1 |  
|  3 | Bob Smith |  1 |  
|  4 | Alice     |  2 |  
+----+-----------+----------+

在这个例子中,John Doe是CEO,没有上级(manager_id为NULL)。Jane Doe和Bob Smith都向John Doe报告,而Alice则向Jane Doe报告。

如果我们想查询每个员工及其直接上级的名字,我们可以使用自连接来实现这一点:

SELECT   e1.name AS em_name,  e2.name AS ma_name  
      FROM   emp e1 ,emp e2 
      WHERE  e1.id=e2.id

多行子查询

-- 如何查询与smith同一部门的所有员工
-- 1.先查询到Smith的部门号
-- 2.把上面的select语句当作一个子查询来使用
SELECT *
	FROM emp
	WHERE deptno =(
		SELECT deptno
		FROM emp
		WHERE ename = 'smith'
		)
-- 课堂练习: 如何查询和部门10的工作相同的雇员的
-- 名字,岗位,工资,部门号,但不含10号部门自己的雇员
-- 查询十号部门有哪些工作
SELECT DISTINCT job -- distinct去重
	FROM emp
	WHERE deptno =10;
-- 把上面查询的结果当作子查询使用,完整语句
SELECT ename,job,sal,deptno
	FROM emp
	WHERE job IN(
			SELECT DISTINCT job
			FROM emp
			WHERE deptno =10
			)AND deptno!=10

子查询临时表

把子查询当做一张临时表来使用,可以解决很多问题

all和any

多列子查询

多列子查询是指查询返回多个列数据的子查询语句

表的复制和去重

-- 表的复制
-- 
CREATE TABLE ly_tab01
	(id INT,
	`name` VARCHAR(32),
	sal DOUBLE,
	job VARCHAR(32),
	deptno INT;
DESC ly_tab01
SELECT * FROM ly_tab01
INSERT INTO ly_tab01
	VALUES(1,'Yu',19999,'java开发工程师',99)
SELECT * FROM emp
-- 演示如何自我复制
RENAME TABLE employee TO emp
-- 1.把emp表的记录复制到 ly_tab01
INSERT INTO ly_tab01
	(id,`name`,sal,job,deptno)
	SELECT id,user_name,sal,job,deptno FROM emp;
-- 2.自我复制
INSERT INTO ly_tab01
	SELECT * FROM ly_tab01
SELECT * FROM ly_tab01

-- 如何删除一张表的重复记录
-- 1.创建一张ly_tab02
-- 2. 让该表有重复的记录
CREATE TABLE ly_tab02 LIKE emp -- 这个语句把emp表的结构(列),复制到ly_tab02
DESC ly_tab02
INSERT INTO ly_tab02
	SELECT * FROM emp
SELECT * FROM ly_tab02
/*
	思路
	(1)先创建一张临时表 my_tmp,该表结构和my_tab02一样
	(2)把my_tmp的记录 通过distinct 关键字 处理后,把记录赋值到my_tmp
	(3)清除掉my_tab02记录
	(4)把my_tmp 表记录复制到ly_tab02
	(5)drop掉 临时表my_tmp
*/
CREATE TABLE my_tmp LIKE ly_tab02
INSERT INTO my_tmp
	SELECT DISTINCT * FROM ly_tab02;
DELETE FROM ly_tab02
INSERT INTO ly_tab02
	SELECT * FROM my_tmp
DROP TABLE my_tmp;

合并查询

mysql外连接

左外连接:(如果左侧的表完全显示我们就说是左外连接)

右外连接:(如果右侧的表完全显示我们就说是右外连接)

mysql约束

约束用于确保数据库满足特定的商业规则

包括not null ,unique,primary key,foreign key 和check五种

主键

primary key(主键)-基本使用

字段名 字段类型 primary key

-- 主键使用
-- id name,email
CREATE TABLE t13
	(id INT PRIMARY KEY,-- 表示id 是主键
	`name` VARCHAR(32),
	email VARCHAR(32));
-- 1.主键列的值是不可以重复
INSERT INTO t13
	VALUES(1,'jack','jack@sohu.com');
INSERT INTO t13
	VALUES(3,'lans','lans@sohu.com');
-- 2.primary key不可以重复且不能为null
INSERT INTO t13
	VALUES(NULL,'luo','luo@sohu.com');
-- 3.一张表最多只能有一个主键,但可以复合主键,把id name做成复合主键
CREATE TABLE t14
	(id INT ,
	`name` VARCHAR(32),
	email VARCHAR(32),
	PRIMARY KEY(id,`name`));-- 复合主键 需复合的都完全相同就无法添加
INSERT INTO t14
VALUES(3,'lans','lans@sohu.com');
INSERT INTO t14
VALUES(3,'lanss','lans@sohu.com');
SELECT * FROM t14
-- 使用desc表名,可以看到primary的情况
DESC t14 -- 查看 t14表的结果,显示约束的情况

unique/not null

外键

-- 外键演示
-- 主表
CREATE TABLE my_class(
	id INT PRIMARY KEY,
	`name` VARCHAR(32)NOT NULL DEFAULT '');
-- 从表
CREATE TABLE my_stu(
	id INT PRIMARY KEY,
	`name` VARCHAR(32) NOT NULL DEFAULT '',
	class_id INT,
	-- 指定外键关系
	FOREIGN KEY(class_id) REFERENCES my_class(id));
-- 测试数据
INSERT INTO my_class
	VALUES(100,'java'),(200,'web');
INSERT INTO my_stu
	VALUES(1,'tom',100);
INSERT INTO my_stu
	VALUES(2,'jack',200);
INSERT INTO my_stu
	VALUES(3,'lans',300); -- 失败,300班级不存在
SELECT * FROM my_stu

check

自增长

+AUTO_INCREMENT

索引**

大幅提高查询速度

创建索引,删除,改,查

索引的类型

1.主键索引,主键自动的为主索引(类型 Primary key)

2.唯一索引 (UNIQUE)

3.普通索引(INDEX)

4.全文索引(FULLTEXT)[适用MySAM]

开发中考虑使用全文搜索 Solr 和 ElasticSearch(ES)

-- 添加索引
-- 添加唯一索引
CREATE UNIQUE INDEX id_index ON t25(id);
-- 添加普通索引
CREATE INDEX id_index ON t25(id)
-- 想要优化速度但又不确定数据会不会重复就可以使用普通索引
-- 添加普通索引2
ALTER TABLE t25 ADD INDEX id_index(id)
-- 添加主键索引 可以在创建时添加
ALTER TABLE t25 ADD PRIMARY KEY(id)
-- 也可
-- 删除索引
SHOW INDEX FROM t25
DROP INDEX id_index ON t25
-- 删除主键索引
ALTER TABLE t25 DROP PRIMARY KEY
-- 修改索引 先删除 后重新添加
-- 查询索引
-- 1.方式
SHOW INDEX FROM t25
-- 2.方式
SHOW INDEXES FROM t25
-- 3.
SHOW KEYS FROM t25
-- 4 不建议
DESC t25

小结:

事务

隔离

...

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

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

相关文章

【Java】基于JWT+Token实现完整登入功能(实操)

Java系列文章目录 补充内容 Windows通过SSH连接Linux 第一章 Linux基本命令的学习与Linux历史 文章目录 Java系列文章目录一、前言二、学习内容:三、问题描述四、解决方案:4.1 认识依赖4.2 使用JWT4.3 登入实现4.4 配置拦截器4.5 获取数据 五、总结&…

EMC技术

目录 EMC 天线效应 公式 措施 EMC测试 展频技术 如何展频 OTA测试 EMC 三大要素:干扰源、传输介质、敏感设备。 EMI:Electromagnetic Interference,电磁干扰。 EMS:Electro Magnetic Susceptibility,电磁抗扰…

二百五十九、Java——采集Kafka数据,解析成一条条数据,写入另一Kafka中(一般JSON)

一、目的 由于部分数据类型频率为1s,从而数据规模特别大,因此完整的JSON放在Hive中解析起来,尤其是在单机环境下,效率特别慢,无法满足业务需求。 而Flume的拦截器并不能很好的转换数据,因为只能采用Java方…

JVM系列(十) -垃圾收集器介绍

一、摘要 在之前的几篇文章中,我们介绍了 JVM 内部布局、对象的创建过程、运行期的相关优化手段以及垃圾对象的回收算法等相关知识。 今天通过这篇文章,结合之前的知识,我们一起来了解一下 JVM 中的垃圾收集器。 二、垃圾收集器 如果说收集算法是内存回收的方法论,那么…

集成电路学习:什么是NOR Flash Memory非易失性闪存存储器

一、NOR Flash Memory:非易失性闪存存储器 NOR Flash Memory,即非易失性闪存存储器的一种,是Flash存储器的一个重要分支。Flash存储器,又称为闪存,结合了ROM(只读存储器)和RAM(随机存…

Windows下Python和PyCharm的应用(三)__Numpy与矩阵

1、背景介绍 矩阵运算是Python语言的基石。 而支持矩阵运算的基础语言包就是Numpy。 参考链接: Python中Numpy的使用_numpy在python中的用法-CSDN博客 这篇博客介绍的numpy比我的这篇博客介绍的更加的详细。本博客只是根据本人 的实际应用,对最关键的…

Clean Minimalist GUI Pack (简约风格UI界面)

Unity 最简洁易用的 GUI 资源包。如果你在寻找资源商店上 UI 极简主义革命的发起者,你已经找到了。 这一极干净简约的 GUI 资源包是一款适合移动设备使用的游戏 UI 资源包,其中包含许多图标和元素,可用于创建具有简洁风格的完整游戏 UI。 功能: • 包括 3 种皮肤:深色、浅…

【数据结构】详细介绍各种排序算法,包含希尔排序,堆排序,快排,归并,计数排序

目录 1. 排序 1.1 概念 1.2 常见排序算法 2. 插入排序 2.1 直接插入排序 2.1.1 基本思想 2.1.2 代码实现 2.1.3 特性 2.2 希尔排序(缩小增量排序) 2.2.1 基本思想 2.2.2 单个gap组的比较 2.2.3 多个gap组比较(一次预排序) 2.2.4 多次预排序 2.2.5 特性 3. 选择排…

AFSim 仿真系统----性能工具

什么是 WPR/WPA? Windows 性能记录器 (WPR) 和 Windows 性能分析器 (WPA) 是 Windows 性能工具包中提供的性能监控工具。它们是免费的工具,可以通过下载和安装 Windows 评估和部署工具包 (ADK) 来获得。 WPR 是一个工具,允许用户动态部署事…

Unity3D在2D游戏中获取触屏物体的方法

我们的需求是: 假如屏幕中一个棋盘,每个棋子是button构成的,我们希望手指或者鼠标在哪里,就显示那个位置的button信息。 网上有很多获取触屏物体信息的信息的方法如下面代码所示: Camera cam Camera.main; // pre-de…

一个php快速项目搭建框架源码,带一键CURD等功能

介绍: 框架易于功能扩展,代码维护,方便二次开发,帮助开发者简单高效降低二次开发成本,满足专注业务深度开发的需求。 百度网盘下载 图片:

对称密码学

1. 使用OpenSSL 命令行 在 Ubuntu Linux Distribution (发行版)中, OpenSSL 通常可用。当然,如果不可用的话,也可以使用下以下命令安装 OpenSSL: $ sudo apt-get install openssl 安装完后可以使用以下命令检查 OpenSSL 版本&am…

uniapp 自定义微信小程序 tabBar 导航栏

背景 做了一个校园招聘类小程序,使用 uniapp vue3 uview-plus pinia 构建,这个小程序要实现多角色登录,根据权限动态切换 tab 栏文字、图标。 使用pages.json中配置tabBar无法根据角色动态配置 tabBar,因此自定义tabBar&…

如何构建你自己的实时人脸识别系统

引言 随着人工智能技术的发展,人脸识别已经成为日常生活中的常见技术,被广泛应用于安全验证、个性化服务等多个领域。本教程将指导你如何使用Python编程语言结合OpenCV和face_recognition库来构建一个基本的人脸识别系统。我们将从安装必要的库开始&…

C++ 设计模式——解释器模式

目录 C 设计模式——解释器模式1. 主要组成成分2. 逐步构建解释器模式步骤1: 定义抽象表达式步骤2: 实现终结符表达式步骤3: 实现非终结符表达式步骤4: 构建语法树步骤5: 实现内存管理步骤6: 创建上下文和客户端 3. 解释器模式 UML 图UML 图解析 4. 解释器模式的优点5. 解释器模…

生日贺卡录放音芯片,多段音频录音ic生产厂商,NVF04M-32minute

可以录音播放的生日贺卡与传统的纸质贺卡相比,它有着创意以及个性的特点,仅需少量的电子元器件,即可实现录音功能,搭配上文字,让声音存储在生日贺卡里,让贺卡也变得有温度,祝福我想亲口对TA说。…

fantastic-admin前端+django后端,初始化全流程记录

fantastic-admin前端是我目前看到最完善的前端框架,只需要简单的设置就可以快速开始项目。 但是我本人的能力有限,对前端知识一知半解,之前废了九牛二虎之力才跑通了前后端流程,由于新的项目需要,有了开发新后台的想法…

【有啥问啥】大模型应用中的哈希链推理任务

大模型应用中的哈希链推理任务 随着人工智能技术的快速发展,尤其是大模型(如GPT、BERT、Vision Transformer等)的广泛应用,确保数据处理和模型推理的透明性与安全性变得愈发重要。哈希链推理任务作为一种技术手段,能够…

学习计算机网络

a类0~127,b类128~191,c类192~223 网络地址:看子网掩码,分网络位和主机位,后面是主机位,主机位全部为0,网络地址。 直接广播地址:看子网掩码,分网络位和主机位&#xff…

Jenkins构建CI/CD

CI/CD 软件开发的连续方法基于自动执行脚本,以最大限度地减少在开发应用程序时引入错误的可能性。从新代码的开发到部署,它们需要较少的人为干预甚至根本不需要干预。 它涉及在每次小迭代中不断构建,测试和部署代码更改,从而减少…