MySQL 数据库表的增删改查(进阶版)

目录

  • 1 数据库约束
    • 1.1 NOT NULL 约束
    • 1.2 UNIQUE 约束
    • 1.3 DEFAULT 约束
    • 1.4 PRIMARY KEY 约束
    • 1.5 FOREIGN KEY 约束
    • 1.6 CHECK 约束
  • 2 表的关系
    • 2.1 三大范式
    • 2.2 表的设计
      • 2.2.1 一对一 (1:1)
      • 2.2.2 一对多 (1:n)
      • 2.2.3 多对多 (m:n)
  • 3 进阶版CRUD操作
    • 3.1 新增(Create)
    • 3.2 查询(Retrieve)
      • 3.2.1 聚合查询
        • 3.2.1.1 聚合函数
          • 3.2.1.1.1 COUNT函数
          • 3.2.1.1.2 SUM函数
          • 3.2.1.1.3 AVG函数
          • 3.2.1.1.4 MAX函数
          • 3.2.1.1.5 MIN函数
        • 3.2.1.2 GROUP BY子句
        • 3.2.1.3 HAVING子句
      • 3.2.2 联合查询
        • 3.2.2.1 内连接
        • 3.2.2.2 外连接
        • 3.2.2.3 自连接
        • 3.2.2.4 子查询
          • 3.2.2.4.1 单行子查询
          • 3.2.2.4.2 多行子查询
          • 3.2.2.4.3 from子句中使用子查询
        • 3.2.2.5 合并查询

1 数据库约束

数据库的约束主要针对的是表中的字段。
约束类型:

  1. NOT NULL: 指示某列不能存储 NULL 值。
  2. UNIQUE: 保证某列的每行必须有唯一的值。
  3. DEFAULT: 规定没有给列赋值时的默认值。
  4. PRIMARY KEY: NOT NULL 和 UNIQUE 的结合。确保某列(或两个列多个列的结合)有唯一标识,有助于更容易更快速地找到表中的一个特定的记录。
  5. FOREIGN KEY: 保证一个表中的数据匹配另一个表中的值的参照完整性。
  6. CHECK: 保证列中的值符合指定的条件。对于MySQL数据库,对CHECK子句进行分析,但是忽略CHECK子句。

1.1 NOT NULL 约束

示例: 创建表时,可以指定某列不为空:

-- 重新设置学生表结构
DROP TABLE IF EXISTS student;
CREATE TABLE student (
   id INT NOT NULL,
   sn INT,
   name VARCHAR(20),
   qq_mail VARCHAR(20)
)

1.2 UNIQUE 约束

UNIQUE约束叫做唯一约束,也就是不能重复的意思。
示例: 指定sn列为唯一的、不重复的:

-- 重新设置学生表结构
DROP TABLE IF EXISTS student;
CREATE TABLE student (
   id INT NOT NULL,
   sn INT UNIQUE,
   name VARCHAR(20),
   qq_mail VARCHAR(20)
);

1.3 DEFAULT 约束

DEFAULT约束叫做默认值约束。
示例: 指定插入数据时,name列为空,默认值unkown:

-- 重新设置学生表结构
DROP TABLE IF EXISTS student;
CREATE TABLE student (
   id INT NOT NULL,
   sn INT UNIQUE,
   name VARCHAR(20) DEFAULT 'unkown',
   qq_mail VARCHAR(20)
);

注意: 这里当我们insert into student (id,sn,name,qq_mail) values(1,101,NULL,'111@qq.com');时,我们在表里所插入的内容为(1,101,NULL,111@qq.com),此时不能体现出我们的默认值。
那么到底怎么体现默认值呢?答案是:只有我们insert into student (id,sn,qq_mail) values(1,101,'111@qq.com');这样写的时候,我们表里所插入的内容才为(1,101,unkown,111@qq.com),才能体现出默认值的存在。即只要不指定列,不给name任何值,包括NULL值,才能体现出默认值的存在。

1.4 PRIMARY KEY 约束

