深入浅出MySQL-01-【SQL基础】

前言

环境:

  • Windows11
  • MySQL-8.0.35

1.服务启动和关闭

Windows系统中:

// 启动MySQL服务
net start mysql80
// 关闭MySQL服务
net stop mysql80

2.SQL基础

2.1.登录

登录本机MySQL服务,用户是root(-u指定),使用密码登录(-p表示需要输入密码)

mysql -uroot -p
// windows中,进入mysql安装的bin目录下
.\mysql -uroot -p

2.2.DDL操作

数据库定义语句… …

查看所有的数据库

show databases

创建数据库

create database 数据库名

进入指定的数据库

use 数据库名

查看当前在哪个数据库下

select database()

查看数据库中有哪些表

show tables

删除数据库

drop database 数据库名

创建表

CREATE TABLE 表名 (列名 列类型 约束条件)

查看表的定义

DESC 表名

查看创建表的SQL

show create table 表名

删除表

DROP TABLE 表名

修改表字段

ALTER TABLE 表名 MODIFY [COLUMN] column_definition [FIRST | AFTER column_name]

增加表字段

ALTER TABLE 表名 ADD [COLUMN] column_definition [FIRST | AFTER column_name]

删除表字段

ALTER TABLE 表名 DROP [COLUMN] column_name

修改字段名

ALTER TABLE 表名 RENAME [COLUMN] old_column_name TO new_column_name

修改字段名并修改列定义

ALTER TABLE 表名 CHANGE [COLUMN] old_column_name column_definition [FIRST | AFTER col_name]

change和modify都可以修改列的定义,也就是column_definition,不同的是change后面要写两次列名,因为old列名和new列名都一样(这里是说修改列的定义,不是改名),不方便。但是change的优点是可以同时修改列名,此时old列名和new列名就不一样了,modify不可以修改列名。

如果仅仅修改列名,可以使用上面的RENAME TO的语句。

修改字段排列顺序

前面的语句中,ADD、MODIFY和CHANGE语句中,都有一个 first | alter column_name,这就是设置列的顺序的。ADD新加的列默认在最后,MODIFY和CHANGE如果不指定默认是不改变列的顺序的。

添加列并指定位置:

alter table emp add birth date after ename

修改列,设置顺序第一个:

alter table emp modify column age int(3) first

更改表名

ALTER TABLE 表名 RENAME [TO] new_tablename 

查看表的所有列信息

SHOW COLUMNS FROM 表名 [FROM 数据库名] [LIKE 'pattern'] 

2.3.DML语句

数据库操作语句,主要是针对数据库中表数据的操作,例如insert、delete、update 和 select操作。

插入记录insert

// 指定列的插入
INSERT INTO 表名(field1, field2, ..., fieldn) VALUES (value1, value2, ..., valuen)
// 不指定列的全部插入
INSERT INTO 表名 VALUES (value1, value2, ..., valuen)
// 一次性插入多条数据
INSERT INTO 表名(field1, field2, ..., fieldn) 
VALUES 
(value1, value2, ..., valuen),
(value1, value2, ..., valuen),
...,
(value1, value2, ..., valuen)

更新记录update

更新一个表的数据:

UPDATE 表名 SET field1=value1, field2=value2, ..., fieldn=valuen [WHERE CONDITION]

同时更新多个表的数据:

UPDATE 表名1 t1, 表名2 t2, ..., 表名n tn SET t1.列名=exprn, t2.列名=exprn, ..., tn.列名=exprn [WHERE CONDITION]

这种方式更多的用于根据一个表的字段动态的更新另一个表的字段。

删除记录delete

DELETE FROM 表名 [WHERE CONDITION]

一次性删除多个表的数据:

DELETE 表名1, 表名2, ..., 表名n from 表名1, 表名2, ..., 表名n [WHERE CONDITION]
// 例如, 同时删除emp和dept中deptno为3的数据
delete a, b from emp a, dept b where a.deptno = b.deptno and a.deptno = 3

如果from后面的表名使用别名,delete后面的也需要使用别名。

注意:不管是单表还是多表的删除,如果不加where条件,会删除表中的所有数据!!!

