【MySQL】-增删查改

news2024/11/18 18:20:26

作者:学Java的冬瓜
博客主页:☀学Java的冬瓜🌙
专栏:MySQL
分享:至若春和景明,波澜不惊,上下天光,一碧万顷。沙鸥翔集,锦鳞游泳,岸芷汀兰,郁郁青青。
主要内容数据库SQL语言关于库的操作,关于表的增删查改,约束项,设计表,查询的深度剖析

在这里插入图片描述
在这里插入图片描述

文章目录

  • 一、库和表的操作
    • 1、库的操作
    • 2、表的操作
  • 二、表的增删查改
    • 1、增删查改基本语法
      • @ 新增(Create)
      • @ 查询(Retrieve)
      • @ 修改(Update)
      • @ 删除(Delete)
    • 2、总结
  • 三、设计表
    • 1、约束条件
    • 2、表的设计
      • @ 一对一
      • @ 一对多
      • @ 多对多
  • 四、新增查询结果集
  • 五、复杂查询
    • 1、聚合查询
      • @ 聚合函数
      • @ GROUP BY 字句
      • @ HAVING
      • @ 查询语句执行次序
    • 2、联合查询
      • @ 笛卡尔积
      • @ 内连接
      • @ 外连接
      • @ 自连接
      • @ 子查询
      • @ 合并查询
    • 3、认识

一、库和表的操作

1、库的操作

1、显示当前的数据库

SHOW DATABASES;
2、创建数据库

1>
CREATE DATABASE 数据库名;
--若确定该数据库不存在,IF NOT EXISTS可以省略
--SQL不区分大小写,均可
2>
CREATE DATABASE [IF NOT EXISTS] 数据库名;
3>
CREATE DATABASE [IF NOT EXISTS] 数据库名 CHARACTER SET utf8mb4;
--可以CHARACTER SET utf8mb4指定编码方式

拓展:
UTF-8和utf8mb4的区别
UTF-8字符集每个字符最多使用3个字节,utf8mb4每个字符最多可使用4个字节。
说明:MySQL中的的UTF-8编码不是真正的UTF-8,没有包含某些复杂的中文字符,建议使用utf8mb4
3、使用数据库
use 数据库名;
4、删除数据库
DROP DATABASE [IF EXISTS] 数据库名;

2、表的操作

0、操作表前先选中数据库
use 数据库名;

补充:
常用数据类型:
int   
varchar(size) --可变长字符串
double(m,d)  --双精度,m为有效数字个数,d为小数点后个数,会发生精度丢失
decimal(m,d) --双精度,数值精确
timestamp  --时间戳java.util.data或者java.sql.Timestamp包下
1、查看表结构
desc 表名;
2、创建表
create table 表名(
	字段名1 字段类型1,
    字段名2 字段类型2,
    ......
    字段名n,字段类型n  --定义一个字段后面不加','
);
3、删除表
1>
DROP TABLE [IF EXISTS] 表名;  --常用
2>
DROP TABLE [IF EXISTS] 表名1,表名2;
3>
DROP TABLES [IF EXISTS] 表名1,表名2;

二、表的增删查改

1、增删查改基本语法

@ 新增(Create)

1>
INSERT INTO 表名 (字段1,字段2,...) VALUES (字段值1,字段值2...);
2>
INSERT INTO 表名 VALUES (字段值1,字段值2...);
--如果是全部字段都由对应的value值插入,则可以省略表名后的字段列表

@ 查询(Retrieve)

