首页
碎碎念
东邻西舍
本站信息
前来吐槽
统计
Search
1
openwrt系统上安装第三方插件
26,758 阅读
2
ubuntu下zerotier的基本使用教程
13,578 阅读
3
给小米R3G更换系统:从padavan刷成openwrt
12,848 阅读
4
openwrt使用第一步:设置上网拨号
10,741 阅读
5
openwrt无线中继功能:实现不插网线就能上网
9,519 阅读
学习点滴
Java
Web前端
Linux
踩坑实录
折腾搞机
关于建站
只言片语
登录
Search
标签搜索
Linux
建站
Java
踩坑实录
Ubuntu
MySQL
折腾搞机
HTML
CSS
MyBatis
Spring
SQL
Nginx
路由器
树莓派
OpenWrt
Maven
Git
Win10
只言片语
知识分子没文化
累计撰写
83
篇文章
累计收到
152
条评论
首页
栏目
学习点滴
Java
Web前端
Linux
踩坑实录
折腾搞机
关于建站
只言片语
页面
碎碎念
东邻西舍
本站信息
前来吐槽
统计
搜索到
7
篇与
的结果
2024-12-03
不使用 MySQL Installer 安装 MySQL 的方法
目录: 1、下载安装MySQL 2、在安装目录新建配置 3、添加环境变量 4、安装 5、启动服务 6、卸载 现在 Windows 下安装 MySQL 的时候需要首先下载 MySQL Installer,通过这个软件来联网安装管理不同版本的 MySQL,但是这个软件默认是将 MySQL 安装在 C 盘的,修改安装路径的地方也藏的很隐蔽,并且由于安装时 MySQL Installer 需要联网下载安装包,这对于内网里的机器无疑就是很不友好的。但是从 Oracle 官网下载到的 MSI Installer 程序只是解压出了 MySQL 程序,并没有进行任何的环境变量配置、服务配置,那么就需要通过手动配置程序信息。 1、下载安装MySQL 最新版本下载链接:MySQL :: Download MySQL Community Server 旧版本下载链接:MySQL :: Download MySQL Community Server (Archived Versions) 选择下载某一个版本的 MSI 安装程序或者 ZIP 压缩包,下载完成之后进行安装或解压。 2、在安装目录新建配置 下文中的 MySQL 安装目录以 D:\Program\Environment\MySQL\MySQL Server 5.7 为例: 安装目录下创建一个 “data” 文件夹 安装目录下创建一个 “my.ini” 文本文件,向其中写入以下内容(文件路径根据实际修改): [mysqld] # mysql 安装目录 basedir="D:\Program\Environment\MySQL\MySQL Server 5.7" # mysql 数据库的数据存放目录 datadir="D:\Program\Environment\MySQL\MySQL Server 5.7\data" sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES # MySQL服务器监听的端口 port=3306 # 服务端编码方式 character-set-server=utf8mb4 [clinet] # 客户端编码方式 loose-default-character-set=utf8mb4 # 端口号设置 port=3306 [WinMySQLadmin] Server="D:\Program\Environment\MySQL\MySQL Server 5.7\bin\mysqld.exe" 3、添加环境变量 右键 “开始菜单” -> “系统” -> “高级系统设置” -> “环境变量” 向 Path 中添加环境变量,值为 MySQL 安装目录下的 bin 文件夹: D:\Program\Environment\MySQL\MySQL Server 5.7\bin 4、安装 上面环境变量配置没有问题的话,就可以在 cmd 窗口中使用 mysqld 命令了。 此时以管理员身份运行 cmd 窗口,执行命令来初始化相关 data 文件: # 在前面配置好的 data 文件夹下会生成初始化的文件 mysqld --initialize-insecure --user=mysql 安装 MySQL 服务: mysqld -install 5、启动服务 可以通过以下命令启动 MySQL 服务: net start mysql 或者在 ”服务“ 窗口中找到 ”MySQL“ 这项服务,右键启动即可: 服务窗口可通过在“运行”窗口输入 “services.msc” 来启动,或者右键 开始菜单 -> 计算机管理 -> 服务和应用程序 -> 服务 找到。 在启动过程中有可能会出现报错: 在 MySQL 的服务属性中可以看到这项服务可执行文件的程序路径是不正确的: 这个窗口里面没有提供可以改这个路径的地方,查了一下,得需要到注册表中改,在注册表中(Win + R 运行窗口中输入“regedit”回车打开)找到 “HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\MySQL” 这个路径,修改其中 ImagePath 的值,将引号里的路径替换为本地 MySQL 安装文件的实际路径(就只替换前面的路径,其他的不用改): 保存退出之后,再到 “服务” 窗口中刷新一下,可执行文件的路径变成了新的路径之后再次启动即可成功启动 MySQL 服务。 目前本地运行的 MySQL 服务用 root 用户就可以登录,密码为空 MySQL 修改密码: 连接到数据库之后用 SQL 语句为 root 用户更改密码: alter user '用户名'@'localhost' identified by '新密码'; 修改完之后,刷新权限信息: flush privileges; 也可以在 MySQL 控制台中使用 mysqladmin 命令修改用户密码: # 新密码不需要加引号,否则会报错 mysqladmin -u [用户名] -p password [新密码]; 6、卸载 以管理员身份执行命令: mysqld -remove 删除服务: sc delete mysql 删除注册表文件: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\eventlog\Application\MySQL HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\services\MySQL HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\services\eventlog\Application\MySQL 参考资料: MySQL8.0绿色版本——最纯净的安装体验(免去卸载不掉只能重做系统的‘囧‘境)_mysql8.0 绿色安装-CSDN博客 mysql 启动提示:错误2系统找不到指定文件;(本地计算机上的mysql服务启动后停止,某些服务在未由其他服务或程序使用时将自动停止)_无法编辑imagepath-CSDN博客
2024年12月03日
510 阅读
0 评论
0 点赞
2021-10-31
MySQL数据表中的auto_increment自增值属性及修改
目录: 0x01. 查看自增值 1、查看全局自增值 2、查看特定数据表的自增值 0x02. 自增值的取值问题 1、默认取值 2、建表时指定 3、直接指定 4、修改自增字段属性 环境说明: MySQL 5.7 、MySQL 8.0 长期以来,我的博客数据库中连续文章的主键编号一直都不是连续的,让我这个强迫症晚期患看着很不舒服。在忍受了这么长时间以后,趁着给博客换域名的时机,我把所有的文章编号全部改成了连续的,可算是舒服多了。 把改完主键编号的文章数据导入新数据库之后,就产生了一个新问题:现在新数据表的主键自增值还是旧数据表的主键自增值。比如说博客数据库的文章表中有80条数据,下次新创建文章的编号是以旧数据库的自增值202开始递增,生成的新文章编号是203,而不是81。如果要保持文章编号能连续的话,就只能每次发布完新博客之后再去改数据库中的编号,可谓是相当麻烦。 所以我便想着是否可以通过修改数据表里主键的 AUTO_INCREMENT 自动递增值来一步到位,查了一些资料之后,就有了这篇博客。 0x01. 查看自增值 一般来说,数据表中具有自增属性 AUTO_INCREMENT 的字段主要是数据表的主键或者具有唯一性的字段。 如果要查阅其递增值,有这么两种方式: 1、查看全局自增值 SHOW VARIABLES LIKE 'AUTO_INC%'; 这条命令的执行结果会返回两条数据: AUTO_INCREMENT_INCREMENT 表示自增的初始值,AUTO_INCREMENT_OFFSET 表示自增的步长,即每次的自增量。 修改自增初始值与自增量的命令: SET @@AUTO_INCREMENT_INCREMENT=新初始值; SET @@AUTO_INCREMENT_OFFSET=新步长; 注意:这个表示的是数据库全局的自增设置,因此修改以后只会影响到下次新增的带有 AUTO_INCREMENT 属性的列,其自增初始值与自增步长就是新设置的值,对当前已经带有 AUTO_INCREMENT 属性的列的自增初始值与自增步长不起作用。 2、查看特定数据表的自增值 要想查看某个数据表中自增字段的当前自增值,可用以下命令: SHOW TABLE STATUS FROM [数据库名] LIKE [表名]; FROM [数据库名] 与 LIKE [表名] 这两个子句是可选的。 FROM [数据库名] 表示指定查询所在的数据库;LIKE [表名] 指定该数据库下要查询的某个表,如果省略了 LIKE [表名] 子句,则表示查看该数据库下的所有表的信息。 另外,需要注意的是,表名要加引号。 比如查询 TEST 数据库下 test 表的信息: SHOW TABLE STATUS FROM TEST LIKE 'test'; 查询结果中有一个字段名为 “AUTO_INCREMENT”,表示的就是自增值,该表下一条记录的编号就是这个值。 0x02. 自增值的取值问题 1、默认取值 默认情况下,自增值从1开始,每增加一条新记录,自增值便会自增 1。 所以,对于具有 AUTO_INCREMENT 属性的列,不用特意设置列值,而是直接将 NULL 值插入到自增列中去,数据库会自动根据当前的自增值生成列值。 注意: 将 0 插入到自增列中的效果等同于插入 NULL 值; 当插入记录时,如果没有为自增列指明一个值,那么也等同于插入 NULL; 使用 INSERT 语句插入记录时,如果为自增列设置了一个值,那么会出现这样三种情况: 情况一,插入的值与已有的编号重复,则会出现报错 情况二,插入的值大于列的自增值,成功插入这条记录,并且会更新自增值为新值 情况三,插入的值小于列的自增值且与已有的编号不重复,则成功插入这条记录,但自增值不会更新,如果插入的值与已有的值重复,参考情况一 如果用 UPDATE 语句更新自增列,情况与 INSERT 语句相同。 2、建表时指定 我们也可在建表时使用 “AUTO_INCREMENT=自增值” 来指定一个自增的初始值,比如: CREATE TABLE TEST{ -- 建表语句 }AUTO_INCTEMENT=自增值; 3、直接指定 ALTER TABLE [表名] AUTO_INCREMENT=自增值; 如果执行完以后没有效果,那么可以再执行一次 commit 指令以提交更改,使其生效。 4、修改自增字段属性 ALTER TABLE [表名] MODIFY [字段名] [字段类型和约束条件], AUTO_INCREMENT=自增值; 同样的,如果执行完以后没有效果,再执行一次 commit 提交更改。 这个语句相当于直接修改自增字段的属性,包括其数据类型和约束条件。 另外,我在尝试中发现,使用 SQL 语句更改了自增值以后再执行 SHOW TABLE STATUS 语句来验证是否修改成功,本地的数据库显示自增值已经修改过来了。但是,服务器上的数据库自增值依然还是原来的值,可是,当我在重新插入一条记录时,新记录的自增值却是修改过后的值。这属实让我有点摸不着头脑,我也不太确定是不是 MySQL 版本不同的原因,也懒得再尝试了,所以把这种情况记录上来以供参考吧。
2021年10月31日
2,207 阅读
0 评论
0 点赞
2021-08-05
SQL系列总结(四):DCL(数据控制语言)
前排提示: 本篇博客篇幅较长,建议结合目录进行阅读! 目录: 前言 0x01.权限的授予与收回 GRANT REVOKE 0x02.数据库角色 角色的创建 ——CREATE ROLE 给角色授权 ——GRANT 将角色授予给其他角色或用户 ——GRANT 收回角色权限 ——REVOKE 0x03.用户管理 创建用户: 删除用户: 重命名用户名: 修改用户密码: 环境说明: 数据库:Mysql 5.5 连接软件:Navicat 前言 SQL总结系列目录: SQL系列总结(一):DDL(数据定义语言)- Roookie博客 | 记录 · 收纳 · 分享 (wlplove.com) SQL系列总结(二):DQL(数据查询语言)- Roookie博客 | 记录 · 收纳 · 分享 (wlplove.com) SQL系列总结(三):DML(数据操纵语言) - Roookie博客 | 记录 · 收纳 · 分享 (wlplove.com) SQL系列总结(四):DCL(数据控制语言) - Roookie博客 | 记录 · 收纳 · 分享 (wlplove.com) SQL系列总结(五):TCL(事务控制语言) - Roookie博客 | 记录 · 收纳 · 分享 (wlplove.com) 数据控制语言(Data Control Language,DCL),是一种可对数据访问权进行控制的指令,它可以控制特定用户账户对数据表、查看表、存储程序、用户自定义函数等数据库对象的控制权。由GRANT和REVOKE两个指令组成。 0x01.权限的授予与收回 用户对某一数据对象的操作权称为权限。 数据库管理员拥有对数据库中所有对象的所有权限。 用户对自己建立的基本表和视图拥有全部的操作权限。 关系数据库系统中数据库模式的存取权限: 对象 操作权限 SCHEMA(模式) CREATE VIEW(视图) CREATE TABLE(基本表) CREATE、ALTER INDEX(索引) CREATE 关系数据库系统中数据的存取权限: 对象 操作权限 TABLE(基本表)、VIEW(视图) CREATE、INSERT、SELECT、UPDATE、DELETE、REFERENCES、ALL PRIVILEGES 属性列 SELECT、INSERT、UPDATE、REFERENCES、ALL PRIVILEGES SQL中使用GRANT和REVOKE语句向用户授予或收回对数据的操作权限。 GRANT GRANT语句向用户授予权限,一般格式为: GRANT <权限> ON <对象类型><对象名> TO <用户> [WITH GRANT OPTION]; 其语义为:将对某个操作对象(基本表、视图等)的指定操作权限授予某个用户 执行GRANT语句的可以是数据库管理员,也可以是数据库对象创建者(即owner)或者已经拥有该权限的用户 接受权限的用户可以是一个或多个具体用户,也可以是PUBLIC,即全体用户 [WITH GRANT OPTION]子句是可选的,如果指定了这个子句,则表示获得权限的用户还可以把这种权限再授予其他的用户(仅限于获得的这些权限),此时这些权限可以称为依赖权限。反之则该用户不能传播该权限 SQL标准允许具有WITH GRANT OPTION的用户把相应权限或其子集传递授予其他用户,但不允许循环授权,即被授权者不能把权限再授回给授权者或其祖先 例1:把查询Student表的权限授给用户U1,并允许U1将此权限授予给其他用户 GRANT SELECT ON TABLE Student TO U1 WITH GRANT OPTION; 例2:把对Student表和Course表的全部操作权限授予用户U2和U3 GRANT ALL PRIVILEGES ON TABLE Student,Course TO U2 U3; 例3:把对表SC的所有权限授予给全体用户 GRANT ALL PRIVILEGES ON TABLE SC TO PUBLIC; 例4:把查询Student表格修改学生学号的权限授给用户U4 GRANT ALTER(Sno) ON TABLE Student TO U4; 查看当前用户拥有的权限: SHOW GRANTS; 查看指定用户拥有的权限,前提是有超级用户权限: SHOW GRANTS FOR <用户名>; REVOKE REVOKE语句收回已经授予给用户的权限,一般格式为: REVOKE [GRANT OPTION FOR] <权限> ON <对象类型> <对象名> FROM <用户> [CASCADE | RESTRICT] [GRANT OPTION FOR]是可选项。如果声明了GRANT OPTION FOR,那么只是撤销对该权限的授权的权力,而不是撤销该权限本身 关于REVOKE中的CASCADE与RESTRICT的区别: 在赋予了用户A某一权限以及对该权限授权的权力之后, 情况一:用户A并未将权限授予给其他用户,用REVOKE语句回收权限时不管加CASCADE还是RESTRICT情况都是一致的。表示的都是回收用户A的权限以及对该权限授权的权力; 情况二:用户A将权限赋予给了用户B和C,此时数据库中存在依赖权限(定义见上条),那么: CASCADE意思为级联操作,加CASCADE参数表示回收用户A的权限以及对该权限授权的权力以及用户B和用户C的依赖权限 RESTRICT意思为限制操作,因为此时存在依赖权限(可以认为是一种限制),加RESTRICT参数之后将会拒绝执行语句,除非限制解除(依赖权限不存在) 总结一下: CASCADE选项表示DBMS撤销指定的权限以及依赖于被撤销权限的所有权限。RESTRICT选项表示DBMS服务器在存在任何依赖权限不要撤销指定的权限。 以上纯为个人理解,可能会有错误。因为书上与网上对REVOKE中的CASCADE和RESTRICT这部分解释的很笼统,基本都是模棱两可地在解释CASCADE(其中网上大部分结果都是复制粘贴外网上的同一篇文章),而RESTRICT基本都没有解释。对着翻译查了部分英文资料,大概有了一些理解,可能不太准确。如有错误还望不吝赐教,请在文末评论区留言指出。 用户可以自主地决定将数据的存取权限授予何人,以及是否也将“授权”的权限授予别人,因此称这样的存取控制是自主存取控制。 例1:把用户U4修改学生学号的权限收回 REVOKE ALTER ON TABLE Student FROM U4; 例2:收回所有用户对表SC的查询权限 REVOKE SELECT ON TABLE SC FROM PUBLIC; 例3:把用户U5对SC表的INSERT权限收回,其中U5的INSERT权限还赋予给了U6、U7 REVOKE INSERT ON TABLE SC FROM U5 CASCADE; # 这句指定加上了CASCADE参数,在收回U5的INSERT权限的同时还收回了U5赋予给U6、U7的INSERT权限。 0x02.数据库角色 数据库角色是被命名的一组与数据库操作相关的权限,角色是权限的集合。 使用角色来管理数据库权限可以简化授权的过程:在SQL中首先用CREATE ROLE语句创建角色,然后用GRANT语句给角色授权,用REVOKE语句收回授予角色的权限。 角色的创建 ——CREATE ROLE CREATE ROLE <角色名>; 刚创建的角色为空,没有任何权限的。 给角色授权 ——GRANT 语句与给用户授权类似,将用户名部分换成角色名即可: GRANT <权限> ON <对象类型> <对象名> TO <角色>; 将角色授予给其他角色或用户 ——GRANT GRANT <角色> TO <角色>/<用户> [WITH ADMIN OPTION]; 该语句把角色授予某个用户或者某个角色,这样一个角色的所有权限就是授予它的全部角色所包含的权限的总和。 [WITH ADMIN OPTION]子句是可选的,如果声明了WITH ADMIN OPTION子句,则获得了权限的角色或者用户还可以把权限再授予给其他的角色 收回角色权限 ——REVOKE 同样的,与收回用户的权限语句类似: REVOKE <权限> ON <对象类型> <对象名> FROM <角色>; REVOKE操作的执行者是角色的创建者或者拥有这些角色的ADMIN OPTIION。 0x03.用户管理 创建用户: CREATE USER <用户名> IDENTIFIED BY <密码>; 注意:密码部分记得加引号,否则会报错 删除用户: -- 普通删除: DROP USER <用户名>; -- 级联删除,把该用户的相关关系也删除掉: DROP USER <用户名> CASCADE; -- DELETE语句也可以删除用户 DELETE USER FROM MYSQL.USER WHERE USER='用户名'; FLUSH PRIVILEGES; 重命名用户名: RENAME USER <旧用户名> TO <新用户名>; 修改用户密码: -- 密码部分记得加引号 SET PASSWORD=PASSWORD('新密码'); -- 或者 UPDATE USER SET PASSWORD=PASSWORD('新密码') WHERE USER='用户名'; -- mysql8.0以上版本也可以用此命令: ALTER USER <用户名> IDENTIFIED BY <密码>; 或者可以直接在控制台上用mysqladmin命令修改密码: mysqladmin -u <用户名> -p password 注意:MySQL中用户数据和权限修改后,若希望在不重启MySQL服务的情况下直接生效,那么就需要执行这个命令: FLUSH PRIVILEGES; -- flush privileges 命令本质上是将当前user和privilige表中的用户信息/权限设置从mysql库(MySQL数据库的内置库)中提取到内存里。 否则就需要重启Mysql服务: # Linux系统下: systemctl restart mysql # 或者 service mysql restart # Win10系统,管理员权限运行cmd窗口 net stop mysql net start mysql 主要参考资料: 《数据库系统概论(第5版)》 王珊 萨师煊 编著 mysql用户操作和权限管理 - gg火花 - 博客园 (cnblogs.com)
2021年08月05日
1,575 阅读
0 评论
1 点赞
2021-08-03
SQL系列总结(三):DML(数据操纵语言)
前排提示: 本篇博客篇幅较长,建议结合目录进行阅读! 目录: 前言 准备数据 0x01.插入数据 1.插入元组 2.插入子查询结果 0x02.修改数据 1.普通修改 2.带有子查询的修改语句 0x03.删除数据 1.普通删除 2.带有子查询的删除语句 环境说明: 数据库:Mysql 5.5 连接软件:Navicat 前言 SQL总结系列目录: SQL系列总结(一):DDL(数据定义语言)- Roookie博客 | 记录 · 收纳 · 分享 (wlplove.com) SQL系列总结(二):DQL(数据查询语言)- Roookie博客 | 记录 · 收纳 · 分享 (wlplove.com) SQL系列总结(三):DML(数据操纵语言) - Roookie博客 | 记录 · 收纳 · 分享 (wlplove.com) SQL系列总结(四):DCL(数据控制语言) - Roookie博客 | 记录 · 收纳 · 分享 (wlplove.com) SQL系列总结(五):TCL(事务控制语言) - Roookie博客 | 记录 · 收纳 · 分享 (wlplove.com) 数据操纵语言(Data Manipulation Language, DML)是对于数据库中的数据的基本操作。具体操作增、删、改这三种,对应的关键词是:增——INSERT、删——DELETE、改——UPDATE。 在使用数据库的系统开发过程中,对于数据库的基本操作就是“增、删、改、查”,以“CRUD”(分别为 Create, Read, Update, Delete)来称呼。 准备数据 本篇博客中出现的SQL语句实例基于下面的三张数据表: {tabs} {tabs-pane label="学生表"} Student(Sno,Sname,Ssex,Sage,Sdept) -- 创建表: CREATE TABLE Student(Sno CHAR(6) Primary KEY, -- 学号 主键 Sname VARCHAR(20), -- 名字 Ssex CHAR(2), -- 性别 Sage INT, -- 年龄 Sdept VARCHAR(20) -- 系部 )ENGINE=INNODB DEFAULT CHARSET=utf8; -- 插入数据: INSERT INTO Student VALUES('202101','李勇','男',20,'计算机系'); INSERT INTO Student VALUES('202102','刘晨','女',19,'计算机系'); INSERT INTO Student VALUES('202103','王敏','女',18,'数学系'); INSERT INTO Student VALUES('202104','张立','男',18,'信息系'); {/tabs-pane} {tabs-pane label="课程表"} Course(Cno,Cname,Cpno,Ccredit) -- 创建表: CREATE TABLE Course(Cno CHAR(1) PRIMARY KEY, -- 课程号 主键 Cname VARCHAR(20), -- 课程名 Cpno CHAR(1), -- 前置学科课程号 Ccredit INT -- 学分 )ENGINE=INNODB DEFAULT CHARSET=utf8; -- 插入数据: INSERT INTO Course VALUES('1','数据库','5',4); INSERT INTO Course VALUES('2','数学','null',2); INSERT INTO Course VALUES('3','信息系统','1',4); INSERT INTO Course VALUES('4','操作系统','6',3); INSERT INTO Course VALUES('5','数据结构','7',4); INSERT INTO Course VALUES('6','数据处理','',2); INSERT INTO Course VALUES('7','C语言','6',4); {/tabs-pane} {tabs-pane label="学生选课表"} SC(Sno,Cno,Grade) -- 创建表: CREATE TABLE SC(Sno CHAR(6), -- 学号 主键 Cno CHAR(1), -- 课程号 主键 Grade INT, -- 成绩 PRIMARY key(Sno,Cno) -- 设置表级约束条件 )ENGINE=INNODB DEFAULT CHARSET=utf8; -- 插入数据: INSERT INTO SC VALUES('202101','1',92); INSERT INTO SC VALUES('202101','2',85); INSERT INTO SC VALUES('202101','3',88); INSERT INTO SC VALUES('202102','2',90); INSERT INTO SC VALUES('202102','3',80); {/tabs-pane} {/tabs} 0x01.插入数据 SQL数据插入语句有两种形式,一种是插入一个元组(即一行数据),另一种是插入子查询结果,子查询结果可以是多个元组(多行数据)。 1.插入元组 为表中所有字段都添加数据: INSERT INTO <表名> VALUES(<数据1>,<数据2> ···); INTO子句中并没有指明任何属性,表示给所有字段添加值,因此新插入的元组必须在每个属性列上都具有值。 VALUE子句对新元组的各属性列赋值,括号中属性列的次序与CREATE TABLE中的属性次序一一对应。 例:将一个新学生的全部数据插入到Student表中。(学号:202105,姓名:陈东,性别:男,所在系:信息系,年龄:18) INSERT INTO Student VALUES("202105","陈东","男",18,"信息系"); 当在INTO子句中指明部分属性列名时,表示仅对这几项属性进行赋值: INSERT INTO <表名> (<属性列1>,<属性列2> ···) VALUES(<数据1>,<数据2> ···); INTO子句指出了要在哪些属性上赋值,没有出现的属性类将默认取空值。其中,表定义时说明了NOT NULL的属性列不能取空值,否则会报错 VAlUE子句中属性的顺序可以与CREATE TABLE中的顺序不一样,但必须与INTO子句中的属性字段一一对应 例:向选课表中插入一条选课记录 (学号:202103,课程号:1) INSERT INTO SC (Sno,Cno) VALUES('202103','1'); 2.插入子查询结果 子查询不仅可以嵌套在SELECT语句中来构造父查询的条件,也可以嵌套在INSERT语句中用以生成要插入的批量数据。其语句格式为: INSERT INTO <表名> (<属性列1>,<属性列2> ···) [子查询语句]; -- 可以理解为在原来查询语句的基础上将VALUE子句变为了子查询语句 0x02.修改数据 1.普通修改 修改操作也称为更新操作,其语句的一般格式为: UPDATE <表名> SET <列名>=<表达式>,<列名>=<表达式>··· [WHERE <条件>]; 其功能是修改指定表中满足WHERE子句条件的元组 SET子句后的等式表示给要修改的属性赋予新值,用于取代原来的属性列值 例:将学生李勇的年龄改为22 UPDATE Student SET Sage='22' WHERE Sname='李勇'; 如果省略WHERE子句,则修改的对象为表中的所有元组 例:将所有的学生的年龄增加一岁 UPDATE Student SET Sage=Sage+1 2.带有子查询的修改语句 子查询也可以嵌套在UPDATE语句中,用以构造修改的条件。 例:将计算机系全体学生的成绩置零 UPDATE SC SET Grade=0 WHERE Sno IN (SELECT Sno FROM Student WHERE Sdept="计算机系"); 0x03.删除数据 1.普通删除 删除语句的一般格式为: DELETE FROM <表名> WHERE <条件>; DELETE语句执行完之后会返回删除的行数以及WHERE条件匹配的行数。 例:删除学号为202103的学生记录 DELETE FROM Student WHERE Sno='202103'; 删除学号为202101,202102,202103的学生记录 DELETE FROM Student WHERE Sno IN ('202101','202102','202103'); WHERE子句可以省略,此时为清空全表数据。请注意是数据的删除,表的结构依然存在。如: 例:删除所有学生的选课记录 DELETE FROM SC;-- 执行结果就是表SC变成了一个空表 2.带有子查询的删除语句 同修改语句,子查询也可以嵌套在DELETE语句中,用来构造执行删除操作的条件。 例:删除系所有学生的选课记录 DELETE FROM SC WHERE Sno IN (SELECT Sno FROM Student WHERE Sdept='信息系'); 主要参考资料:《数据库系统概论(第5版)》 王珊 萨师煊 编著
2021年08月03日
1,475 阅读
0 评论
1 点赞
2021-07-30
SQL系列总结(二):DQL(数据查询语言)
前排提示: 本篇博客篇幅较长,建议结合目录进行阅读! 目录: 前言 准备数据 0x01.单表查询 1.基本查询 2.条件查询 比较大小 确定范围 确定集合 字符匹配 判断是否为空 多重条件 3.分页查询 0x02.连接查询 ——待完成 0x03.嵌套查询 ——待完成 0x04.集合查询 ——待完成 0x05.基于派生表的查询 ——待完成 环境说明: 数据库:Mysql 5.5 连接软件:Navicat 前言 SQL总结系列目录: SQL系列总结(一):DDL(数据定义语言)- Roookie博客 | 记录 · 收纳 · 分享 (wlplove.com) SQL系列总结(二):DQL(数据查询语言)- Roookie博客 | 记录 · 收纳 · 分享 (wlplove.com) SQL系列总结(三):DML(数据操纵语言) - Roookie博客 | 记录 · 收纳 · 分享 (wlplove.com) SQL系列总结(四):DCL(数据控制语言) - Roookie博客 | 记录 · 收纳 · 分享 (wlplove.com) SQL系列总结(五):TCL(事务控制语言) - Roookie博客 | 记录 · 收纳 · 分享 (wlplove.com) 数据查询是数据库的核心操作。因此,数据查询语言DQL(Data Query Language)是SQL中的核心部分,它允许用户查询数据,这也是通常最频繁的数据库日常操作。 SQL提供了SELECT进行语句查询,该语句具有灵活的使用方式和丰富的功能。SELECT语句既可以完成简单的单表查询,也可以完成复杂的连接查询和嵌套查询。 准备数据 本篇博客中出现的SQL语句实例基于下面的三张数据表: {tabs} {tabs-pane label="学生表"} Student(Sno,Sname,Ssex,Sage,Sdept) -- 创建表: CREATE TABLE Student(Sno CHAR(6) Primary KEY, -- 学号 主键 Sname VARCHAR(20), -- 名字 Ssex CHAR(2), -- 性别 Sage INT, -- 年龄 Sdept VARCHAR(20) -- 系部 )ENGINE=INNODB DEFAULT CHARSET=utf8; -- 插入数据: INSERT INTO Student VALUES('202101','李勇','男',20,'计算机系'); INSERT INTO Student VALUES('202102','刘晨','女',19,'计算机系'); INSERT INTO Student VALUES('202103','王敏','女',18,'数学系'); INSERT INTO Student VALUES('202104','张立','男',18,'信息系'); {/tabs-pane} {tabs-pane label="课程表"} Course(Cno,Cname,Cpno,Ccredit) -- 创建表: CREATE TABLE Course(Cno CHAR(1) PRIMARY KEY, -- 课程号 主键 Cname VARCHAR(20), -- 课程名 Cpno CHAR(1), -- 前置学科课程号 Ccredit INT -- 学分 )ENGINE=INNODB DEFAULT CHARSET=utf8; -- 插入数据: INSERT INTO Course VALUES('1','数据库','5',4); INSERT INTO Course VALUES('2','数学','null',2); INSERT INTO Course VALUES('3','信息系统','1',4); INSERT INTO Course VALUES('4','操作系统','6',3); INSERT INTO Course VALUES('5','数据结构','7',4); INSERT INTO Course VALUES('6','数据处理','',2); INSERT INTO Course VALUES('7','C语言','6',4); {/tabs-pane} {tabs-pane label="学生选课表"} SC(Sno,Cno,Grade) -- 创建表: CREATE TABLE SC(Sno CHAR(6), -- 学号 主键 Cno CHAR(1), -- 课程号 主键 Grade INT, -- 成绩 PRIMARY key(Sno,Cno) -- 设置表级约束条件 )ENGINE=INNODB DEFAULT CHARSET=utf8; -- 插入数据: INSERT INTO SC VALUES('202101','1',92); INSERT INTO SC VALUES('202101','2',85); INSERT INTO SC VALUES('202101','3',88); INSERT INTO SC VALUES('202102','2',90); INSERT INTO SC VALUES('202102','3',80); {/tabs-pane} {/tabs} 0x01.单表查询 单表查询是指仅涉及一个表的查询。是DQL的基础部分。 1.基本查询 基本表的查询很简单,查询指定表的所有数据: SELECT * FROM <表名>; -- 查询结果是一个二维表格 例:查询全体学生的详细信息 SELECT * FROM Student; 也可以查询指定列: SELECT <列名1>,<列名2>··· FROM <表名>; 例:查询全体学生的学号姓名信息 SELECT Sno,Sname FROM Student; 有时候查询出来的列会有重复值,可以用DISTINCT来消除它们: SELECT DISTINCT Sno,Sname FROM Student; 或者在查询中加入计算表达式。 例:查询全体学生的姓名、出生时间信息 SELECT Sname,2021-Sage FROM Student; SELECT语句也可以去掉FROM子句,如: SELECT 1; # 返回结果1 SELECT 1+1; # 返回结果2 这种只有表达式却没有FROM子句的SELECT语句会直接计算出表达式的结果并返回一个列名为表达式、值为计算结果的1*1表格。可以用来判断当前连接与数据库的连接是否有效。 2.条件查询 大部分查询数据中,我们只是需要部分数据,而不是全部数据。因此就需要加上一些条件来筛选掉不需要的数据,可以通过`WHERE关键字后加入相应的查询条件来实现。 WHERE子句常用到的查询条件如下: 查询条件 谓词 比较 =、>、<、>=、<=、!=、<>、!>、!< 确定范围 BETWEEN ... AND... 、NOT BETWEEN ... AND ... 确定集合 IN、NOT IN 字符匹配 LIKE、NOT LIKE 判断是否为空 IS NULL、IS NOT NULL 多重条件/逻辑运算 AND、OR、NOT 比较大小 例1:查询李勇同学的详细信息 SELECT * FROM Student WHERE Sname='李勇'; 例2:查询考试成绩不及格的学生的学号 SELECT Sno FROM SC WHERE Grade<60; 例3:查询所有年龄在20岁以下的学生姓名及其年龄 SELECT Sname,Sage FROM WHERE Sage<20; 确定范围 BETWEEN···AND··· 和NOT BETWEEN···AND···可以用来查找属性值在(或不在)指定范围的元组,其中BETWEEN后是范围的下限(即低值),AND后是范围的上限(即高值)。 例:查询年龄在18~23岁的学生的学号、姓名 SELECT Sno,Sname FROM Student WHERE Sage BEWEEN 18 AND 23; 确定集合 谓词IN可以用来查找属性值属于指定集合的元组。 例:查询计算机系全体学生的名单 SELECT Sname FROM Student WHERE Sdept IN ('计算机系'); 字符匹配 谓词LIKE可以用来进行字符串的匹配。其一般语法格式如下: [NOT] LIKE '<匹配串>' [ESCAPE '<换码字符>'] <匹配串>可以是一个完整的字符串,也可以含有`通配符%和_。字符匹配规则如下: %(百分号)代表任意长度的字符串。 例如a%b表示以a开头,以b结尾的任意长度的字符串,如abc、abdewc、ab等都满足该匹配串 _(下划线)代表任意单个字符 例如a_b表示以a开头,以b结尾的长度为3的任意字符串。如abc、afb等都满足该匹配串。 例1:查询所有姓“刘”的学生的学号、姓名和性别 SELECT Sname,Sno,Ssex FROM Student WHERE Sname LIKE '刘%'; 例2:查询姓“欧阳”且全名为三个字的学生的姓名和学号 SELECT Sname,Sno from Student WHERE Sname LIKE='欧阳_'; 例3:查询所有不姓“王”的学生的姓名、学号和性别 SELECT Sname,Sno,Ssex WHERE Sname NOT LIKE '王%'; 若用户要查询的字符串本身就含有通配符%或者_,这时就要使用ESCAPE ‘<换码字符>’短语对通配符进行转义了。 例1:查询DB_Design这门课程的课程号和学分 SELECT Cno,Ccredit FROM Course WHERE Cname='DB\_Designer' ESCAPE '\'; 例2:查询以“DB_”开头,且倒数第三个字符为i的课程的详细情况 SELECT * FROM Course WHERE Cname='DB\_%i__' ESCAPE '\'; 判断是否为空 IS NULL与IS NOT NULL用来判断条件是否为空 例:查询成绩表中只有选课记录却没有成绩的学生的学号和课程号 SELECT Sno,Cno FROM SC WHERE Grade IS NULL; 多重条件 逻辑运算符AND和OR可用来连接多个查询条件。其中AND的优先级高于OR,但可以通添加括号来改变优先级。 例:查询计算机系年龄在20岁以下的学生姓名 SELECT Sname FROM Student WHERE Sage<20; 3.分页查询 在进行表的查询时,若一次查询出来的数据数量很多的话,放在一个页面显示的话数据量太大,不如分页显示,每次显示n条,这就是分页查询。 要实现分页功能,实际上就是从结果集中显示第1~n条记录作为第1页,显示第n+1~2n条记录作为第2页,依次类推。 因此,分页实际上就是从结果集中“截取”出第M~N条记录。这个查询可以通过LIMIT <M> OFFSET <N>子句实现。 SELECT * FROM <表名> LIMIT <M> OFFSET <N>; 例:在学生表中查询第二页学生数据,每一页三项数据 SELECT * FROM Student LIMIT 4 OFFSET 6; 0x02.连接查询 ——待完成 0x03.嵌套查询 ——待完成 0x04.集合查询 ——待完成 0x05.基于派生表的查询 ——待完成 主要参考资料:《数据库系统概论(第5版)》 王珊 萨师煊 编著
2021年07月30日
1,575 阅读
0 评论
1 点赞
1
2