查询记录select

SELECT * FROM 表名 [WHERE CONDITION]
// 查询不重复的记录, distinct
SELECT DISTINCT column_name1, ..., column_namen FROM 表名 [WHERE CONDITION]
// 查询条件以及排序
SELECT * FROM 表名 [WHERE CONDITION] [ORDER BY field1 [DESC | ASC], field2 [DESC | ASC], ..., fieldn [DESC | ASC]]
limit
// 显示部分数据(分页), limit
SELECT ... [WHERE CONDITION] [LIMIT offset_start, row_count]

limit语句中,offset_start表示记录的起始偏移量,row_count表示显示的行数。默认情况下起始偏移量是0,只写row_count,那就展示查询数据的前n条数据,例如:

// 展示查询数据的前3条数据
select * from emp limit 3

显示查询后的第二条记录开始,显示3条:

// offset_start默认从0开始,所以第二条开始就从1开始
select * from emp limit 1,3
聚合
SELECT [field1, field2, ..., fieldn] fun_name
FROM 表名 
[WHERE CONDITION] [
GROUP BY field1, field2, ..., fieldn [WITH ROLLUP]] 
[HAVING where_condition]
  • fun_name:表示要做的聚合操作,也就是聚合函数,常用的有sum、count、avg、max和min。
  • GROUP BY:表示要进行分类聚合的字段。
  • WITH ROLLIP:可选的,表示是否对分类聚合后的结果再进行汇总。
  • HAVING:表示对分类后的结果再进行条件的过滤。

注意:having和where的区别,having是对聚合后的结果进行条件的过滤,而where是在聚合前就对数据进行过滤,所有使用时尽可能先用where过滤数据,这样结果集减少,聚合的效率会提高,最后再根据having进行过滤。

聚合示例:

// 要在emp表中统计公司的总人数
select count(1) from emp
// 统计各部门的人数
select deptno, count(1) from emp group by deptno
// 既要统计各部分人数, 又要统计总人数
select deptno, count(1) from emp group by deptno with rollup
// 统计人数大于1的部门
select deptno, count(1) from emp group by deptno having count(1) > 1
// 统计公司所有员工的薪水总额、最高和最低薪水
select sum(sal), max(sal), min(sal) from emp;
with rollup

在MySQL中,WITH ROLLUP是一个可选的修饰符,它可以与GROUP BY子句一起使用,以生成一个额外的汇总行,显示每个分组的总和。这在数据分析和报告生成中特别有用,因为它允许你查看每个子组的详细信息,同时还可以快速地看到整体的汇总数据。

当你使用WITH ROLLUP时,MySQL会为每个GROUP BY列生成一个额外的汇总行。这些汇总行将显示该列中所有行的汇总值,而不仅仅是特定分组的值。

表连接

大类上,分为内连接和外链接,内连接仅仅展示两张表互相匹配的数据,而外连接会选出其他不匹配的记录。

// 内连接
select ename, deptno from emp, dept where emp.deptno = dept.deptno

外连接又分为 左连接 和 右连接。

  1. 左连接:包含所有的左表中的记录甚至是右边表中没有和它匹配的记录。
  2. 右连接:包含所有的右表中的记录甚至是左边表中没有和它匹配的记录。
子查询
select * from emp where deptno in (select deptno from dept)
// 如果子查询记录唯一, 用 = 代替 in
select * from emp where deptno = (select deptno from dept)
// 某些情况,子查询可以转化为表连接
select emp.* from emp, dept where emp.deptno = dept.deptno

表连接很多情况下是优于子查询的

记录联合union 和 union all

union 和 union all 的区别是 union all 是把结果集直接合并在一起,而union是将union all后的结果进行一次distinct,去除重复记录后的结果。

2.3.DCL语句

数据库管理语句,主要是DBA用来管理系统中的对象权限时使用,一般开发人员很少用到。

3.帮助的使用

MySQL使用中可能遇到以下问题:

  • 某个操作语法忘记了,如何快速查找?
  • 如何快速知道当前版本上某个字段类型的取值范围?
  • 当前版本都支持哪些函数?
  • 当前版本是否支持某个功能?