完整查询语法:
SELECT
 [DISTINCT] {* | {column [, column] ...} 
 [FROM table_name]
 [WHERE ...]
 [ORDER BY column [ASC | DESC], ...]
 LIMIT ...

1>
SELECT * FROM 表名; 
--全列查询
2>
SELECT id,name FROM 表名;  
--指定列查询
3>
SELECT name,math+10 FROM course;  
--查询字段为表达式
4>
SELECT name,chinese+math+english AS total FROM course; 
--重命名
5>
SELECT DISTINCT name,math FROM course; 
--去重
6>
SELECT name,chinese+math+english AS total 
FROM course 
ORDER BY total;  
--排序
7>
SELECT name, math FROM exam_result WHERE math IN (58, 59, 98, 99);
--条件查询(范围查询)

-- % 匹配任意多个(包括 0 个)字符
SELECT name FROM exam_result WHERE name LIKE '张%';-- 匹配到name以张为开头的数据
-- _ 匹配严格的一个任意字符
SELECT name FROM exam_result WHERE name LIKE '孙_';-- 匹配到name姓孙的名字为一个字的数据
--条件查询(模糊查询)

8>
- 查询 qq_mail 未知的同学姓名
SELECT name, qq_mail FROM student WHERE qq_mail IS NULL;  
--空的查询

9>
SELECT id, name FROM exam_result 
ORDER BY id 
LIMIT 3 OFFSET 0;  --limit后面跟限制行数,offset后面跟开始的位置
--分页查询

@ 修改(Update)

UPDATE 表名 SET 字段名1=1,字段名2=2...
[WHERE...][GROUP BY...][LIMIT...];

@ 删除(Delete)

2、总结

在这里插入图片描述

DELETE FROM 表名 [WHERE...][GROUP BY][LIMIT BY];

三、设计表

1、约束条件

  1. 约束类型:
    NOT NULL --非空约束
    UNIQUE --唯一约束
    DEFAULT --默认值
    PRIMARY KEY --主键约束
    FOREIGN KEY --外键约束
  2. 详解:
  • NOT NULL + UNIQUE 相当于PRIMARY KEY
  • 创建表时使用DEFAULT默认初始化某个字段,那么插入一行数据时,如果不给这个字段值,那这一行的这个字段的值就是创建表时DEFAULT的默认值。
  • PRIMARY KEY auto_increment --表示主键默认自增,PRIMARY KEY和AUTO_INCERMENT之间不用加符号
  1. 代码:
# NOT NULL
DROP TABLE IF EXISTS student;
CREATE TABLE student (
   id int NOT NULL,
   sn int,
   name varchar(20),
   qq_mail varchar(20)
);

# UNIQUE
DROP TABLE IF EXISTS student;
CREATE TABLE student (
   id int NOT NULL,
   sn int UNIQUE,
   name varchar(20),
   qq_mail varchar(20)
);

# DEFAULT
DROP TABLE IF EXISTS student;
CREATE TABLE student (
   id int NOT NULL,
   sn int UNIQUE,
   name varchar(20) DEFAULT 'unkown',
   qq_mail varchar(20)
);

# PRIMARY KEY
DROP TABLE IF EXISTS student;
CREATE TABLE student (
   id int PRIMARY KEY,
   # 对于整数类型的主键,常配搭自增长auto_increment来使用。
   # 插入数据对应字段不给值时,使用最大值+1。
   # id int PRIMARY KEY auto_increment
   sn int UNIQUE,
   name varchar(20) DEFAULT 'unkown',
   qq_mail varchar(20)
);
  1. 外键深度剖析
  • 对下面的例子来说,班级表(父表)对学生表(子表)有约束,学生表(子表)要插入、修改数据,classid必须是班级表(父表)有的值。
  • 同时学生表(子表)对班级表(父表)也有约束,父表内容被子表内容引用时,删除必须先删除学生表(子表)内容,才能删除班级表(父表)内容。
  • 在建立外键联系前,先创建父表,再创建子表建立外键关系后,想删除class(父表)得先删除student(子表)
  • 想要student学生表(子表)的classid字段和class班级表(父表)的id建立外键联系,要求父表班级表class的id必须是PRIMARY KEY(主键)
  • 在student学生表(子表)插入数据时,要先查询学生表的classid的值有没有在与student建立外键关系的父表class表中存在,存在才能插入。
  • class表的id是主键,class表的id会被索引起来,当student表插入数据时,查student里的classid是否与class的id对应,会从索引里找,提高查找效率
# FOREIGN KEY
-- 创建班级表,有使用MySQL关键字作为字段时,需要使用``来标识
DROP TABLE IF EXISTS classes;
CREATE TABLE classes (
   id int PRIMARY KEY auto_increment,
   name varchar(20),
   `desc` varchar(100)
);

-- 创建学生表student,一个学生对应一个班级,一个班级对应多个学生。
-- student中id作为主键,设置classid为外键,关联班级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),
   classes_id int,
   FOREIGN KEY (classes_id) references classes(id)
);

