第4章_1——SQL语句实现MySQL增删改查

SQL语句实现MySQL的增删改查


文章目录

在学会了如何创建数据表之后,我们接下来所要学习的是如何通过SQL语句来对数据表进行操作(增删改查等)。

注:本章节中所使用的表的创建语句为如下。(要先创建好数据库book,之后便可复制直接用)

/*
 Navicat Premium Data Transfer

 Source Server         : demo
 Source Server Type    : MySQL
 Source Server Version : 80029
 Source Host           : localhost:3306
 Source Schema         : book

 Target Server Type    : MySQL
 Target Server Version : 80029
 File Encoding         : 65001

 Date: 27/07/2022 21:07:03
*/

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for 借书证
-- ----------------------------
DROP TABLE IF EXISTS `借书证`;
CREATE TABLE `借书证`  (
  `借书证编号` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
  `借阅者编号` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
  `姓名` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
  `办证日期` date NULL DEFAULT NULL,
  `读者类型` char(2) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT '(A、B、C分别表示不同的类型)',
  `借书证状态` char(1) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT '(T表示借书证可使用,F表示不可使用)',
  `证件类型` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '(证书类型分别为A1、A2、A3)',
  `证件编号` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
  `办证操作员` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
  PRIMARY KEY (`借书证编号`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = DYNAMIC;

-- ----------------------------
-- Records of 借书证
-- ----------------------------
INSERT INTO `借书证` VALUES ('TP7040202201', '9787125201556', '小明', '2022-01-01', 'A', 'T', 'A1', '9312568', '系统管理员');
INSERT INTO `借书证` VALUES ('TP7040202202', '9787125201982', '小红', '2022-02-08', 'A', 'F', 'A2', '9312569', '系统管理员');
INSERT INTO `借书证` VALUES ('TP7040202203', '9787125201832', '小凯', '2022-03-23', 'C', 'T', 'A3', '9312570', '系统管理员');
INSERT INTO `借书证` VALUES ('TP7040202204', '9787125201321', '李四', '2022-06-21', 'B', 'T', 'A1', '9312321', '系统管理员');
INSERT INTO `借书证` VALUES ('TP7040202205', '9787125202314', '王五', '2022-07-06', 'C', 'F', 'A1', '9312231', '系统管理员');

-- ----------------------------
-- Table structure for 出版社2
-- ----------------------------
DROP TABLE IF EXISTS `出版社2`;
CREATE TABLE `出版社2`  (
  `出版社ID` int NOT NULL AUTO_INCREMENT,
  `出版社名称` varchar(50) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
  `出版社简称` varchar(16) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
  `出版社地址` varchar(50) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
  `邮政编码` char(6) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
  PRIMARY KEY (`出版社ID`) USING BTREE,
  UNIQUE INDEX `出版社名称`(`出版社名称`) USING BTREE,
  UNIQUE INDEX `出版社简称`(`出版社简称`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 6 CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = DYNAMIC;

-- ----------------------------
-- Records of 出版社2
-- ----------------------------
INSERT INTO `出版社2` VALUES (1, '高等教育出版社', '高等教育', '北京市450号', '100011');
INSERT INTO `出版社2` VALUES (2, '人民邮电出版社', '人邮', '北京市38号', '100061');
INSERT INTO `出版社2` VALUES (3, '清华大学出版社', '清华大学', '北京市1250号', '100084');
INSERT INTO `出版社2` VALUES (4, '电子工业出版社', '电子工业', '北京市150号', '100006');
INSERT INTO `出版社2` VALUES (5, '机械工业出版社', '机械工业 ', '北京市750号', '100008');

-- ----------------------------
-- Table structure for 图书信息2
-- ----------------------------
DROP TABLE IF EXISTS `图书信息2`;
CREATE TABLE `图书信息2`  (
  `ISBN编号` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
  `图书名称` varchar(100) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
  `作者` varchar(40) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
  `价格` decimal(10, 0) NOT NULL,
  `出版社ID` int NOT NULL,
  `出版日期` date NULL DEFAULT NULL,
  `图书类型` varchar(2) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
  `封面图片` blob NULL,
  `图书简介` text CHARACTER SET utf8 COLLATE utf8_bin NULL,
  PRIMARY KEY (`ISBN编号`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = DYNAMIC;

-- ----------------------------
-- Records of 图书信息2
-- ----------------------------
INSERT INTO `图书信息2` VALUES ('9787121121201478', '软件工程基础', '陈承欢', 32, 4, '2014-07-01', '学习', NULL, '');
INSERT INTO `图书信息2` VALUES ('9787121201693', '实用工具软件', '陈丽丽', 31, 2, '2016-07-01', '工具', NULL, '');
INSERT INTO `图书信息2` VALUES ('9787125201556', '数据库基础软件实例教程', '刘国良', 18, 4, '2015-05-06', '教程', NULL, '');
INSERT INTO `图书信息2` VALUES ('9787125201632', '网页设计', '陈欢欢', 36, 2, '2016-09-08', '学习', NULL, '');
INSERT INTO `图书信息2` VALUES ('9787125201735', 'web 前端基础', '王青青', 26, 2, '2017-03-05', '学习', NULL, '');

-- ----------------------------
-- Table structure for 图书借阅
-- ----------------------------
DROP TABLE IF EXISTS `图书借阅`;
CREATE TABLE `图书借阅`  (
  `借阅ID` int NOT NULL AUTO_INCREMENT,
  `借书证编号` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
  `图书编号` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
  `借出数量` smallint NOT NULL,
  `借出日期` date NOT NULL,
  `应还日期` date NOT NULL,
  `借阅操作员` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
  `归还操作员` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
  `图书状态` char(1) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT '(T表示已借阅,F表示未借阅)',
  PRIMARY KEY (`借阅ID`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 6 CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = DYNAMIC;

-- ----------------------------
-- Records of 图书借阅
-- ----------------------------
INSERT INTO `图书借阅` VALUES (1, 'TP7040202201', '9787121121201478', 1, '2022-02-01', '2022-03-01', '系统管理员', '系统管理员', 'T');
INSERT INTO `图书借阅` VALUES (2, 'TP7040202205', '9787125201556', 1, '2022-05-04', '2022-07-01', '系统管理员', '系统管理员', 'T');
INSERT INTO `图书借阅` VALUES (3, 'TP7040202203', '9787125201735', 1, '2022-02-09', '2022-07-25', '系统管理员', '系统管理员', 'T');
INSERT INTO `图书借阅` VALUES (4, 'TP7040202201', '9787125201556', 1, '2022-07-07', '2022-07-31', '系统管理员', '系统管理员', 'T');
INSERT INTO `图书借阅` VALUES (5, 'TP7040202204', '9787121201693', 1, '2022-06-09', '2022-07-22', '系统管理员', '系统管理员', 'T');

-- ----------------------------
-- Table structure for 学生
-- ----------------------------
DROP TABLE IF EXISTS `学生`;
CREATE TABLE `学生`  (
  `学号` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
  `姓名` varchar(15) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
  `性别` char(1) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
  `班级名称` varchar(15) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
  PRIMARY KEY (`学号`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = DYNAMIC;

-- ----------------------------
-- Records of 学生
-- ----------------------------
INSERT INTO `学生` VALUES ('A202220051', '小刚', '男', '22软件一班');
INSERT INTO `学生` VALUES ('A202220052', '小于', '男', '22软件二班');
INSERT INTO `学生` VALUES ('A202220053', '小红', '女', '22软件三班');

-- ----------------------------
-- Table structure for 教师
-- ----------------------------
DROP TABLE IF EXISTS `教师`;
CREATE TABLE `教师`  (
  `职工编号` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
  `姓名` varchar(15) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
  `性别` char(1) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
  `部门名称` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
  PRIMARY KEY (`职工编号`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = DYNAMIC;

-- ----------------------------
-- Records of 教师
-- ----------------------------
INSERT INTO `教师` VALUES ('JX9811', '徐老师', '男', '班主任');
INSERT INTO `教师` VALUES ('JX9812', '赵老师', '男', '体育部');
INSERT INTO `教师` VALUES ('JX9813', '王老师', '女', '艺术部');

-- ----------------------------
-- Table structure for 藏书信息
-- ----------------------------
DROP TABLE IF EXISTS `藏书信息`;
CREATE TABLE `藏书信息`  (
  `图书编号` char(12) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
  `ISBN编号` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
  `总藏书量` smallint NOT NULL,
  `剩余数量` smallint NOT NULL,
  `藏书位置` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
  `入库时间` date NULL DEFAULT NULL
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = DYNAMIC;

-- ----------------------------
-- Records of 藏书信息
-- ----------------------------
INSERT INTO `藏书信息` VALUES ('TP7040302363', '9787125201556', 30, 25, 'A-1-2', '2017-08-08');
INSERT INTO `藏书信息` VALUES ('TP7045241706', '9787125201632', 20, 20, 'A-1-1', '2017-09-09');
INSERT INTO `藏书信息` VALUES ('TP7040273144', '9787121121201478', 30, 30, 'A-1-1', '2015-06-10');
INSERT INTO `藏书信息` VALUES ('TP7040281286', '9787121201693', 20, 18, 'A-1-1', '2016-09-01');
INSERT INTO `藏书信息` VALUES ('TP1211025981', '9787125201735', 35, 30, 'A-1-2', '2017-12-11');
INSERT INTO `藏书信息` VALUES ('TP1156589325', '9781156589325', 32, 25, 'A-1-1', '2018-05-06');
INSERT INTO `藏书信息` VALUES ('TP1116589546', '9781116589546', 42, 42, 'A-1-3', '2018-04-09');

-- ----------------------------
-- Table structure for 读者类型
-- ----------------------------
DROP TABLE IF EXISTS `读者类型`;
CREATE TABLE `读者类型`  (
  `读者类型编号` char(2) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
  `读者类型名称` varchar(30) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
  `限借数量` smallint NOT NULL,
  `限借期限` smallint NOT NULL,
  `续借次数` smallint NOT NULL,
  `借书证有效期` smallint NOT NULL,
  `超期日罚金` double NOT NULL,
  PRIMARY KEY (`读者类型编号`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of 读者类型
-- ----------------------------
INSERT INTO `读者类型` VALUES ('01', '系统管理员', 30, 360, 5, 5, 1);
INSERT INTO `读者类型` VALUES ('02', '图书管理员', 20, 180, 5, 5, 1);
INSERT INTO `读者类型` VALUES ('03', '特殊读者', 30, 360, 5, 5, 1);
INSERT INTO `读者类型` VALUES ('04', '一般读者', 20, 180, 3, 3, 1);
INSERT INTO `读者类型` VALUES ('05', '教师', 20, 180, 5, 5, 1);
INSERT INTO `读者类型` VALUES ('06', '学生', 10, 180, 2, 3, 0.5);

SET FOREIGN_KEY_CHECKS = 1;

一、Select语句的语法格式及其功能

1、Select语句的一般格式

​ Select语句的一般格式如下:

Select			<字段名或表达列表>
From			<数据表名或视图名>
Where			<检索条件表达式>
Group By		<分组的字段名或表达式>
Having			<筛选条件>
Order By		<排序的字段名或表达式>  ASC(表升序)|DESC(表降序)

2、Select语句的功能

  根据Where子句的检索条件表达式,从From子句指定的数据表中找出满足条件的记录,再按Select子句选出记录中的字段值,把查询结果以表格的形式返回。

3、Select语句的说明

  Select关键字后面跟随的是要检索的字段列表,并且指定字段的顺序。SQL查询子句顺序为Select、Into、From、Where、Group By、Having和Order By等。其中,Select子句和From子句是必需的,其余的子句都可以省略,而Having子句只能和Group By子句搭配起来使用。From子句返回初始结果集,Where子句排除不满足搜索条件的行,Group By子句将选定的行进行分组,Having子句排除不满足分组聚合后搜索条件的行。

  ① From子句是Select语句所必需的子句,用于标识从中检索数据的一个或多个数据表或试图。

  ② Where子句用于设定检索条件以返回需要的记录。(可以理解为Java中的if判断语句)

  ③ Group By子句用于将查询结果按指定的一个字段或多个字段的值进行分组统计,分组字段或表达式的值相等的被分为同一组。

  ④ Having子句与Group By子句配合使用,用于对由Group By子句分组的结果进一步限定搜索条件。,

  ⑤ Order By子句用于将查询结果按指定的字段进行排序。排序包括升序和降序,其中ASC表示记录按升序排序,DESC表示记录按降序排序,默认情况下,记录按升序方式排列。

二、使用Select语句实现查询

1、查询时选择与设置列

  Select语句使用通配符“ * ”选择数据表中所有的字段,使用“All”选择所有记录,“All”一般省略不写。Select关键字与第一个字段名之间使用半角空格分隔(可使用多个),其效果等效于一个空格。SQL语句中各部分之间必须使用空格分隔,SQL语句中的空格必须是半角空格,如果输入全角空格,则会出现错误提示信息。

注意:

​ SQL查询语句中尽量避免使用 “ * ” 表示输出所有的字段,其原因是使用 “ * ” 输出所有的字段,不利于代码的维护,该语句并没有表明,哪些字段正在实际使用,这样当数据库的模式发生改变时,不容易只有已编写的代码将会怎样改变。所以明确地指出要在查询中使用的字段可以增加代码的可读性,并且代码更易维护。当对表的结构不太清楚时,或要快速查看表中的记录时,使用 “ * ” 表示输出所有列是很方便的。

  使用Select语句查询时,返回结果中的列标题与表或试图中的列名相同。Select语句中Select关键字后面可以使用表达式作为检索对象,表达式可以出现的检索的字段列表的任何位置。如果是表达式是数学表达式,则显示的结果是数学表达式的计算结果。

(1)查询所有字段和使用Limit关键字查询限定数量的记录

查询所有字段自然是不用解释了!其是最简单的SQL语句,如下所受:

select * from 数据表;

对于Limit关键字,有两种使用方式:

  1. 不指定初始位置:

    当Limit关键字不指定初始位置时,记录从第1条开始显示,显示记录的数量由Limit关键字指定,其语法格式为:

    Limit <记录数量>
    
  2. 指定初始位置:

    Limit关键字可以指定从哪一条记录开始显示,并且可以指定显示多少条记录。其语法格式为:

    Limit <初始位置> , <记录数量>
    

例如:查询”出版社2“表中的数据

-- 一式
SELECT *
FROM `出版社2`;

-- 二式
SELECT  *
FROM `出版社2`
LIMIT 3;	
-- 补充:
-- LIMIT 子句可以被用于强制 SELECT 语句返回指定的记录数。LIMIT 接受一个或两个数字参数。
-- 当只有一个参数的时候,表示的是总共取满多少组数据
-- 同时在只有一个参数时,是按正常顺序进行计算的,即第一个,第二个,...

-- 三式
-- 当LIMIT子句后有两个参数时,就代表的是从第几个数据开始取,到第几个数据结束取
-- 但对于只有一个参数时相比,有两个参数时,它计数方式是和Java中的数组相同,亦是从0开始计数
SELECT *
FROM `出版社2`
LIMIT 1,2;
-- 参数必须是一个整数常量。如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。

结果一:

在这里插入图片描述

结果二:

在这里插入图片描述

结果三:

在这里插入图片描述

  以上中一式是查询整张出版社2这张表;二式中的”LIMIT 3“指的是从下标0开始取满3组数据;三式中的Limit有两个参数,前一个参数表示的是从哪里开始查询,第二个参数表示的是总共取多少组数据。

(2)查询指定字段、经过计算后的字段和查询数据时使用别名(AS/as)

   对于查询,我们有时候并不需要得到全部的数据,只需要数据中的一部分而已,这个时候就要指定字段了。查询时可以使用**“As”关键字来为查询中的字段或表达式指定标题名称,这些名称既可以用来改善查询输出的外观**,又可以用来为一般情况下没有标题名称的表达式分配名称,称为**“别名”**。使用As为字段或表达式分配标题名称,只是改变输出结果中的列标题的名称,对该列显示的内容没有任何影响。使用As为字段和表达式分配标题名称相对于实际的列名,是可以再被其他的SQL语句使用的。

例如:查询“图书信息2“表中图书名称、作者和出版日期。

-- 一式
SELECT 图书名称,作者,出版日期
FROM `图书信息2`;

-- 二式
SELECT ISBN编号 AS ISBN,图书名称 AS bookName,出版社ID AS publishingHouse
FROM `图书信息2`;

结果一:

在这里插入图片描述

结果二:

在这里插入图片描述

(3)对于Order By的使用

  对于Order By的使用,其实就只要记住ASC(表升序)DESC(表降序)这两个即可。

格式为:Order By 表中的某个字段 ASC或DESC

SELECT *
FROM `出版社2`
ORDER BY `出版社ID` DESC;
-- 这是查询出版社2表中的所有数据,输出的结果是按“出版社ID”倒序的顺序输出的。
-- 如果将DESC改成ASC时,那么输出的结果将是按“出版社ID”正序的顺序输出的。

在这里插入图片描述

(4)查询时数据的分组与汇总

   一般情况下,使用统计函数返回的是所有行数据的统计结果,如果需要按某一列数据值进行分类,在分类的基础上再进行查询,就要使用Group By子句。如果要对分组或聚合指定查询条件,则可以使用Having,该子句用于限定对统计组的查询,一般与Group By子句一起使用,对分组数据进行过滤。

-- 一式
-- 使用GROUP BY进行分组(对于其中的聚合函数后面会解释)
SELECT	出版社ID,AVG(价格) AS 平均定价,COUNT(*) AS 图书种类
FROM `图书信息2`
GROUP BY `出版社ID`;	-- 以出版社ID进行分组

-- 二式
-- 不使用GROUP BY
SELECT 出版社ID,AVG(价格) AS 平均定价,COUNT(*) AS 图书种类
FROM `图书信息2`;
-- 根据以上两个查询的结果可以得出:GROUP BY的用法

-- 三式
SELECT	出版社ID,AVG(价格) AS 平均定价,COUNT(*) AS 图书种类
FROM `图书信息2`
GROUP BY `出版社ID` HAVING AVG(价格) > 20 AND COUNT(*) > 1
ORDER BY 平均定价 DESC;
-- 对于这个查询的理解:先以出版社ID进行分组,然后再通过Having汇总限定。

结果一:

在这里插入图片描述

结果二:

在这里插入图片描述

结果三:

在这里插入图片描述

知识点补充:

  • Group By子句可以和Where子句结合在一起使用,但必须保证Where子句必须在Group By之前。(其实这很好理解,只有先筛选出满足条件的,才能进行下一步的分组);
  • Having只能用在Group By之后,对分组后的结果进行筛选(即使用Having的前提条件是分组);
  • Where是对记录的限定,Having是对分组后的限定;
  • Where子句后的条件表达式里不能使用聚合函数,而Having可以(也就是说,当使用到聚合函数时,就必须要使用到Group By)。

2、查询时选择行

Where子句的描述

  Where子句后面是一个逻辑表达式表示的条件,用来限制Select语句检索的记录,即查询结果中的记录都应该是满足该条件的记录。使用Where子句并不会影响所要检索的字段,Select语句要检索的字段由Select关键字后面的字段列表决定。数据表中所有的字段都可以出现在Where子句的表达式中,不管它是否出现在检索的字段列表中。

Where子句后面的逻辑表达式中可以使用以下各种运算符。

(1)比较运算符

  对于这种运算符的使用,不必做过多的解释。特别记住:当比较运算符连接的数据类型不是数字时,要用单引号把比较运算符后面的数据引起来,并且两边运算符两边表达式的数据类型必须保持一致。(=、<>、!=、<、>、<=、>=、<=>等

SELECT 出版社ID,出版社名称
FROM `出版社2`
WHERE `出版社ID`>=3;
-- 这里查询的结果为:
-- 输出“出版社ID”大于等于3的“出版社ID”、“出版社名称”这俩列的数据。

这里补充一个知识点:关于+号的。

在Java中,“+”号有两种用法:第一种是做运算符的,用来去计算数值类型的第二种是做拼接的,用来拼接字符串的。而在MySQL中,“+”号只有一种用法,那就是做运算符。当出现字符串时,会试图将字符串类型转换成数值类型。如果转换成功,则继续做加法运算,就比如:select “123” + 90,得到的结果是“213”;如果没有转换成功,则会将字符串类型转换成0,就比如:select “name” + 90,得到的就是90。还有当出现null时,则其结果肯定为null,如:select null + 90这种情况。

(2)逻辑运算符

​  逻辑与And表示多个条件都为真时才返回结果,逻辑或Or表示多个条件中有一个条件为真就返回结果,逻辑非Not表示当表达式不成立时才返回结果。(And或&&、Or或||、Not或!、Xor)

SELECT ISBN编号,图书名称,价格,出版日期
FROM `图书信息2`
WHERE `价格` >= 30 AND YEAR(`出版日期`)>=2014;
-- 输出的结果为:价格大于等于30的并且出版日期大于等于2014
(3)模糊匹配运算符

  在Where子句中,使用字符匹配符LikeNot Like可以把表达式与字符串进行比较,从而实现模糊查询。所谓模糊查询就是查找数据表中与用户输入关键字相近或相似的记录信息,模糊匹配通常与通配符一起使用,使用通配符时必须将字符串和通配符都用单引号引起来。MySQL提供了如下所示的模糊匹配的通配符。

通配符含义示例
%表示0~n个任意字符‘XY%’:匹配以XY开始的任意字符串。‘%X’:匹配以X结束的任意字符。‘X%Y’:匹配包含XY的任意字符串。
_表示单个任意字符‘_X’:匹配以X结束的2个字符的字符串。
-- 目的是:查找姓陈的作者
SELECT ISBN编号,图书名称,作者,价格
FROM `图书信息2`
-- WHERE `作者`  LIKE  '陈%';
WHERE `作者`  LIKE '陈__';
-- 以上两种写法都可以

在这里插入图片描述

由以上的代码可以得出:模糊匹配运算符一般用于查询以某个姓氏开头的或者年份等。

(4)范围运算符

  Where子句可以使用范围运算符指定查询范围,当要查询的条件是某个值的范围时,可以使用Between关键字

  在Where子句中,使用In关键字可以方便地限制检查数据的范围。使用In关键字可以确实表达式的取值是否属于某一值列表,当与值表中的任一匹配时,即返回true,否则返回false。同样,如果查询表达式不属于某一值列表时可使用Not In关键字。(Between、Not Between、In、Not In

SELECT ISBN编号,图书名称,价格,出版社ID
FROM `图书信息2`
WHERE 价格 BETWEEN 20 AND 36; -- 表示的是取在[20,36]范围内的数据

SELECT ISBN编号,图书名称,价格,出版社ID
FROM `图书信息2`
WHERE 价格 IN(26,31,35,40); -- 表示的是取符合括号内的
(5)空值比较运算符

  空值比较运算符一共只有两个,分别是Is Null和Is Not Null。这两个运算符的意思很简单,分别是判断这一列是空的数据;判断这一列不是空的数据。

SELECT ISBN编号,图书名称,价格,出版社ID
FROM `图书信息2`
WHERE 图书简介 IS NOT NULL; -- 表示的是寻找到在图书简介这一列中不是空的数据
(6)子查询比较运算符(重要)

(All、Any、Some)这些将在之后会学习。

3、查询时结果不重复

  当我们查询数据时,有时候查询到的数据中有重复的,但是我们并不需要重复的,那么该怎么办?这个时候就要使用到一个关键字Distinct了,它可以实现去重。这个要牢牢记住!

-- 一式
-- 就比如上图中的图书信息2表,我们查询该表中的出版社ID:
SELECT 出版社ID
FROM `图书信息2`;
-- 这样得到的是有重复的数据。

-- 二式
-- 我们可以使用Distinct关键字,它可以将重复的值清除掉。
SELECT DISTINCT 出版社ID
FROM `图书信息2`;
-- 这样即可。

结果对比如下所示:

在这里插入图片描述

4、使用聚合函数查询

  聚合函数对一组数据值进行计算并返回单一值,所以也被称为组合函数。Select子句中可以使用聚合函数进行计算,计算结果作为新列出现在查询结果集中。在聚合运算的表达式中,可以包括字段名常量以及运算符连接起来的函数。以下便是常用的聚合函数:

函数名功能
Count(*)统计数据表中的总记录数
Avg计算各个字段值的平均值
Max计算表达式的最大值
Count统计满足条件的记录数
Sum计算所有字段值的总和
Min计算表达式的最小值

  在使用聚合函数时,Count、Sum、Avg可以使用Distinct关键字,以保证计算时不包含重复的行。

注意:在Where子句中不能使用聚合函数。

-- 一式
Select Count(*) As 图书种类
From 图书信息2
Where 价格 Between 20 And 45;

-- 二式
Select SUM(总藏书量) As 藏书总数量
From 藏书信息;

5、创建多表连接查询

  之前,我们所学的查询都只是基于单表查询。现在,我们将要学习多表连接查询。

  实现从两个或两个以上数据表中查询数据且结果集中出现的字段来自于两个或两个以上的数据表的检索操作称为连接查询。连接查询实际上是通过各个数据表之间的共同字段的相关性来查询数据的,首先要在这些数据表中建立连接,然后从数据表中查询数据。

  连接的类型分为内连接外连接交叉连接。其中,外连接包括左外连接右外连接全外连接3种。

​ 连接查询的格式有以下两种。

格式一:

Select<输出字段或表达式列表>
From<1><2>
[Where<1.列名> <连接操作符> <2.列名>]

连接操作符可以是=、<>、!=、>、<、<=、>=,当操作符是“=”时表示等值连接。

格式二:

Select <输出字段或表达式列表>
From <1> <连接类型> <2> [On(<连接条件>)]

  连接类型用于指定所执行的连接类型,内连接为Inner Join,外连接为Out Join,交叉连接为Cross Join,左外连接为Left Join,右外连接为Right Join,完整外连接为Full join。(交叉连接又称为笛卡尔积,返回的结果集的行数等于第1个数据表的行数乘以第2个数据表的行数。交叉连接只用于测试一个数据库的执行效率,一般情况下很少用)

  在<输出字段或表达式列表>中使用多个数据表来源且有同名字段时,就必须明确定义字段所在的数据表名称。

(1)创建基本连接查询

  所谓的基本连接查询其实就是Select语句的字段名或表达式列表中引用多个数据表的字段,其From子句中用半角逗号","将多个数据表的名称隔开。使用基本连接操作时,一般使用主表中的主键字段与从表中的外键字段保持一致,以保持数据的参照完整性。

-- 使用基本连接查询ISBN编号,图书名称,价格,出版社名称,出版日期,出版社地址
-- 由于这些字段在各自表都是
SELECT ISBN编号,图书名称,价格,出版社名称,出版日期,出版社地址
-- 来自以下两张表
FROM `图书信息2`,`出版社2`
-- 通过两表中共同有的字段出版社ID进行连接(也就是根据图书信息2的出版社ID去出版社2中查找到出版社名称)
WHERE `图书信息2`.`出版社ID` = `出版社2`.`出版社ID`;

在这里插入图片描述

(2)多表连接查询

  在多个数据表之间创建连接查询与在两个数据表之间创建连接查询相似,只是在Where子句中需要使用到And关键字来连接两个连接条件。这个一般都是用在三表以上的连接。

-- 查询图书编号,ISBN编号,图书名称,出版社名称,总藏书量
SELECT 图书编号,`藏书信息`.`ISBN编号`,图书名称,出版社名称,总藏书量
FROM `藏书信息`, `图书信息2`, `出版社2`
WHERE `藏书信息`.`ISBN编号` = `图书信息2`.`ISBN编号`
AND `图书信息2`.`出版社ID` = `出版社2`.`出版社ID`;

在这里插入图片描述

创建多表连接,要找出中间连接,也就是找出即能连接前一个表,也能连接后一个表。

(3)创建内连接查询

  内连接是组合两个表的常用方法。内连接使用比较运算符进行多个源表之间数据的比较,并返回这些源表中与连接条件相匹配的数据行。一般使用Join或者Inner Join关键字实现内连接。内连接执行连接查询后,要从查询结果中删除在其他表中没有匹配行的所有记录,所以使用内连接可能不会显示数据表的所有记录。

  内连接可以分为等值连接、非等值连接和自然连接

1、等值连接查询

在连接条件中使用**“=”**比较运算符的连接操作称为等值连接。

-- 题目:查询“借书证”和“图书借阅”中的姓名,借书证编号,图书编号,借出数量
SELECT 姓名, `图书借阅`.借书证编号, 图书编号, 借出数量
FROM `借书证` Inner Join 图书借阅
On `借书证`.`借书证编号` = `图书借阅`.`借书证编号`;

在这里插入图片描述

2、非等值连接查询

在连接条件中使用其他运算符(包括<、>、<=、>=、<>、Between等)的内连接称为非等值连接。

-- 这是使用内连接的非等值连接
-- 题目:查询“图书信息2”和“藏书信息”中出版日期在2014年1-1到2016年9-9(包括入库时间),并且价格在30元以上的“学习”类型的图书信息(包括总藏书量)
-- 查询出它们的ISBN编号,图书名称,作者,价格,出版日期、图书类型、总藏书量和入库时间
SELECT `图书信息2`.`ISBN编号`, 图书名称, 作者, 价格, 出版日期, 图书类型, 总藏书量, 入库时间
FROM `图书信息2`
INNER JOIN `藏书信息`
ON `图书信息2`.`ISBN编号` = `藏书信息`.`ISBN编号`
AND 出版日期 BETWEEN "2014-1-1" AND "2016-9-9"
AND 入库时间 BETWEEN "2012-1-1" AND "2017-9-9"
AND 价格 >= 30
AND 总藏书量 >= 20
AND 图书类型 = "学习";

在这里插入图片描述

3、自然连接

当等值连接中的连接字段相同,并且在Select语句中去除了重复字段时,该连接操作称为自然连接。自然连接不需要连接条件。

SELECT 姓名,图书编号,借出数量
FROM `借书证`
NATURAL JOIN 图书借阅;
(4)创建外连接查询

  在内连接中,只有在两个数据表中匹配的记录才能在结果集中出现。而在外连接中可以只限制一个数据表,而对另一个数据表不加限制(即所有的行都出现在结果集中)。参与外连接查询的数据表有主从表之分,主表的每行数据去匹配从表中的数据行,如果符号连接条件,则直接返回到查询结果中。如果主表中的行在从表中没有找到匹配的行,那么主表的行仍然保留,相应的,从表中的行被填入Null值并返回到查询结果中。

  外连接分为左外连接、右外连接和全外连接。只包括左表的所有行、不包括右表的不匹配行的外连接称为左外连接;只包括右表的所有行,不包括左表的不匹配行的外连接称为右外连接;既包括左表不匹配的行,又不包括右表不匹配的行的连接称为全外连接。

1、左外连接查询

  在左外连接查询中左表就是主表右表就是从表。左外连接返回关键字Left Join左边的表中所有的行,但是这些行必须符合查询条件。如果左表的某些数据行没有在右表中找到相对应的匹配数据行,则结果集中右表的对应位置填入Null。

-- 创建左外连接查询
-- 从“藏书信息”和“图书信息”两表中查询图书编号,图书名称,作者,价格
SELECT 图书编号,图书名称,作者,价格
FROM `藏书信息`
LEFT JOIN `图书信息2`
ON `藏书信息`.`ISBN编号` = `图书信息2`.`ISBN编号`;
-- 对于结果,由于有两个图书编号于图书信息2表中是没有的,所以需要在相应的位置填入null

在这里插入图片描述

2、右外连接查询

  在右外连接查询中右表就是主表左表就是从表。右外连接返回关键字Right Join右边的表中所有的行,但是这些行必须符合查询条件。如果右表的某些数据行没有在左表中找到相对应的匹配数据行,则结果集中左表的对应位置填入Null。

-- 创建右外连接查询
-- 从“图书信息2”和“出版社2”两表中查询ISBN编号,图书名称,出版社名称,出版社地址,出版日期
SELECT ISBN编号,图书名称,出版社名称,出版社地址,出版日期
FROM `图书信息2`
RIGHT JOIN `出版社2`
ON `图书信息2`.`出版社ID` = `出版社2`.`出版社ID`;

在这里插入图片描述

6、Union语句的使用

  我们可以通过使用Union语句来创建多表联合查询。

  联合查询指将多个不同的查询结果连接在一起组成一组数据的查询方式。联合查询使用Union关键字连接各个Select子句,联合查询不同于对两个数据表中的字段进行连接查询,而是组合两个数据表中的行。使用Union关键字进行联合查询时,应保证联合的数据表中具有相同数量的字段,并且对应的字段应具有相同的数据类型,或者可以自动将其转换为相同的数据类型。在自动转换数据类型时,对于数值类型,系统将低精度的数据类型转换为高精度的数据类型。

-- 使用联合查询将两个数据表的数据合并(教师数据在前,学生数据在后),联合查询时增加1个新列“借阅者类型”,其值分别为“教师”和“学生”,查询结果中“职工编号”和“学号”对应的字段名修改为“借阅者编号”
Select 职工编号 As 借阅者编号, 姓名, 性别, 部门名称, '教师' As 借阅者类型
From 教师
Union All Select 学号, 姓名, 性别, 班级名称, '学生' From 学生;

在这里插入图片描述

  使用Union运算符将两个或多个Select语句的结果组合成一个结果集时,可以使用关键字“All”,指定结果集中将包含所有行而不删除重复的行。如果省略All,则将从结果集中删除重复的行。使用Union联合查询时,结果集的字段名与Union运算符中第1个Select语句的结果集中的字段名相同,另一个Select语句的结果集的字段名将被忽略。

7、创建子查询/嵌套查询

  在SQL语句中,将一条Select语句作为另一条Select语句的一部分,这称为嵌套查询,也可以称为子查询。外层的Select语句称为外部查询,内层的Select语句称为内部查询。其实,所谓的嵌套查询就是一种比较特殊的表连接查询。

注意:

嵌套查询是按照逻辑顺序由里向外执行的,即先处理内部查询,然后将结果作为外部查询的查询条件(这与Java和JavaScript的嵌套是不同的,它们是从外向里执行的,也就是从上到下一层一层的执行)。SQL允许使用多层嵌套查询,即在子查询中还可以嵌套其他子查询。

(1)单值嵌套查询

单值嵌套就是通过子查询返回一个单一的数据值。当子查询返回的结果是单个值时,可以使用比较运算符参加相关表达式的运算。

-- 以下是单值子查询的实例
-- 题目:查询图书“软件工程基础”的出版社ID和出版社名称
SELECT 出版社ID,出版社名称
FROM `出版社2`
WHERE `出版社ID` = (
		SELECT `出版社ID`
		FROM `图书信息2`
		WHERE 图书名称 = "软件工程基础"
);

在这里插入图片描述

  对以上进行分析:我们要查询的出版社ID出版社名称都在出版社2这张表中,而查询的条件却在图书信息2这张表中。我们可以将两张表连接一起后进行查询,但是没有那个必要。因为我们所需要的数据都只在一张表中,所以我们使用子查询。

【问题】:什么时候用子查询?

当所要查询的数据在一张表,而查询的条件在另一种表时,就可以使用子查询。**注:**处于外层查询的是目标表,而处于内层查询的是条件表。

(2)使用In关键字创建子查询

  子查询的返回结果是多个值的嵌套查询称为多值嵌套查询。多值嵌套查询经常使用In操作符,In操作符可以测试表达式的值是否与子查询返回结果集中的某一个值相等,如果列值与子查询的结果一致或存在与其匹配的数据行,则查询结果集中就包含该数据行。

-- 以下是多值嵌套查询的实例
-- 查询作者“陈承欢”,“刘国良”,“王青青”的ISBN编号,图书名称,价格,出版社名称,出版社简称,出版社ID
SELECT 出版社名称,出版社简称,出版社ID
FROM `出版社2`
WHERE `出版社ID` IN(
		SELECT `出版社ID`
		FROM `图书信息2`
		WHERE 作者 IN('陈承欢','刘国良','王青青')
);

在这里插入图片描述

(3)使用Exists关键字创建子查询

  使用“Exists”关键字创建子查询时,内层查询语句不返回查询的记录,而是返回一个逻辑值。如果内层查询语句查询到满足条件的记录,就返回一个逻辑真(true),否则返回一个逻辑假(false)。当内层查询返回的值为true时,外层查询可继续进行查询,返回符号条件的记录;反之,若符合是发false,则将不再进行查询。

  “Exists”关键字还可以与Not结合使用,即“Not Exists”,其返回值与“Exists”正好相反。(其实这和Java中的布尔类型是很相似的)

-- 使用Exists关键字创建子查询
-- 查询借书证的全部数据
SELECT *
FROM `借书证`
WHERE EXISTS(
	SELECT *
	FROM 图书借阅
	WHERE `借书证`.`借书证编号` = 图书借阅.`借书证编号`
);

-- 使用Not Exists关键字创建子查询
-- 查询借书证的全部数据
SELECT *
FROM `借书证`
WHERE NOT EXISTS(
	SELECT *
	FROM 图书借阅
	WHERE `借书证`.`借书证编号` = 图书借阅.`借书证编号`
);

-- 以上的结果分别是:前一个是得到全部数据,后一个则是得到空

结果一:

在这里插入图片描述

结果二:

在这里插入图片描述

(4)使用Any关键字创建子查询

  Any与Some关键字是同义词,表示满足其中任一条件。使用Any关键字时,表达式只要与子查询结果集中的某个值满足比较的关系时,就返回true,否则返回false。只有内层查询语句返回结果中的任何一个满足比较关系,就可以通过该条件来执行外层查询语句。Any关键字通常与比较运算符一起使用,如“>Any”表示大于任何一个值,“=Any”表示等于任何一个值。

-- 首先是对Any关键字的使用
-- 查询图书信息2表中价格不低于出版社ID为4的数据
SELECT ISBN编号,图书名称,价格
FROM `图书信息2`
WHERE 价格 >ANY(
	SELECT `价格`
	FROM `图书信息2`
	WHERE `出版社ID` = 2
);

SELECT ISBN编号,图书名称,价格
FROM `图书信息2`
WHERE 价格 >(
	SELECT MIN(价格)
	FROM `图书信息2`
	WHERE `出版社ID` = 2
);

在这里插入图片描述

以上最终得到的结果是相同的。由此我们可以推演出:使用Any关键字时,若是大于,则表示只要大于最小的那个即可;若是小于,则表示只要小于最大那个即可。这就是Any关键字的用法和理解。

(5)使用All关键字创建子查询

  All关键字表示满足所有条件,使用All关键字时,只有满足内层查询语句返回的所有结果,才可以执行外层查询语句。All关键字经常与比较运算符一起使用,如“>All”表示大于所有值,“<All”表示小于所有值。

  All关键字与Any关键字的使用方式相同,但二者有很大的区别。使用Any关键字时,只要满足内层查询返回结果中的任何一个,就可通过该条件来执行外层查询语句。而All关键字正好相反,只有满足内层查询语句返回的所有查询结果,才可以执行外层查询语句。

-- 查询图书信息2表中价格高于出版社ID为4的数据——ISBN编号,图书名称,价格
SELECT ISBN编号,图书名称,价格
FROM `图书信息2`
WHERE 价格 >ALL(
		SELECT `价格`
		FROM `图书信息2`
		WHERE `出版社ID` = 4
);

SELECT ISBN编号,图书名称,价格
FROM `图书信息2`
WHERE 价格 >(
		SELECT MAX(`价格`)
		FROM `图书信息2`
		WHERE `出版社ID` = 4
);

在这里插入图片描述

以上最终得到的结果是相同的。由此我们可以推演出:使用All关键字时,若是大于,则表示只要大于最大的那个即可;若是小于,则表示只要小于最小那个即可。这就是All关键字的用法和理解。

(七)小结:

  这一部分的重点自然是学会如何去查询表中的数据。首先要记住的是查询中Select和From语句是必不可少的,这是不能省略的,其他都可以不写(非必要);第二:就是要熟练的使用SQL语句去实现查询;第三:知道如何使用Distinct、Limit等关键字,还要掌握聚合函数的用法(千万要记住使用聚合函数的时候,是不能使用Where子句的);第四:学会进行多表连接查询,这是本章的核心之一;第五:学会创建子查询。

三、使用Delete语句实现删除

删除数据表中记录的语法格式如下:

Delete From <表明> [Where<条件表达式>];

  Delete语句中如果没有Where子句,则表示无条件,会将数据表中的所有记录都删除。如果包含Where子句,则只会删除符合条件的记录,其他记录不会被删除。

DELETE
FROM	`出版社2`
WHERE 出版社ID IN (1,2);
-- 删除出版社2中出版社ID分别为1和2的数据

四、使用Insert语句实现添加

  插入数据即向数据表中写入新的记录(数据表的一行数据错误一条记录)。相比于删除,插入的要求就比较严格了。插入的新记录必须完全遵守数据的完整性约束,所谓完整性约束指的是:新记录的中的数据类型、约束条件都必须与字段相同。若不满足任何一条,都可能导致插入记录不成功。

  在MySQL中,我们可以通过“Insert”语句来实现插入数据的功能。“Insert”语句有两种方式插入数据:插入特定的值,即所有的值都是在“Insert”语句中明确规定的;插入某查询的结果,结果指的是插入到数据表中的是那些值,“Insert”语句本身看不出来,完全由查询结果确定。

向数据表插入记录时需要注意的几点:

  • 插入字符型(Char和Varchar)和日期时间型(Date等)数值时,必须在值前后加半角单引号,只有数值型(Int、Float等)的值前后可不加单引号;
  • 对于Date类型的数值,插入时,必须使用“YYYY-MM-DD”的格式,且日期数据必须用半角单引号引起来;
  • 若某字段不允许为空,且无默认值约束,则表示向数据表插入一条记录时,该字段必须写入值,默认插入不成功。若某字段不允许为空,但它有默认值约束,则插入记录时自动使用默认值代替;
  • 若某字段设置为主键约束,则插入记录时不允许出现重复数值。

(1)插入一条记录

插入一条完整的记录可以理解为向数据表的所有字段插入数据,一般有以下两种方法可实现。

1.1、不指定字段,按默认顺序插入数值

在MySQL中,按默认的数值顺序插入数据的语法格式如下:

Insert Into <表名> Values(<1>, <2>, ... , <值n>);

这个方法需要注意的是:若某字段的值允许为空,且插入的记录该字段的值也为空或不确定,则必须在Values后面的对应位置写上Null。

  这个方法插入记录只指定数据表名,不指定具体的字段,按字段的默认顺序填写数据,然后插入记录,可以实现一次插入一条完整的记录,但不能实现插入一条不完整的记录。

1.2、指定字段名,按指定顺序插入数值

在MySQL中,按指定的顺序插入数值的语法格式如下:

Insert Into <表名> (<字段1>, <字段2>, ... , <字段n>) Values(<1>, <2>, ... , <值n>);

**注意:**该方法的Insert语句中的数据顺序与字段顺序的必须完全一致,但字段的排列顺序与数据表的字段排列顺序可以不一致。

  这种方法既可以实现插入一条完整记录,也可以实现插入一条不完整的记录。如果部分字段的值为空,在插入语句中可以不写出字段名及Null。

-- 插入一条记录
-- 向“读者类型”表中插入记录
-- 这是使用第一种插入的方法
-- INSERT INTO `读者类型`
-- VALUES('07','校外人员',30,180,2,2,2);

-- 这是使用第二种插入的方法
INSERT INTO `读者类型`(读者类型编号,读者类型名称,限借数量,限借期限,续借次数,超期日罚金,借书证有效期)
VALUES('07','校外人员',30,180,2,2,2);

(2)插入多条记录

在MySQL中,一次插入多条记录的语法格式如下:

Insert Into <表名> (<字段1>, <字段2>, ... , <字段n>) 
Values(<11>, <12>, ... , <1n>),
(<21>, <22>, ... , <2n>),
......
(<值m1>, <值m2>, ... , <值mn>);

  这种方法将所插入的多条记录的数据按相同的顺序写到Values后面,每一条记录对应值使用半角括号“()”括起来,且使用半角逗号“,”分隔。注意:一条Inset语句只能配一个Values关键字,如果要写多条记录,则只需要在取值列表(即小括号中的数据)后面再跟另一条记录的取值列表即可。

-- 插入的第二种形式
-- 一次插入多条完整记录
 INSERT INTO `读者类型`(读者类型编号,读者类型名称,限借数量,限借期限,续借次数,超期日罚金,借书证有效期)
VALUES('07','校外人员',30,180,2,2,2),
('08','工作人员',30,180,3,5,3),
('09','小孩子',30,250,5,5,0.5);

注意:对于自动编号的标识列的值不能使用Insert语句插入数据。

(3)插入查询语句的执行结果

将查询语句的执行结果数据插入到数据表中的语法格式如下:

Insert Into <表名> [<字段列表>] <Select语句>;

  这种方法必须合理地设置查询语句的结果字段顺序,并保证查询的结果值和数据表的字段相匹配,否则会导致插入数据不成功。

-- 先创建好数据表图书_total
Create Table 图书_total(出版社 varchar(50), 数量 smallint, 金额 float);

-- 插入的第三种形式——插入查询语句
-- 将一个数据表中的数据添加到另一个数据表中
INSERT INTO 图书_total
SELECT `出版社2`.出版社名称,
		SUM(`藏书信息`.总藏书量),
		SUM(`藏书信息`.总藏书量 * `图书信息2`.价格)
FROM `藏书信息`,`图书信息2`,`出版社2`
WHERE `藏书信息`.ISBN编号 = `图书信息2`.ISBN编号
AND	`图书信息2`.出版社ID = `出版社2`.出版社ID
GROUP BY `出版社2`.出版社名称;

在这里插入图片描述

五、使用Update语句实现修改

  数据表中已经存在的数据也可能需要修改,此时,我们可以只修改某个字段的值,而不用再去管其他数据。修改数据的操作可以看做把数据表先从行的方向上筛选出那些要修改的记录,然后将筛选出来的记录的某些字段的值进行修改。

修改数据用“Update”语句实现。其语法格式如下:

Update <表名> Set <字段名1> = <1>, <字段名2> = <2>, ... , <字段名n> = <值n> Where<条件表达式>;

对于修改也是可以细分的。修改也是很简单。

(1)修改单个数据

-- 首先添加数据,为后面的修改提高数据
-- INSERT INTO `出版社2`	VALUES('10','上海交通大学出版社','上海交大','上海市1038号','102091','7-132'),
-- 													('11','西安电子科技大学出版社','西安电子','西安市2000号','110077','7-152');
-- INSERT INTO `图书信息2`	VALUES('9787121201478','Java设计语言','刘威',10,2,'2017-02-28','学习',NULL,NULL);

-- 修改单个数据
-- 修改图书信息2表中的ISBN编号为9787121201478的价格
UPDATE `图书信息2`
SET 价格 = 20
WHERE `ISBN编号` = '9787121201478';

(2)修改多个数据

-- 修改多个数据
UPDATE `图书信息2`
SET 价格 = 30,`出版社ID` = 1,`图书简介` = '好书'
WHERE `ISBN编号` = '9787121201478';

(3)使用Top表达式更新多行数据

-- 使用Top表达式更新多行数据
UPDATE `藏书信息`
SET `藏书位置` = 'A-1-2' LIMIT 5;

六、总结

  对于MySQL中的SQL语句实现增删改查的这些知识,主要难点在于数据表的查询。对于简单的单表查询是没有什么问题的,难就难在当遇到多个表的情况要去查找,这个时候就需要依靠对多表联查的熟练才能完成。而对于删除、修改和插入,它们没有太多的变化,所以难,特别是删除,就一个语法。最后,对于这些,靠的就是练。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值