3.1.按照层次看帮助

如果不知道帮助能够提供什么,可以使用 “? contents”命令显示所有可供查询的分类,例如:

mysql> ? contents;
You asked for help about help category: "Contents"
For more information, type 'help <item>', where <item> is one of the following
categories:Account ManagementAdministrationComponentsCompound StatementsContentsData DefinitionData ManipulationData TypesFunctionsGeographic FeaturesHelp MetadataLanguage StructureLoadable FunctionsPluginsPrepared StatementsReplication StatementsStorage EnginesTable MaintenanceTransactionsUtility

如上,对于列出的分类,可以使用“? 类别名称”的方式进一步查看,例如,想查看MySQL中都支持哪些数据类型,可以执行 “? data types”命令:

mysql> ? data types;
You asked for help about help category: "Data Types"
For more information, type 'help <item>', where <item> is one of the following
topics:AUTO_INCREMENTBIGINTBINARYBITBLOBBLOB DATA TYPEBOOLEAN... ...

如上,列出了当前版本支持的所有数据类型,如果想看int类型的具体介绍,执行“? int”命令:

mysql> ? int;
Name: 'INT'
Description:
INT[(M)] [UNSIGNED] [ZEROFILL]A normal-size integer. The signed range is -2147483648 to 2147483647.
The unsigned range is 0 to 4294967295.URL: https://dev.mysql.com/doc/refman/8.0/en/numeric-type-syntax.html

通过这种 “? 类别名称”的方式,可以一层一层的往下查找你关心的主题内容。

3.2.快速查阅帮助

实际使用中,如需要快速查阅某项语法,可以使用关键字进行快速查阅,例如想知道 show 命令都能干什么,可以执行命令 “? show”:

mysql> ? show;
Name: 'SHOW'
Description:
SHOW has many forms that provide information about databases, tables,
columns, or status information about the server. This section describes
those following:SHOW {BINARY | MASTER} LOGS
SHOW BINLOG EVENTS [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count]
SHOW {CHARACTER SET | CHARSET} [like_or_where]
SHOW COLLATION [like_or_where]
SHOW [FULL] COLUMNS FROM tbl_name [FROM db_name] [like_or_where]
SHOW CREATE DATABASE db_name
SHOW CREATE EVENT event_name
SHOW CREATE FUNCTION func_name
SHOW CREATE PROCEDURE proc_name
SHOW CREATE TABLE tbl_name
...
...

同样的如果想看 CREATE TABLE 的语法,可以如下执行:

mysql> ? create table;
Name: 'CREATE TABLE'
Description:
Syntax:
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name(create_definition,...)[table_options][partition_options]CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name[(create_definition,...)][table_options][partition_options][IGNORE | REPLACE][AS] query_expressionCREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name{ LIKE old_tbl_name | (LIKE old_tbl_name) }......

4.查询元数据信息

应用场景:

  • 删除数据库test1下的所有前缀为tmp的表;
  • 讲数据库test1下的所有存储引擎为myisam的表改为innodb;

MySQL提供了一个数据库information_schema,用来记录MySQL中的元数据信息。

元数据指的是数据的数据,比如表名、列名、列类型、所以索引名等表的各种属性名称。

这个库比较特殊,是一个虚拟的库,物理上不存在相关的目录和文件,库里show tables展示的表也不是实际存在的物理表,而全部是视图。

对于上面的两个场景,可以如下命令得到需要执行的SQL语句:

select concat('drop table test1.', table_name, ';') from tables where table_schema = 'test1' and table_name like 'tmp%'
select concat('alter table test1.', table_name, ' engine=innodb;') from tables where table_schema = 'test1' and engine = 'MYISAM'

比较常见的视图:

  • SCHEMATA:提供了当前MySQL实例中所有数据库的信息,show databases命令执行的结果就是来源于这个视图。
  • TABLES:提供了关于数据库中的表的信息(包括视图),详细表述了某个表属于哪个schema、表类型、表引擎、创建时间等信息。show tables from schemaname命令的结果就是来源于这个视图。
  • COLUMNS:提供了表中的列信息,详细表述了某张表的所有列以及每个列的信息,show columns from schemaname.tablename的结果就是来源于这个视图。
  • STATISTICS:提供了表的索引信息,show index from schemaname.tablename的结果来源于这个视图。

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

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