2、表的设计

  • 基本思路:
    1>先明确实体
    2>再明确实体之间的关系
    3>根据1,2套入公式建表
  • 例子如下:对于教务处管理系统,有学生信息,老师信息,课程信息…

@ 一对一

在这里插入图片描述

@ 一对多

在这里插入图片描述

@ 多对多

在这里插入图片描述

四、新增查询结果集

案例:
创建一张用户表,设计有name姓名、email邮箱、sex性别、mobile手机号字段。需要把已有的
学生数据复制进来,可以复制的字段为name、qq_mail

-- 创建用户表
drop table if exists test_user;
create table test_user (
   id int primary key auto_increment,
   name varchar(20),
   age int,
   email varchar(20),
   sex varchar(1),
   mobile varchar(20)
);
-- 将学生表中的所有数据的,name和qq_mail内容复制到用户表
insert into test_user(name, email) select name, qq_mail from student;

五、复杂查询

1、聚合查询

@ 聚合函数

COUNT() # ()里面可以是*,或者某个字段,*则统计所有行数,字段则统计当前字段的非空行数
# 对SUM() AVG() MAX() MIN()函数来说,()里必须为数字字段
SUM()
AVG()
MAX()
MIN()
# COUNT
-- 统计班级共有多少同学,有多少行算多少行,值为NULL也算
select count(*) from student;
-- 统计班级收集的 qq_mail 有多少个,qq_mail 为 NULL 的数据不会计入结果
select count(qq_mail) from student;

@ GROUP BY 字句

注意:带聚合函数的查询,才带有group by

# emp表内全部数据
mysql> select * from emp;
+----+------+--------+--------+
| id | name | role   | salary |
+----+------+--------+--------+
|  1 | 李白 | 老板   | 200000 |
|  2 | 韩信 | 经理   | 100000 |
|  3 | 玄策 | 程序员 |  12000 |
|  4 | 露娜 | 程序员 |  10000 |
|  5 | 小乔 | 助理   |   8000 |
|  6 | 大乔 | 助理   |   8500 |
+----+------+--------+--------+
6 rows in set (0.00 sec)
# 查询以职位分组的平均工资的升序
mysql> select role,avg(salary) as avg_salary from emp group by role order by avg_salary asc;
+--------+-------------+
| role   | avg_salary  |
+--------+-------------+
| 助理   |   8250.0000 |
| 程序员 |  11000.0000 |
| 经理   | 100000.0000 |
| 老板   | 200000.0000 |
+--------+-------------+
4 rows in set (0.00 sec)
# 查询以职位分组的平均工资的升序,限制两条数据,从0开始
mysql> select role,avg(salary) as avg_salary from emp group by role order by avg_salary asc limit 2 offset 0;
+--------+------------+
| role   | avg_salary |
+--------+------------+
| 助理   |  8250.0000 |
| 程序员 | 11000.0000 |
+--------+------------+
2 rows in set (0.01 sec)

@ HAVING

说明:
分组查询:可以指定条件进行筛选,两种情况
1、分组前筛选(where)
2、分组后再筛选(having)
3、也可以1+2

分组前筛选:
需求:除去玄策后,再统计每个岗位的平均薪资

# emp表的所有数据
mysql> select * from emp;
+----+------+--------+--------+
| id | name | role   | salary |
+----+------+--------+--------+
|  1 | 李白 | 老板   | 200000 |
|  2 | 韩信 | 经理   | 100000 |
|  3 | 玄策 | 程序员 |  12000 |
|  4 | 露娜 | 程序员 |  10000 |
|  5 | 小乔 | 助理   |   8000 |
|  6 | 大乔 | 助理   |   8500 |
+----+------+--------+--------+
6 rows in set (0.00 sec)
# 除去玄策后,再统计每个岗位的平均薪资
mysql> select role,avg(salary) from emp where name!='玄策' group by role;
+--------+-------------+
| role   | avg(salary) |
+--------+-------------+
| 老板   | 200000.0000 |
| 经理   | 100000.0000 |
| 程序员 |  10000.0000 |
| 助理   |   8250.0000 |
+--------+-------------+
4 rows in set (0.00 sec)