PRIMARY KEY约束叫做主键约束,它是 NOT NULL 和 UNIQUE 的结合。也就是说,当一个字段被PRIMARY KEY修饰后,那么这个字段就是不能为空且是独一无二的!
因为是独一无二的,所以对于整数类型的主键,一般搭配:自增长auto_increment使用。插入数据对应字段不给值时,使用最大值+1。
一个表当中包含两个主键,这句话是有瑕疵的。正确的说法是:一个表只有一个主键,但是这个主键可以是两个字段联合起来表示的,此时叫做联合主键。
示例: 指定id列为主键:

-- 重新设置学生表结构
DROP TABLE IF EXISTS student;
CREATE TABLE student (
   id INT PRIMARY KEY auto_increment,
   sn INT UNIQUE,
   name VARCHAR(20) DEFAULT 'unkown',
   qq_mail VARCHAR(20)
);

注意: 当创建好表之后,表中没有任何数据,当第一次执行插入的时候,当前主键,也就是id,会自动从1开始。即执行insert into student (sn,name,qq_mail) values(101,'feihan','111@qq.com');这条语句之后,数据库中将成功插入(1,101,feihan,111@qq.com)这条数据。
但是当我将刚刚插入的数据删除之后,再次进行插入的时候,就会在原来的基础上,也就是上一次最后插入的语句的id上开始加1。也就是我们依次执行delete from student wher id=1;insert into student (sn,name,qq_mail) values(101,'feihan','111@qq.com');这两条语句之后,成功插入的数据将是(2,101,feihan,111@qq.com)。
此时,只有你drop table if exists student;把这个表整个删除以后,id才会重新从1开始!!!
同时需要记住alter可以修改字段的类型!即可以把字段从int类型修改为long类型等。

1.5 FOREIGN KEY 约束

FOREIGN KEY约束叫做外键约束,外键用于关联其他表的主键或唯一键。
语法: foreign key (字段名) references 主表(列)
示例:

  1. 创建班级表classes,id为主键:
-- 创建班级表,有使用MySQL关键字作为字段时,需要使用``来标识
DROPTABLE IF EXISTS classes;
CREATETABLE classes (
    id INT PRIMARY KEY auto_increment,
    name VARCHAR(20),
    `desc` VARCHAR(100)
);
  1. 创建学生表student,一个学生对应一个班级,一个班级对应多个学生。使用id为主键,classes_id为外键,关联班级表id:
-- 重新设置学生表结构
DROPTABLE IF EXISTS student;
CREATETABLE student (
    id INT PRIMARY KEY auto_increment,
    sn INT UNIQUE,
    name VARCHAR(20) DEFAULT 'unkown',
    qq_mail VARCHAR(20),
    classes_id int,
    FOREIGN KEY (classes_id) REFERENCES classes(id)
    --classes_id就是外键,关联的是classes这张表的id字段
);

注意: 现在我们有两张表,一张班级表,一张学生表。

  1. 建表的时候,先创建哪张表呢?
    先创主表(班级表)!
  2. 插入数据时,请问应该先插入哪个表?
    先插入主表(班级表)!
  3. 删除时,请问应该先删除哪个表的数据?
    先删除子表(学生表)!
    但是删除主表也是可以的,前提是主表当中的这个id没有被关联。如果被关联了,那么就会删除失败!!

所以这样做体现了:安全性!

1.6 CHECK 约束

示例: 约束插入sex字段时只能插入男或者女这两个字。

droptable if exists test_user;createtable test_user (
   id int,
   name varchar(20),
   sex varchar(1),
   check (sex ='男'or sex='女'));

注意: 当我们在MySQL中执行insert into test_user values(1,'feihan','哈');这条语句时,按理来说应该插入失败报错,但你会发现,它竟然插入成功了!此时我们要记住,它在MySQL使用时不报错,忽略该约束;但在Oracle使用时会报错,忽略不了该约束!!!

2 表的关系

2.1 三大范式

范式是你在建表的时候的一些规则,即数据库设计时遵循的一种规范,不同的规范要求遵循不同的范式。具体可借助博客https://blog.csdn.net/ddzzz_/article/details/119277573进行具体的理解与学习。
在设计表的时候会有以下3种情况:

2.2 表的设计

在设计表的时候会有以下3种情况:

2.2.1 一对一 (1:1)

在这里插入图片描述
设计表格时就很简单,如下所示的一个二维表格:

name身份证号