相关文章

ElementUI RUOYI 深色适配

1. 切换按钮&#xff1a;随便找个页面放上去 页面触发逻辑如下 a. html 按钮结构&#xff08;可自定义&#xff09; <el-switchstyle"margin-top: 4px; margin-left: 8px; margin-right: 8px"v-model"isDark"inline-promptactive-icon"Moon"…

用阅读丈量世界 用标准突破边界——The Open Group“开放标准书单”推荐!

The Open Group 依托旗下多个论坛&#xff0c;不断推陈出新标准、指南、白皮书、案例分析等形式多样的发布物&#xff0c;为行业在数字能力赛道的良性高速发展提供先进的理念、方法、策略以及具体应用场景下的最佳实践。 正值第29个“世界读书日”&#xff0c;The Open Group精…

如何解决Windows本地微服务并发启动后端口占用问题

在微服务架构中&#xff0c;经常会遇到本地开发时多个服务需要并行运行&#xff0c;而断开服务后由于某些原因导致端口未正确释放&#xff0c;再次启动服务时发现端口被占用的问题。这会阻碍开发进度&#xff0c;解决这一问题非常关键。本文将详细指导你如何在Windows环境下解决…

SQL Server指南:从入门到进阶实战

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

Java面试必问题52:(高级面试篇)MongoDB的详细解释以及他的用法以及他跟Redis的区别以及优势

1. 非结构化数据存储&#xff1a;MongoDB是一个面向文档的NoSQL数据库&#xff0c;它不需要定义固定的数据模式&#xff0c;适用于存储不同结构和半结构化的数据&#xff0c;如日志、JSON文档、传感器数据等。 2. 可扩展性和高性能&#xff1a;MongoDB采用分布式架构&#xff0…

PaddleSeg (2) 模型训练

已处理好数据集和配置文件,可以开始模型训练。 启动训练 python tools/train.py --config configs/xxx.yml --do_eval --use_vdl --save_interval 500 --save_dir output/xxx上述训练命令解释:* `--config`

为什么堆排序的时间复杂度是O(N*logN)?

目录 前言&#xff1a; 堆排序&#xff08;以排升序为例&#xff09; 步骤&#xff08;用大根堆&#xff0c;倒这排&#xff0c;排升序&#xff09;&#xff1a; 1.先把要排列的数组建立成大根堆 2.堆顶元素&#xff08;82&#xff09;和最后一个元素交换&#xff08;2&…

华为OD机试真题-亲子游戏-2024年OD统一考试(C卷D卷 )

题目描述: 宝宝和妈妈参加亲子游戏,在一个二维矩阵(N*N)的格子地图上,宝宝和妈妈抽签决定各自的位置,地图上每个格子有不同的糖果数量,部分格子有障碍物。 游戏规则是妈妈必须在最短的时间(每个单位时间只能走一步)到达宝宝的位置,路上的所有糖果都可以拿走,不能走障…

HYBBS表白墙爆款源码!轻松搭建表白墙网站,更可一键封装成APP,让爱传递无界限

PHP表白墙网站源码&#xff0c;适用于校园内或校区间使用&#xff0c;同时支持封装成APP。告别使用QQ空间的表白墙。 简单安装&#xff0c;只需PHP版本5.6以上即可。 通过上传程序进行安装&#xff0c;并设置账号密码&#xff0c;登录后台后切换模板&#xff0c;适配手机和PC…

计算机网络——应用层协议(1)

在这篇文章初识网络中&#xff0c;我介绍了关于计算机网络的相关知识&#xff0c;以及在这两篇文章中Socket编程和Socket编程——tcp&#xff0c;介绍了使用套接字在两种协议下的网络间通信方式。本篇文章中我将会进一步介绍网络中网络协议的部分&#xff0c;而这将会从应用层开…

[网络编程]socket嵌套字的一些常用接口