分组后筛选
需求:除去薪资在10w以上的,再统计每个岗位的平均薪资

# 除去薪资在10w以上的,再统计每个岗位的平均薪资
mysql> select role,avg(salary) from emp group by role having avg(salary)<100000;
+--------+-------------+
| role   | avg(salary) |
+--------+-------------+
| 程序员 |  11000.0000 |
| 助理   |   8250.0000 |
+--------+-------------+
2 rows in set (0.00 sec)

mysql>

分组前后都筛选:
需求:除去玄策后,除去薪资在10w以上的,再统计每个岗位的平均薪资

# 除去玄策后,除去薪资在10w以上的,再统计每个岗位的平均薪资
mysql> select role,avg(salary) from emp where name!='玄策' group by role having avg(salary)<100000;
+--------+-------------+
| role   | avg(salary) |
+--------+-------------+
| 程序员 |  10000.0000 |
| 助理   |   8250.0000 |
+--------+-------------+
2 rows in set (0.00 sec)

@ 查询语句执行次序

在这里插入图片描述

2、联合查询

@ 笛卡尔积

# 学生表信息
mysql> select * from student;
+----+------+---------+
| id | name | classid |
+----+------+---------+
|  1 | 张三 |       1 |
|  2 | 李四 |       2 |
+----+------+---------+
2 rows in set (0.00 sec)

# 班级表信息
mysql> select * from class;
+----+------+
| id | name |
+----+------+
|  1 | Java |
|  2 | C++  |
+----+------+
2 rows in set (0.00 sec)

# 笛卡尔积信息
mysql> select * from student,class;
+----+------+---------+----+------+
| id | name | classid | id | name |
+----+------+---------+----+------+
|  2 | 李四 |       2 |  1 | Java |
|  1 | 张三 |       1 |  1 | Java |
|  2 | 李四 |       2 |  2 | C++  |
|  1 | 张三 |       1 |  2 | C++  |
+----+------+---------+----+------+
4 rows in set (0.01 sec)

分析:
两张表笛卡尔积结果:得到更大的表
列数是两张表的列数和
行数是两张表的行数积

结论:
可以从笛卡尔积查询结果发现,只有当
student.classId=class.id(连接条件)时,才是真实有效的数据。

@ 内连接

  • 用笛卡尔积:
select * from student,course,score where student.id=score.student_id and course.id=scores.course_id
  • join on连接:先表1+表2,最后+表3
select * from student join score on student.id=score.student_id join course on course.id=score.course_id

准备:SQL建表添加数据:

drop table if exists classes;
drop table if exists student;
drop table if exists course;
drop table if exists score;

create table classes (id int primary key auto_increment, name varchar(20), `desc` varchar(100));

create table student (id int primary key auto_increment, sn varchar(20),  name varchar(20), qq_mail varchar(20) ,
        classes_id int);

create table course(id int primary key auto_increment, name varchar(20));

create table score(score decimal(3, 1), student_id int, course_id int);

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);

需求1:列出每个同学的姓名,总分,以总分升序排列

# 笛卡尔积+条件查询:
mysql> select name,sum(score) as total_score from student,score where student.id=score.student_id group by name order by total_score;
+------------+-------------+
| name       | total_score |
+------------+-------------+
| 不想毕业   |       118.0 |
| 菩提老祖   |       119.5 |
| tellme     |       172.0 |
| 好好说话   |       178.0 |
| 白素贞     |       200.0 |
| 许仙       |       218.0 |
| 黑旋风李逵 |       300.0 |
+------------+-------------+
7 rows in set (0.00 sec)

# (inner) join on:
mysql> select name,sum(score) as total_score from student inner join score on student.id=score.student_id group by name order by total_score;
+------------+-------------+
| name       | total_score |
+------------+-------------+
| 不想毕业   |       118.0 |
| 菩提老祖   |       119.5 |
| tellme     |       172.0 |
| 好好说话   |       178.0 |
| 白素贞     |       200.0 |
| 许仙       |       218.0 |
| 黑旋风李逵 |       300.0 |
+------------+-------------+
7 rows in set (0.00 sec)