2.2.2 一对多 (1:n)

在这里插入图片描述
设计表格时就需要如下所示的两个表格:

  1. 班级表:
班级ID班级名称
  1. 学生表:
学生ID学号姓名班级ID

注意: 多的那边存入1的这边的ID!

2.2.3 多对多 (m:n)

在这里插入图片描述
设计表格时就需要如下所示的三个表格:

  1. 学生表:
学生ID学号姓名
  1. 课程表:
课程ID课程名称
  1. 学生课程中间表(因为不管在哪张表里面写了另一张表的ID都是不合适的,所以有了中间表的出现):
中间表ID学生ID课程ID

3 进阶版CRUD操作

3.1 新增(Create)

语法: INSERT INTO table_name [(column [, column ...])] SELECT ...
示例: 创建一张用户表,设计有name姓名、email邮箱、sex性别、mobile手机号字段。需要把已有的学生数据复制进来,可以复制的字段为name、qq_mail:

-- 创建用户表
DROPTABLE IF EXISTS test_user;
CREATETABLE test_user (
    id INT primary key auto_increment,
    name VARCHAR(20) comment '姓名',
    age INT comment '年龄',
    email VARCHAR(20) comment '邮箱',
    sex varchar(1) comment '性别',
    mobile varchar(20) comment '手机号'
);
-- 将学生表中的所有数据复制到用户表
insert into test_user(name, email) select name, qq_mail from student;

3.2 查询(Retrieve)

在了解数据库表进阶版的查询之前,我们需要先进行一些准备工作,即在选中的数据库中准备两张表和插入一些数据:

-- 创建一张学生表
DROP TABLE IF EXISTS student;
CREATE TABLE student (
   id INT,
   sn INT comment '学号',
   name VARCHAR(20) comment '姓名',
   qq_mail VARCHAR(20) comment 'QQ邮箱';

-- 创建考试成绩表
DROP TABLE IF EXISTS exam_result;
CREATE TABLE exam_result (
   id INT,
   name VARCHAR(20),
   chinese DECIMAL(3,1),
   math DECIMAL(3,1),
   english DECIMAL(3,1)
);

--在exam_result表中插入一些数据
INSERT INTO exam_result (id,name, chinese, math, english) VALUES
 (1,'唐三藏', 67, 98, 56),
 (2,'孙悟空', 87.5, 78, 77),
 (3,'猪悟能', 88, 98, 90),
 (4,'曹孟德', 82, 84, 67),
 (5,'刘玄德', 55.5, 85, 45),
 (6,'孙权', 70, 73, 78.5),
 (7,'宋公明', 75, 65, 30);

3.2.1 聚合查询

3.2.1.1 聚合函数

常见的统计总数、计算平局值等操作,可以使用聚合函数来实现,常见的聚合函数有:

函数说明
COUNT ([DISTINCT] expr)返回查询到的数据的数量
SUM ([DISTINCT] expr)返回查询到的数据的总和,不是数字没有意义
AVG ([DISTINCT] expr)返回查询到的数据的平均值,不是数字没有意义
MAX ([DISTINCT] expr)返回查询到的数据的最大值,不是数字没有意义
MIN ([DISTINCT] expr)返回查询到的数据的最小值,不是数字没有意义

注意: 在where后面,不能出现聚合函数!

3.2.1.1.1 COUNT函数
  1. 统计班级共有多少同学:
    SELECT COUNT(*) FROM exam_result ;SELECT COUNT(任意数字) FROM exam_result ;
    任意数字的意思是例如SELECT COUNT(0) FROM exam_result ;SELECT COUNT(1) FROM exam_result ;等命令都可以实现此需求。
  2. 统计班级收集的 qq_mail 有多少个:
    SELECT COUNT(qq_mail) FROM student;
    注意:qq_mail 为 NULL 的数据不会计入结果!
  3. 如果在exam_result表中再加入了和前面一模一样的数据: (1,‘唐三藏’, 67, 98, 56)。
    执行SELECT COUNT(*) FROM exam_result ;命令得到的结果将是8。
    但我们要是执行 SELECT COUNT(distinct id) FROM exam_result ;命令得到的结果将是7,因为这里我们用distinct对计数的列进行了去重操作。
3.2.1.1.2 SUM函数
  1. 统计数学成绩总分:
    SELECT SUM(math) FROM exam_result;
  2. 不及格 < 60 的总分,没有结果则返回 NULL:
    SELECT SUM(math) FROM exam_result WHERE math < 60;
3.2.1.1.3 AVG函数
  1. 统计平均总分:
    SELECT AVG(chinese + math + english) 平均总分 FROM exam_result;
3.2.1.1.4 MAX函数
  1. 返回英语最高分:
    SELECT MAX(english) FROM exam_result;
3.2.1.1.5 MIN函数
  1. 返回 > 70 分以上的数学最低分:
    SELECT MIN(math) FROM exam_result WHERE math > 70;
3.2.1.2 GROUP BY子句

SELECT 中使用 GROUP BY 子句可以对指定列进行分组查询。
需要满足:使用 GROUP BY 进行分组查询时,SELECT 指定的字段必须是“分组依据字段”,其他字段若想出现在SELECT 中则必须包含在聚合函数中。
语法: select column1, sum(column2), .. from table group by column1,column3;
示例: 在了解GROUP BY 子句之前,我们需要先进行一些准备工作,即在选中的数据库中准备一张表和插入一些数据:

--职员表,有id(主键)、name(姓名)、role(角色)、salary(薪水)
create table emp(
  id int primary key auto_increment,
  name varchar(20) not null,
  role varchar(20) not null,
  salary numeric(11,2)
);

insert into emp(name, role, salary) values
('马云','服务员', 1000.20),
('马化腾','游戏陪玩', 2000.99),
('孙悟空','游戏角色', 999.11),
('猪无能','游戏角色', 333.5),
('沙和尚','游戏角色', 700.33),
('隔壁老王','董事长', 12000.66);

查询每个角色的最高工资、最低工资和平均工资:
select role,max(salary),min(salary),avg(salary) from emp group by role;
注意: 执行的时候是先执行group by后面的语句,再执行前面的语句。

3.2.1.3 HAVING子句

GROUP BY 子句进行分组以后,需要对分组结果再进行条件过滤时,不能使用 WHERE 语句,而需要用HAVING。
示例: 显示平均工资低于1500的角色和它的平均工资:
select role,max(salary),min(salary),avg(salary) from emp group by role having avg(salary)<1500;

3.2.2 联合查询

  1. 什么是联合查询?
    就是两张表或两张以上的表,进行连接查询。
  2. 为什么要联合查询?
    因为我们所需要的数据不仅仅是来自于一张表的,它是来自多张表的,所以我们要进行联合查询。
  3. 笛卡尔积:
    在这里插入图片描述
    所有的联合查询都是从这个笛卡尔积当中去取出数据,当然在取数据的时候,一定是要满足某种规则的。这种规则就是接下来要介绍的各种联表查询的方式。

在了解联合查询之前,我们需要先进行一些准备工作,即在选中的数据库中准备四张表和插入一些数据,这里仅把在这四张表中插入数据的SQL语句进行展示,具体的建表语句大家可以自己练习写一下:

insert into classes(name, `desc`) values
('计算机系2019级1班', '学习了计算机原理、C和Java语言、数据结构和算法'),
('中文系2019级3班','学习了中国传统文学'),
('自动化2019级5班','学习了机械自动化');

insert into student(sn, name, qq_mail, classes_id) values
('09982','黑旋风李逵','xuanfeng@qq.com',1),
('00835','菩提老祖',null,1),
('00391','白素贞',null,1),
('00031','许仙','xuxian@qq.com',1),
('00054','不想毕业',null,1),
('51234','好好说话','say@qq.com',2),
('83223','tellme',null,2),
('09527','老外学中文','foreigner@qq.com',2);

insert into course(name) values
('Java'),('中国传统文化'),('计算机原理'),('语文'),('高阶数学'),('英文');

insert into score(score, student_id, course_id) values
-- 黑旋风李逵
(70.5, 1, 1),(98.5, 1, 3),(33, 1, 5),(98, 1, 6),
-- 菩提老祖
(60, 2, 1),(59.5, 2, 5),
-- 白素贞
(33, 3, 1),(68, 3, 3),(99, 3, 5),
-- 许仙
(67, 4, 1),(23, 4, 3),(56, 4, 5),(72, 4, 6),
-- 不想毕业
(81, 5, 1),(37, 5, 5),
-- 好好说话
(56, 6, 2),(43, 6, 4),(79, 6, 6),
-- tellme
(80, 7, 2),(92, 7, 6);
3.2.2.1 内连接

两张或两张以上的表进行查询,左表和右表存在相同意义的字段的时候可以使用内连接,也就是求几张表的交集。
语法:
select 字段 from 表1 别名1 [inner] join 表2 别名2 on 连接条件 and 其他条件;

select 字段 from 表1 别名1,表2 别名2 where 连接条件 and 其他条件;
示例:

  1. 查询“许仙”同学的 成绩:
    select sco.score from student stu inner join score sco on stu.id=sco.student_id and stu.name='许仙';

    select sco.score from student stu, score sco where stu.id=sco.student_id and stu.name='许仙';
  2. 查询所有同学的总成绩,及同学的个人信息:
-- 成绩表对学生表是多对1关系,查询总成绩是根据成绩表的同学id来进行分组的
SELECT
 stu.sn,
 stu.NAME,
 stu.qq_mail,
 sum( sco.score ) 
FROM
 student stu
 JOIN score sco ON stu.id = sco.student_id
GROUP BY
 sco.student_id;

--或者
SELECT
 stu.sn,
 stu.NAME,
 stu.qq_mail,
 sum( sco.score ) 
FROM
 student stu,score sco
where
 stu.id = sco.student_id
GROUP BY
 sco.student_id;
  1. 查询所有同学的成绩,及同学的个人信息:
--查询出来的都是有成绩的同学,“老外学中文”同学 没有显示
select * from student stu join score sco on stu.id=sco.student_id;

-- 学生表、成绩表、课程表3张表关联查询
SELECT
 stu.id,
 stu.sn,
 stu.NAME,
 stu.qq_mail,
 sco.score,
 sco.course_id,
 cou.NAME
FROM
 student stu
 JOIN score sco ON stu.id = sco.student_id
 JOIN course cou ON sco.course_id = cou.id
ORDER BY
 stu.id;

--或者
SELECT
 stu.id,
 stu.sn,
 stu.NAME,
 stu.qq_mail,
 sco.score,
 sco.course_id,
 cou.NAME
FROM
 student stu,score sco,course cou 
where
 stu.id = sco.student_id
and 
  sco.course_id = cou.id
ORDER BY
 stu.id;

建议: 多张表联合查询的时候,去找每个表之间的关系。

3.2.2.2 外连接

外连接分为左外连接和右外连接。如果联合查询,左侧的表完全显示我们就说是左外连接;右侧的表完全显示我们就说是右外连接。
语法:

  1. 左外连接,表1完全显示:
    select 字段名 from 表名1 left join 表名2 on 连接条件;
  2. 右外连接,表2完全显示:
    select 字段 from 表名1 right join 表名2 on 连接条件;

示例: 查询所有同学的成绩,及同学的个人信息,如果该同学没有成绩,也需要显示:

-- “老外学中文”同学 没有考试成绩,也显示出来了
select * from student stu left join score sco on stu.id=sco.student_id;

-- 对应的右外连接为:
select * from score sco right join student stu on stu.id=sco.student_id;

-- 学生表、成绩表、课程表3张表关联查询
SELECT
 stu.id,
 stu.sn,
 stu.NAME,
 stu.qq_mail,
 sco.score,
 sco.course_id,
 cou.NAME
FROM
 student stu
 LEFT JOIN score sco ON stu.id = sco.student_id
 LEFT JOIN course cou ON sco.course_id = cou.id
ORDER BY
 stu.id;
3.2.2.3 自连接

自连接是指在同一张表连接自身进行查询,即把一张表看成两张表使用。
示例: 针对同一个人,显示所有“计算机原理”成绩比“Java”成绩高的成绩信息:

-- 先查询“计算机原理”和“Java”课程的id
select id,name from course where name='Java' or name='计算机原理';

-- 再查询成绩表中,“计算机原理”成绩比“Java”成绩 好的信息
SELECT
 s1.* 
FROM
 score s1,
 score s2 
WHERE
 s1.student_id = s2.student_id
 AND s1.score < s2.score
 AND s1.course_id = 1
 AND s2.course_id = 3;
 
-- 也可以使用join on 语句来进行自连接查询
SELECT
 s1.* 
FROM
 score s1
 JOIN score s2 ON s1.student_id = s2.student_id
 AND s1.score < s2.score
 AND s1.course_id = 1
 AND s2.course_id = 3;

以上查询只显示了成绩信息,并且是分布执行的。要显示学生及成绩信息,并在一条语句显示:

SELECT
 stu.*,
 s1.score Java,
 s2.score 计算机原理
FROM
 score s1
 JOIN score s2 ON s1.student_id = s2.student_id
 JOIN student stu ON s1.student_id = stu.id
 JOIN course c1 ON s1.course_id = c1.id
 JOIN course c2 ON s2.course_id = c2.id
 AND s1.score < s2.score
 AND c1.NAME = 'Java'
 AND c2.NAME = '计算机原理';
3.2.2.4 子查询

子查询是指嵌入在其他sql语句中的select语句,也叫嵌套查询。

3.2.2.4.1 单行子查询

单行子查询:返回一行记录的子查询。
示例: 查询与“不想毕业” 同学的同班同学:
select * from student where classes_id=(select classes_id from student where name='不想毕业');

3.2.2.4.2 多行子查询

多行子查询:返回多行记录的子查询。
示例: 查询“语文”或“英文”课程的成绩信息:

  1. [NOT] IN关键字
-- 使用IN
select * from score where course_id in (select id from course where name='语文'or name='英文');

-- 使用 NOT IN
select * from score where course_id notin (select id from course where name!='语文'and name!='英文');

可以使用多列包含:

-- 插入重复的分数:score, student_id, course_id列重复
insertinto score(score, student_id, course_id) values -- 黑旋风李逵
(70.5, 1, 1),(98.5, 1, 3),
-- 菩提老祖
(60, 2, 1);

-- 查询重复的分数
SELECT
    * 
FROM
    score 
WHERE
    ( score, student_id, course_id ) IN ( SELECT score, student_id, course_id FROM score GROUPBY score, student_id, course_id HAVING
count( 0 ) > 1 );
  1. [NOT] EXISTS关键字
    EXISTS(表达式):只要这个表达式为真,就返回true。
    这个关键字执行的原理是:
    例如这条SQL语句:select * from A where exists (select 1 from B where B.id = A.id);
    (1)首先执行一次外部查询,并缓存结果集,如select * from A
    (2)遍历外部查询结果集的每一行记录R,代入子查询中作为条件进行查询,如select 1 from B where B.id = A.id
    (3)如果子查询有返回结果,则exists子句返回true,这一行R可作为外部查询的结果行,否则不能作为结果。
-- 使用 EXISTS
select * from score sco where exists (select sco.idfrom course cou where (name='语文'or name='英文') and cou.id = sco.course_id);

-- 使用 NOT EXISTS
select * from score sco wherenot exists (select sco.idfrom course cou where (name!='语文'and name!='英文') and cou.id = sco.course_id);
3.2.2.4.3 from子句中使用子查询

在from子句中使用子查询:子查询语句出现在from子句中。这里要用到数据查询的技巧,把一个子查询当做一个临时表使用。
示例: 查询所有比“中文系2019级3班”平均分高的成绩信息:

-- 获取“中文系2019级3班”的平均分,将其看作临时表
SELECT
 avg( sco.score ) score 
FROM
 score sco
JOIN student stu ON sco.student_id = stu.id
JOIN classes cls ON stu.classes_id = cls.id
WHERE
 cls.NAME = '中文系2019级3班';

查询成绩表中,比以上临时表平均分高的成绩:

SELECT
 * 
FROM
 score sco,
 (
 SELECT
     avg( sco.score ) score 
 FROM
     score sco
     JOIN student stu ON sco.student_id = stu.id
     JOIN classes cls ON stu.classes_id = cls.id
 WHERE
     cls.NAME = '中文系2019级3班'
 ) tmp 
WHERE
 sco.score > tmp.score;
3.2.2.5 合并查询

在实际应用中,为了合并多个select的执行结果,可以使用集合操作符 union,union all。使用UNION 和 UNION ALL时,前后查询的结果集中,字段需要一致。

  1. union
    该操作符用于取得两个结果集的并集。当使用该操作符时,会自动去掉结果集中的重复行。
    示例: 查询id小于3,或者名字为“英文”的课程:
select * from course where id<3
union
select * from course where name='英文';
-- 或者使用or来实现
select * from course where id<3 or name='英文';
  1. union all
    该操作符用于取得两个结果集的并集。当使用该操作符时,不会去掉结果集中的重复行。
    示例: 查询id小于3,或者名字为“Java”的课程:
-- 可以看到结果集中出现重复数据Java
select * from course where id<3
union all
select * from course where name='英文';

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

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

相关文章

科技感十足的Pencil平替,功能全面手感丝滑,西圣Pencil 2上手

搭配Apple Pencil的iPad的确实可以大大提升工作效率&#xff0c;但是原厂的Apple Pencil价格实在偏高&#xff0c;而且容易遗失&#xff0c;所以很多人都会选择一些Apple Pencil的平替。最近我在用一款西圣Pencil 2&#xff0c;这款电容笔设计很有特点&#xff0c;看起来科技感…

《【Python】如何设置现代 Python 日志记录 | Python 基础教程 | Python 冷知识 | 十分钟高手系列》学习笔记

《【Python】如何设置现代 Python 日志记录 | Python 基础》 2 PUT ALL HANDLERS/FILTERS ON THE ROOT&#xff1a;扁平化的设计有助于简化维护成本 5 STORE CONFIG IN JSON OR YAML FILE&#xff1a;使用配置文件可以将配置和代码解耦&#xff0c;减少代码量 日志设置示例 7 …

LLM面面观之RLHF平替算法DPO

1. 背景 最近本qiang~老看到一些关于大语言模型的DPO、RLHF算法&#xff0c;但都有些云里雾里&#xff0c;因此静下心来收集资料、研读论文&#xff0c;并执行了下开源代码&#xff0c;以便加深印象。 此文是本qiang~针对大语言模型的DPO算法的整理&#xff0c;包括原理、流程…

python使用Schedule

目录 一&#xff1a;使用场景&#xff1a; 二&#xff1a;参数 三&#xff1a;实例 "Schedule"在Python中通常指的是时间调度或任务计划。Python中有多个库可以用来处理时间调度和任务计划&#xff0c;其中最流行的是schedule库。 一&#x…

Linux安装nexus maven 仓库

下载安装包 详情请参考https://blog.csdn.net/weixin_42585386/article/details/122108563 上传到服务器&#xff0c;解压缩 tar -xzvf nexus-3.31.1-01-unix.tar.gz启动服务 cd nexus-3.31.1-01/bin/ ./nexus -start登录私服 浏览器输入&#xff1a;http://192.168.80.10…

Docker打包镜像把jar包打成tar包

1.虚拟机中安装docker Cd /usr cd … 以后就在主目录操作 2.然后启动docker 启动命令:systemctl start docker 然后使用touch Dockerfile 创建Dockerfile 文件 使用vim Dockerfile 在此文件编辑配置等 编辑Dockerfile FROM openjdk:8-jre WORKDIR /home ADD emss-individua…

单元测试 | Junit4“单元测试“ ( Java中可用 )

目录: 使用JUnit4进行“单元测试” 作者简介 &#xff1a;一只大皮卡丘&#xff0c;计算机专业学生&#xff0c;正在努力学习、努力敲代码中! 让我们一起继续努力学习&#xff01; 文章用于本人学习使用 &#xff0c; 同时希望能帮助大家。 欢迎大家点赞&#x1f44d; 收藏⭐ …

内部类 --java学习笔记

内部类 是类中的五大成分之一&#xff08;成员变量、方法、构造器、内部类、代码块&#xff09;&#xff0c;如果一个类定义在另一个类的内部&#xff0c;那么这个类就是内部类当一个类的内部包含了一个整体的事务&#xff0c;且这个事务没必要单独设计时&#xff0c;就可以把…

一种手机短信验证码登录平台的解决方案

前提 爬取数据时&#xff0c;请求需要带上Cookie&#xff0c;这是很常见的一种防爬手段。更新Cookie&#xff0c;常用的方法就是Selenium模拟输入用户名和密码&#xff1b;偶尔会遇到图片验证码&#xff0c;现在打码平台很多且技术也很成熟&#xff0c;这个已经不成问题。所谓…

Qt QScrollArea 不显示滚动条 不滚动

使用QScrollArea时&#xff0c;发现添加的控件超出QScrollArea 并没有显示&#xff0c;且没有滚动条效果 原因是 scrollArea指的是scrollArea控件本身的大小&#xff0c;肉眼能看到的外形尺寸。 scrollAreaWidgetContents指的是scrollArea控件内部的显示区域&#xff0c;里面可…

【笔记】React-Native跟Android交互--简单示例

/** * 使用命令 npx react-nativelatest init DemoRN创建项目 * * "react": "18.2.0", * "react-native": "0.73.2" * * 官网有详细教程&#xff1a;https://reactnative.dev/docs/native-modules-android */ 一、RN invoke androi…

大创项目推荐 题目:基于深度学习的中文汉字识别 - 深度学习 卷积神经网络 机器视觉 OCR

文章目录 0 简介1 数据集合2 网络构建3 模型训练4 模型性能评估5 文字预测6 最后 0 简介 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于深度学习的中文汉字识别 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &a…

C 变量

目录 1. C变量 2. C变量定义 2.1 变量初始化 2.2 C中的变量声明 3. C中的左值&#xff08;Lvalues&#xff09;和右值&#xff08;Rvalues&#xff09; 1. C变量 在C语言中&#xff0c;变量可以根据其类型分为以下几种基本类型&#xff1a; 整型变量&#xff1a;用…

2.室内设计学习 - CAD 2021 调整经典界面教程及基本设置

设置经典界面 1.在第二行的空白处右击&#xff0c;弹出对话框&#xff0c;并点击【关闭】&#xff0c;关闭掉。 2.菜单栏没有显示的情况下&#xff0c;在最上面的一排&#xff0c;点击向下的箭头展开下拉框&#xff0c;勾选 【显示菜单栏】 3.点击菜单【工具】-【工具栏】-【a…

【Docker】在Windows下使用Docker Desktop创建nginx容器并访问默认网站

欢迎来到《小5讲堂》&#xff0c;大家好&#xff0c;我是全栈小5。 这是《Docker容器》序列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对…

AI人工智能可以怎么应用?——GPT4v图文识别问答功能

沃卡 AI 已支持 AI识图问答TTS语音对话文档总结对话Dall E3 对话文生图国内大模型集合AI 绘画思维导图&#xff0c;而且功能还在不断更新优化&#xff0c;丰富好用&#xff01;一个系统满足您多个需求&#xff01; 大家可以通过收藏网页www.woka.chat 直接进行访问&#xff0c…

10s 内得到一个干净、开箱即用的 Linux 系统

安装 使用官方脚本安装我的服务器不行 官方脚本 mkdir instantbox && cd $_ bash <(curl -sSL https://raw.githubusercontent.com/instantbox/instantbox/master/init.sh) 下面是我的完整安装过程 mkdir /opt/instantbox cd /opt/instantbox 1.脚本文件 (这个没…

Asp.net移除Server, X-Powered-By, 和X-AspNet-Version头

移除X-AspNet-Version很简单,只需要在Web.config中增加这个配置节: <httpRuntime enableVersionHeader"false" />移除Server在Global.asax文件总增加&#xff1a; //隐藏IIS版本 protected void Application_PreSendRequestHeaders() {HttpContext.Current.Res…

数据结构day7

1.思维导图 1.二叉树递归创建 2.二叉树先中后序遍历 3.二叉树计算节点 4.二叉树计算深度。 5.编程实现快速排序降序

C# Onnx yolov8 水表读数检测

目录 效果 模型信息 项目 代码 训练数据 下载 C# Onnx yolov8 水表读数检测 效果 模型信息 Model Properties ------------------------- date&#xff1a;2024-01-31T10:18:10.141465 author&#xff1a;Ultralytics task&#xff1a;detect license&#xff1a;AGPL-…