目录 一、socket常用接口 1.sockaddr_in 2.socket 3. bind 4.listen 5.accept 6.connect 7.send 8.sendto 9.recv 10.recvfrom 11.close 二、 字节序之间的转换函数 1. inet_ntoa 2. inet_aton 3.inet_addr 4.inet_pton 5.inet_ntop 6.htons 7.ntohs…

[SWPUCTF 2022 新生赛]ez_ez_unserialize

要绕过wakeup函数&#xff0c;只要序列化的中的成员数大于实际成员数&#xff0c;即可绕过。 <?php class X {public $x fllllllag.php; }$anew X(); echo serialize($a); O:1:“X”:1:{s:1:“x”;s:13:“fllllllag.php”;} 修改为 O:1:“X”:3:{s:1:“x”;s:13:“flllll…

NASA数据集—— ACRIMSAT 卫星上的 ACRIM 仪器以快门周期形式收集的 2 级太阳总辐照度

ACRIM III Level 2 Shutter Cycle Data V001 简介 ACR3L2SC_1 是主动空腔辐射计辐照度监测仪&#xff08;ACRIM&#xff09;III 2 级快门周期数据第 1 版产品&#xff0c;包含由 ACRIMSAT 卫星上的 ACRIM 仪器以快门周期形式收集的 2 级太阳总辐照度。 摘要 ACRIMSAT卫星上…

爬虫工具-推广-推广链接

爬虫工具是一种用于自动化获取联网上数据的软件程序。它可以模拟人类在网页上的操作&#xff0c;通过发送HTTP请求获取网页内容&#xff0c;并从中提取所需的数据。以下是一些常用的爬虫工具&#xff1a; Scrapy&#xff1a;Scrapy是一个基于Python的开源爬虫框架&#xff0c;它…

【Java--数据结构】“从扑克到程序:深入探讨洗牌算法的原理与魅力“

前言 以下是学习Java顺序表的一个实例应用———简单的洗牌算法。 欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗~ 如有错误&#xff0c;欢迎指出~ 目录 前言 定义每张扑克牌的属性 生成一副扑克牌&#xff08;不包含大小王&#xff09; 洗牌方法 发牌方…

邂逅JavaScript逆向爬虫-------基础篇之深入JavaScript运行原理以及内存管理

目录 一、JavaScript运行原理1.1 前端需要掌握的三大技术1.2 为什么要学习JavaScript1.3 浏览器的工作原理1.4 浏览器的内核1.5 浏览器渲染过程1.6 认识JavaScript引擎1.7 V8引擎以及JavaScript的执行过程1.8 V8引擎执行过程 二、JavaScript的执行过程2.1 初始化全局对象2.2 执…

PCB上有哪些元素

过孔&#xff1a;是用来切换层的 丝印&#xff1a;就是标记&#xff08;白色的线或者符号&#xff09; 焊盘&#xff1a;焊接元器件&#xff0c;相当于线头&#xff0c;连接各个元件 通孔埋孔盲孔&#xff0c;都是用来换层&#xff0c;内部没有桐&#xff0c;是用来固定的 线路…

【pycharm】调试模式中四个常用按钮介绍

【pycharm】调试模式中四个常用按钮介绍 在 PyCharm 的调试模式中&#xff0c;有四个常用的按钮&#xff0c;它们的功能如下&#xff1a; Step Over (F8)&#xff1a;单步执行&#xff0c;但在遇到函数调用时&#xff0c;不会进入函数内部&#xff0c;而是将整个函数作为一步执…

从0到1—POC编写基础篇(二)

接着上一篇 POC常用基础模块 urllib 模块 Python urllib 库用于操作网页 URL&#xff0c;并对网页的内容进行抓取处理。 urllib 包 包含以下几个模块&#xff1a; ●urllib.request - 打开和读取 URL。 ●urllib.error - 包含 urllib.request 抛出的异常。 ●urllib.parse - …

VUE DPlayer编译

源码 GitHub - DIYgod/DPlayer: :lollipop: Wow, such a lovely HTML5 danmaku video player 检查npm/nodejs 两个要配套。我的npm是8.5&#xff0c;nodejs是16 具体参考&#xff1a; 手动安装nodejs-CSDN博客 准备 npm i 编译 npm run build