需求2:查询所有学生的成绩,及其课程信息

# 笛卡尔积+条件查询
mysql> select student.name as 学生姓名,course.name 课程名称,score.score from student,course,score where student.id = score.student_id and course.id = score.course_id;
+------------+--------------+-------+
| 学生姓名   | 课程名称     | score |
+------------+--------------+-------+
| 黑旋风李逵 | Java         |  70.5 |
| 黑旋风李逵 | 计算机原理   |  98.5 |
| 黑旋风李逵 | 高阶数学     |  33.0 |
| 黑旋风李逵 | 英文         |  98.0 |
| 菩提老祖   | Java         |  60.0 |
| 菩提老祖   | 高阶数学     |  59.5 |
| 白素贞     | Java         |  33.0 |
| 白素贞     | 计算机原理   |  68.0 |
| 白素贞     | 高阶数学     |  99.0 |
| 许仙       | Java         |  67.0 |
| 许仙       | 计算机原理   |  23.0 |
| 许仙       | 高阶数学     |  56.0 |
| 许仙       | 英文         |  72.0 |
| 不想毕业   | Java         |  81.0 |
| 不想毕业   | 高阶数学     |  37.0 |
| 好好说话   | 中国传统文化 |  56.0 |
| 好好说话   | 语文         |  43.0 |
| 好好说话   | 英文         |  79.0 |
| tellme     | 中国传统文化 |  80.0 |
| tellme     | 英文         |  92.0 |
+------------+--------------+-------+
20 rows in set (0.00 sec)

# join on连接:先表1+表2,最后+表3
mysql> select student.name as 学生姓名,course.name as 课程名称,score.score from student join score on student.id=score.student_id join course on course.id=score.course_id;
+------------+--------------+-------+
| 学生姓名   | 课程名称     | score |
+------------+--------------+-------+
| 黑旋风李逵 | Java         |  70.5 |
| 黑旋风李逵 | 计算机原理   |  98.5 |
| 黑旋风李逵 | 高阶数学     |  33.0 |
| 黑旋风李逵 | 英文         |  98.0 |
| 菩提老祖   | Java         |  60.0 |
| 菩提老祖   | 高阶数学     |  59.5 |
| 白素贞     | Java         |  33.0 |
| 白素贞     | 计算机原理   |  68.0 |
| 白素贞     | 高阶数学     |  99.0 |
| 许仙       | Java         |  67.0 |
| 许仙       | 计算机原理   |  23.0 |
| 许仙       | 高阶数学     |  56.0 |
| 许仙       | 英文         |  72.0 |
| 不想毕业   | Java         |  81.0 |
| 不想毕业   | 高阶数学     |  37.0 |
| 好好说话   | 中国传统文化 |  56.0 |
| 好好说话   | 语文         |  43.0 |
| 好好说话   | 英文         |  79.0 |
| tellme     | 中国传统文化 |  80.0 |
| tellme     | 英文         |  92.0 |
+------------+--------------+-------+
20 rows in set (0.00 sec)

@ 外连接

  • 当两个表的数据一一对应时内外链接的查询结果相同。
  • 不对应时:左外连接显示左表全部数据,右外连接显示有表全部数据

准备:student和score表数据

mysql> select * from student;
+------+------+
| id   | name |
+------+------+
|    1 | 张三 |
|    2 | 李四 |
+------+------+
2 rows in set (0.00 sec)

mysql> select * from score;
+------------+-------+
| student_id | score |
+------------+-------+
|          1 |    90 |
|          3 |    88 |
+------------+-------+
2 rows in set (0.00 sec)

内连接

# 笛卡尔积+连接条件
mysql> select * from student,score where student.id=score.student_id;
+------+------+------------+-------+
| id   | name | student_id | score |
+------+------+------------+-------+
|    1 | 张三 |          1 |    90 |
+------+------+------------+-------+
1 row in set (0.00 sec)

# join on连接
mysql> select * from student join score on student.id=score.student_id;
+------+------+------------+-------+
| id   | name | student_id | score |
+------+------+------------+-------+
|    1 | 张三 |          1 |    90 |
+------+------+------------+-------+
1 row in set (0.00 sec)

外连接

# 左外连接
mysql> select * from student left join score on student.id=score.student_id;
+------+------+------------+-------+
| id   | name | student_id | score |
+------+------+------------+-------+
|    1 | 张三 |          1 |    90 |
|    2 | 李四 |       NULL |  NULL |
+------+------+------------+-------+
2 rows in set (0.00 sec)

# 右外连接
mysql> select * from student right join score on student.id=score.student_id;
+------+------+------------+-------+
| id   | name | student_id | score |
+------+------+------------+-------+
|    1 | 张三 |          1 |    90 |
| NULL | NULL |          3 |    88 |
+------+------+------------+-------+
2 rows in set (0.00 sec)

@ 自连接

思考:一般情况下SQL中无法针对行和行之间的比较,自连接可以实现把行转换列进行列和列的比较。

需求1:显示所有计算机原理成绩比Java成绩高的成绩信息。
步骤:
a>找两门课程的id(也可以直接用子查询)
在这里插入图片描述
b>笛卡尔积:可以发现是随机排列组合的结果(两个student_id和两个course_id都不是对应的)
在这里插入图片描述

c>添加连接条件:要比较的是课程成绩,所以用course_id作为自连接条件。确保是比较每个人的计算机原理成绩比Java成绩高的信息。
(如果是针对课程,比较不同同学的成绩情况,就要用course_id作为连接条件)
在这里插入图片描述

d>添加课程限制:前三列是course_id=1,后三列是course_id=3的
在这里插入图片描述
e>查询比较同一个学生的计算机原理成绩比Java成绩高的信息

在这里插入图片描述

需求2:显示白素贞成绩比许仙成绩高的成绩信息。
步骤:
a>找两位同学的id(也可以直接用子查询)
在这里插入图片描述
b>笛卡尔积+添加连接条件+学生限制条件:
在这里插入图片描述
c>查询比较白素贞成绩比许仙高的课程
在这里插入图片描述

@ 子查询

分析:
子查询对代码可读性、运行效率都是较低的,可以用多次查询代替子查询。
认识:
可读性,可维护性=》提高开发效率
程序跑得快=》提升运行效率

单行子查询:返回一行记录的子查询
查询与“不想毕业” 同学的同班同学:

mysql> select * from student where classes_id=(select classes_id from student where name='不想毕业') and name!='不想毕业';
+----+-------+------------+-----------------+------------+
| id | sn    | name       | qq_mail         | classes_id |
+----+-------+------------+-----------------+------------+
|  1 | 09982 | 黑旋风李逵 | xuanfeng@qq.com |          1 |
|  2 | 00835 | 菩提老祖   | NULL            |          1 |
|  3 | 00391 | 白素贞     | NULL            |          1 |
|  4 | 00031 | 许仙       | xuxian@qq.com   |          1 |
+----+-------+------------+-----------------+------------+
4 rows in set (0.00 sec)

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

  • [NOT] IN关键字:
mysql> select * from score where course_id in (select id from course where name='语文' or name='英文');
+-------+------------+-----------+
| score | student_id | course_id |
+-------+------------+-----------+
|  98.0 |          1 |         6 |
|  72.0 |          4 |         6 |
|  43.0 |          6 |         4 |
|  79.0 |          6 |         6 |
|  92.0 |          7 |         6 |
+-------+------------+-----------+
5 rows in set (0.04 sec)
  • [NOT] EXISTS关键字:
    一般不用,因为效率低,用这个还不如分多次查询。

@ 合并查询

分析:

  • 如果在同一表里可以用or来连接做到合并的效果,这时用or或者union一样。
  • 但当从两个表中查询两个SQL语句合并起来,只能用union,并且要求字段要对应相同。
  • 对于查询结果union可以去重,union all保留全部,不去重。
mysql> select * from course where id<3 union select * from course where name='高阶数学';
+----+--------------+
| id | name         |
+----+--------------+
|  1 | Java         |
|  2 | 中国传统文化 |
|  5 | 高阶数学     |
+----+--------------+
3 rows in set (0.04 sec)

3、认识

  • 可读性,可维护性=》提高开发效率
  • 程序跑得快=》提升运行效率
  • 高内聚:把有关联关系的代码写到一起。
  • 低耦合:模块之间影响小,修改一个模块不会影响另一个。

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

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

相关文章

傻妞旧版合集新版订阅

目录一、前言二、下载三、新版傻妞订阅合集一、前言 傻妞旧版本(合集),包含amd和arm版本收集于TG 我的是amd架构 [rootecs-mike_note ~]# cat /proc/version Linux version 4.11.8-1.el7.elrepo.x86_64 (mockbuildBuild64F25) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-11…

Vue中的计算属性

计算属性&#xff1a;实际上是把vm中的属性进行计算加工&#xff0c;最后能够返回给页面一个结果 细想一下&#xff0c;其实methods方法也能实现1中描述的现象&#xff0c;但是计算属性最大的优势是缓存&#xff01;&#xff01;&#xff01; 举个例子 <div id"root&q…

【Android App】物联网实战项目之自动驾驶的智能小车(附源码和演示 超详细)

需要源码请点赞关注收藏后评论区留言私信~~~~ 当今社会正在步入一个万物互联的时代&#xff0c;它的技术基石主要来自5G、物联网和人工智能。 三者融合产生了许多新产品&#xff0c;其中最璀璨的当数自动驾驶的电动车&#xff1b;它汇聚了最新科技与工程实践的成果&#xff0c;…

【收纳】电脑资料-高效整理电脑上的文件

以前没想过整理文件&#xff0c;一般都是建各种文件夹&#xff0c;然后把资料拖进去&#xff0c;好像收起来了&#xff0c;但实际是随着文件越来越多&#xff0c;时间一久&#xff0c;经常找不到文件&#xff1b;后来逐渐意识到&#xff0c;需要改变。于是找了很多方法&#xf…

已分区的硬盘如何重新合并, 分出去的盘怎么重新合并

已分区的硬盘如何重新合并&#xff1f;磁盘分区后合区是指对原磁盘的分区进行合并&#xff0c;使之成为一个的磁盘分区&#xff0c;从具体的应用层面来分析&#xff0c;为什么会对磁盘分区后合区呢&#xff1f; 磁盘管理对磁盘分区后合区 在Windows系统中&#xff0c;磁盘管理…

UGUI性能优化学习笔记(二)合批

一、合批规则 合批&#xff1a;把渲染时使用相同材质、相同贴图的网格合并在一起&#xff0c;成为一个大网格&#xff0c;然后再调用一次Draw Call&#xff0c;直接渲染这一个大网格。这样做可以降低Draw Call的数量&#xff0c;以优化性能。 Unity是如何确定哪些网格可以进行…

[附源码]JAVA毕业设计货币博物馆展品管理系统(系统+LW)

[附源码]JAVA毕业设计货币博物馆展品管理系统&#xff08;系统LW&#xff09; 目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项…

常用框架技术- 08 Spring Cloud简单易懂、易部署和易维护的分布式系统开发工具包

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录前言1.微服务理论1.1 微服务的特点1.2 微服务与微服务架构1.3 微服务的优点2.分布式集群概念2.1 分布式集群概念2.1.1 什么是分布式2.1.2 什么是集群2.1.3 分布式集群…

新品上线 Naive Admin Tenant 开箱即用多租户开发框架

Naive Admin Tenant 是一套企业级的权限管理开发平台&#xff0c;采用前后端分离模式&#xff0c;微服务版本前端框架支持多个选择&#xff0c;支持数据库&#xff1a;MySql、Oracle、SqlServer、PostgreSql 等&#xff0c;目前只支持 MySql&#xff0c;后面有客户需求会扩展支…

三维数字沙盘大数据人工智能模拟对抗推演系统开发教程第一课

三维电子沙盘大数据人工智能模拟对抗推演系统开发教程第一课 该数据库中只提供 成都市火车南站附近的数据请注意&#xff0c;104.0648,30.61658 而且该公用服务器带宽不大&#xff0c;所以会有些卡顿&#xff0c;建议下载数据库后本地使用&#xff0c;下载后的数据库有些许变…

《InnoDB引擎八》InnoDB关键特性-两次写

InnoDB 关键特性 InnoDB存储引擎的关键特性包括&#xff1a; Insert Buffer (插入缓冲)Double Write (两次写)Adaptive Hash Index (自适应哈希索引)Async IO (异步IO)Flush Neighbor Page (刷新领接页) 这些特性为InnoDB存储引擎带来了更好的性能以及更高的可靠性。 两次写 …

STM32 定时器单脉冲模式的使用记录

一、我要解决的问题 我的需求 需要单片机几乎同时在A,B,C 三个IO 分别输出T1&#xff0c;T2&#xff0c;T3 时长的高电平&#xff0c;时间结束后&#xff0c;恢复低电平。 初步思路 面对这个需求&#xff0c;我第一时间想到的是用三个定时器&#xff0c;分别设置T1,T2,T3 时…

Win10解决:系统管理员已阻止你运行此应用

前言 Win10安装msi软件包时出现错误提示如下&#xff1a; 解决 按【winR】快捷键打开运行&#xff0c;输入gpedit.msc回车依次进入”Windows设置“—”安全设置“—”本地策略“–”安全选项“—”用户账户控制&#xff1a;以管理员批准模式运行所有管理员“—双击&#xf…

JUC系列(六) 线程池

&#x1f4e3; &#x1f4e3; &#x1f4e3; &#x1f4e2;&#x1f4e2;&#x1f4e2; ☀️☀️你好啊&#xff01;小伙伴&#xff0c;我是小冷。是一个兴趣驱动自学练习两年半的的Java工程师。 &#x1f4d2; 一位十分喜欢将知识分享出来的Java博主⭐️⭐️⭐️&#xff0c;擅…

若依 数据权限图文详细理解及改造

数据权限 所谓数据权限&#xff0c;就是根据不同角色的登录用户&#xff0c;查看不同的列表数据 若依数据权限 若依的数据权限也是基于角色实现的&#xff0c;支持五种权限模式&#xff0c;按权限大小一次排列&#xff1a; 全部数据权限&#xff0c;表示拥有所有部门的数据…

远程办公:通过cpolar内网穿透,远程桌面控制家里公司内网电脑

疫情反反复复的当下&#xff0c;有时候会遇到需要居家办公的情况&#xff0c;但在办公室的电脑上仍有很多重要资料需要存取&#xff0c;且办公室所在的局域网中也有很多相关资源需要被访问&#xff08;如文件共享服务器、OA系统等&#xff09;。如何能在家通过远程处理好办公事…

Blend for Visual Studio 概述

https://learn.microsoft.com/zh-cn/visualstudio/xaml-tools/creating-a-ui-by-using-blend-for-visual-studio?viewvs-2022 Blend for Visual Studio 可用于设计基于 XAML 的 Windows 和 Web 应用程序。 它提供了与 Visual studio 相同的基本 XAML 设计体验&#xff0c;并添…

长安汽车董事长下场宣传原力技术 全擎引领电动化出行普及时代

11月30日&#xff0c;长安汽车董事长朱华荣在朋友圈发布了长安汽车擘画未来的全新能源及电动化解决方案&#xff1a;长安原力技术——原力智能增程、原力超集电驱。长安汽车成为业内首个通过微信朋友圈发布全新技术方案的车企。短短的3分钟视频&#xff0c;展露着长安汽车对技术…

Mand Mobile - 滴滴出品的适用于金融项目的 Vue 移动端 UI 组件库,免费开源、灵活快速、丰富实用

推荐一款可用性很强的移动 UI 组件库&#xff0c;交互细致&#xff0c;有不少直接就可以用的金融行业的组件。 关于 Mand Mobile Mand Mobile 是一款由滴滴前端团队出品、专为金融场景设计的移动端 Vue 2 组件库&#xff0c;可以帮助前端开发者快速构建项目&#xff0c;UI 风…

ShaderLab实现序列帧动画

序列帧动画介绍 序列帧动画的原理比较简单,依次播放一系列关键帧图像,当播放速度达到一定数值时,看起来就是一个连续的动画。 序列帧动画有很多实现方式,而通过Shader来实现是性能比较好的一种,是由GPU来进行计算。 效果如下 我们使用一张8x8的纹理图片来实现帧动画 步…