【MySQL】-- 联合查询
文章目录
- 1. 简介
- 1.1 为什么要使用联合查询
- 1.2 多表联合查询时MySQL内部是如何进行计算的
- 2. 内连接
- 2.1 语法
- 2.2 示例
- 3. 外连接
- 3.1 语法
- 3.2 示例
- 4. 自连接
- 4.1 应用场景
- 4.2 示例
- 4.3 表连接练习
- 5. 子查询
- 5.1 语法
- 5.2 单行子查询
- 5.3 多行子查询
- 5.4 多列子查询
- 5.5 在from 子句中使用子查询
- 6. 合并查询
- 6.1 Union
- 6.2 Union all
- 7. 插入查询结果
- 7.1 语法
- 7.2 示例
1. 简介
1.1 为什么要使用联合查询
在数据库设计时由于范式的要求,数据被拆分到多个表中,那么要查询一个条数据的完整信息,就要从多个表中获取数据,如下图所示:要获取学生的基本信息和班级信息就要从学生表和班级表中获取,这时就需要使用联合查询,这里的联合指的是多个表的组合。
一次查询涉及到两个或者两个以上的表,就称为联合查询。
1.2 多表联合查询时MySQL内部是如何进行计算的
-- 创建学生表
mysql> drop table if exists student;
Query OK, 0 rows affected (0.03 sec)mysql> create table student(-> id bigint primary key auto_increment,-> name varchar(20) not null,-> sno varchar(10) not null,-> age int,-> gender tinyint(1),-> enroll_date date,-> class_id bigint not null-> );
Query OK, 0 rows affected, 1 warning (0.02 sec)
-- 插入学生数据
mysql> insert into student (name, sno, age, gender, enroll_date, class_id) values-> ('唐三藏', '100001', 18, 1, '1986-09-01', 1),-> ('孙悟空', '100002', 18, 1, '1986-09-01', 1),-> ('猪悟能', '100003', 18, 1, '1986-09-01', 1),-> ('沙悟净', '100004', 18, 1, '1986-09-01', 1),-> ('宋江', '200001', 18, 1, '2000-09-01', 2),-> ('武松', '200002', 18, 1, '2000-09-01', 2),-> ('李逹', '200003', 18, 1, '2000-09-01', 2),-> ('不想毕业', '200004', 18, 1, '2000-09-01', 2);
Query OK, 8 rows affected (0.05 sec)
Records: 8 Duplicates: 0 Warnings: 0mysql> select * from student;
+----+----------+--------+------+--------+-------------+----------+
| id | name | sno | age | gender | enroll_date | class_id |
+----+----------+--------+------+--------+-------------+----------+
| 1 | 唐三藏 | 100001 | 18 | 1 | 1986-09-01 | 1 |
| 2 | 孙悟空 | 100002 | 18 | 1 | 1986-09-01 | 1 |
| 3 | 猪悟能 | 100003 | 18 | 1 | 1986-09-01 | 1 |
| 4 | 沙悟净 | 100004 | 18 | 1 | 1986-09-01 | 1 |
| 5 | 宋江 | 200001 | 18 | 1 | 2000-09-01 | 2 |
| 6 | 武松 | 200002 | 18 | 1 | 2000-09-01 | 2 |
| 7 | 李逹 | 200003 | 18 | 1 | 2000-09-01 | 2 |
| 8 | 不想毕业 | 200004 | 18 | 1 | 2000-09-01 | 2 |
+----+----------+--------+------+--------+-------------+----------+
8 rows in set (0.03 sec)-- 创建课程表
mysql> drop table if exists class;
Query OK, 0 rows affected (0.05 sec)mysql> create table class (-> id bigint primary key auto_increment,-> name varchar(20) not null-> );
Query OK, 0 rows affected (0.02 sec)
-- 插入课程数据
mysql> insert into class(name) values ('Java001班'), ('C++001班'), ('前端001班');
Query OK, 3 rows affected (0.03 sec)
Records: 3 Duplicates: 0 Warnings: 0mysql> select * from class;
+----+-----------+
| id | name |
+----+-----------+
| 1 | Java001班 |
| 2 | C++001班 |
| 3 | 前端001班 |
+----+-----------+
3 rows in set (0.00 sec)
- 参与查询的所有表取笛卡尔积(全排列),结果集存放在临时表中。
mysql> select * from student, class;
+----+----------+--------+------+--------+-------------+----------+----+-----------+
| id | name | sno | age | gender | enroll_date | class_id | id | name |
+----+----------+--------+------+--------+-------------+----------+----+-----------+
| 1 | 唐三藏 | 100001 | 18 | 1 | 1986-09-01 | 1 | 3 | 前端001班 |
| 1 | 唐三藏 | 100001 | 18 | 1 | 1986-09-01 | 1 | 2 | C++001班 |
| 1 | 唐三藏 | 100001 | 18 | 1 | 1986-09-01 | 1 | 1 | Java001班 |
| 2 | 孙悟空 | 100002 | 18 | 1 | 1986-09-01 | 1 | 3 | 前端001班 |
| 2 | 孙悟空 | 100002 | 18 | 1 | 1986-09-01 | 1 | 2 | C++001班 |
| 2 | 孙悟空 | 100002 | 18 | 1 | 1986-09-01 | 1 | 1 | Java001班 |
| 3 | 猪悟能 | 100003 | 18 | 1 | 1986-09-01 | 1 | 3 | 前端001班 |
| 3 | 猪悟能 | 100003 | 18 | 1 | 1986-09-01 | 1 | 2 | C++001班 |
| 3 | 猪悟能 | 100003 | 18 | 1 | 1986-09-01 | 1 | 1 | Java001班 |
| 4 | 沙悟净 | 100004 | 18 | 1 | 1986-09-01 | 1 | 3 | 前端001班 |
| 4 | 沙悟净 | 100004 | 18 | 1 | 1986-09-01 | 1 | 2 | C++001班 |
| 4 | 沙悟净 | 100004 | 18 | 1 | 1986-09-01 | 1 | 1 | Java001班 |
| 5 | 宋江 | 200001 | 18 | 1 | 2000-09-01 | 2 | 3 | 前端001班 |
| 5 | 宋江 | 200001 | 18 | 1 | 2000-09-01 | 2 | 2 | C++001班 |
| 5 | 宋江 | 200001 | 18 | 1 | 2000-09-01 | 2 | 1 | Java001班 |
| 6 | 武松 | 200002 | 18 | 1 | 2000-09-01 | 2 | 3 | 前端001班 |
| 6 | 武松 | 200002 | 18 | 1 | 2000-09-01 | 2 | 2 | C++001班 |
| 6 | 武松 | 200002 | 18 | 1 | 2000-09-01 | 2 | 1 | Java001班 |
| 7 | 李逹 | 200003 | 18 | 1 | 2000-09-01 | 2 | 3 | 前端001班 |
| 7 | 李逹 | 200003 | 18 | 1 | 2000-09-01 | 2 | 2 | C++001班 |
| 7 | 李逹 | 200003 | 18 | 1 | 2000-09-01 | 2 | 1 | Java001班 |
| 8 | 不想毕业 | 200004 | 18 | 1 | 2000-09-01 | 2 | 3 | 前端001班 |
| 8 | 不想毕业 | 200004 | 18 | 1 | 2000-09-01 | 2 | 2 | C++001班 |
| 8 | 不想毕业 | 200004 | 18 | 1 | 2000-09-01 | 2 | 1 | Java001班 |
+----+----------+--------+------+--------+-------------+----------+----+-----------+
24 rows in set (0.00 sec)
- 观察哪些记录是有效数据,根据两个表的关联关系过滤掉无效数据。
-- where条件不能写成class_id = id,class_id在student表中,但是两张表中都有id列,不指定表名时,MySQL无法分清要使用那张表中的id列。
mysql> select * from student, class where student.class_id = class.id;
+----+----------+--------+------+--------+-------------+----------+----+-----------+
| id | name | sno | age | gender | enroll_date | class_id | id | name |
+----+----------+--------+------+--------+-------------+----------+----+-----------+
| 1 | 唐三藏 | 100001 | 18 | 1 | 1986-09-01 | 1 | 1 | Java001班 |
| 2 | 孙悟空 | 100002 | 18 | 1 | 1986-09-01 | 1 | 1 | Java001班 |
| 3 | 猪悟能 | 100003 | 18 | 1 | 1986-09-01 | 1 | 1 | Java001班 |
| 4 | 沙悟净 | 100004 | 18 | 1 | 1986-09-01 | 1 | 1 | Java001班 |
| 5 | 宋江 | 200001 | 18 | 1 | 2000-09-01 | 2 | 2 | C++001班 |
| 6 | 武松 | 200002 | 18 | 1 | 2000-09-01 | 2 | 2 | C++001班 |
| 7 | 李逹 | 200003 | 18 | 1 | 2000-09-01 | 2 | 2 | C++001班 |
| 8 | 不想毕业 | 200004 | 18 | 1 | 2000-09-01 | 2 | 2 | C++001班 |
+----+----------+--------+------+--------+-------------+----------+----+-----------+
8 rows in set (0.00 sec)
如果联合查询表的个数越多,表中的数据量越大,临时表就会越大,所以根据实际情况确定联合查询表的个数。
- 通过指定列查询,精简查询结果
mysql> select student.id,-> student.name,-> student.sno,-> student.age,-> student.gender,-> student.enroll_date,-> class.name-> from student, class-> where student.class_id = class.id;
+----+----------+--------+------+--------+-------------+-----------+
| id | name | sno | age | gender | enroll_date | name |
+----+----------+--------+------+--------+-------------+-----------+
| 1 | 唐三藏 | 100001 | 18 | 1 | 1986-09-01 | Java001班 |
| 2 | 孙悟空 | 100002 | 18 | 1 | 1986-09-01 | Java001班 |
| 3 | 猪悟能 | 100003 | 18 | 1 | 1986-09-01 | Java001班 |
| 4 | 沙悟净 | 100004 | 18 | 1 | 1986-09-01 | Java001班 |
| 5 | 宋江 | 200001 | 18 | 1 | 2000-09-01 | C++001班 |
| 6 | 武松 | 200002 | 18 | 1 | 2000-09-01 | C++001班 |
| 7 | 李逹 | 200003 | 18 | 1 | 2000-09-01 | C++001班 |
| 8 | 不想毕业 | 200004 | 18 | 1 | 2000-09-01 | C++001班 |
+----+----------+--------+------+--------+-------------+-----------+
8 rows in set (0.00 sec)
- 通过给表起别名的方式来精简查询sql语句
mysql> select s.id, s.name, s.sno, s.age, s.gender, s.enroll_date, c.name from student s, class c where s.class_id = c.id;
+----+----------+--------+------+--------+-------------+-----------+
| id | name | sno | age | gender | enroll_date | name |
+----+----------+--------+------+--------+-------------+-----------+
| 1 | 唐三藏 | 100001 | 18 | 1 | 1986-09-01 | Java001班 |
| 2 | 孙悟空 | 100002 | 18 | 1 | 1986-09-01 | Java001班 |
| 3 | 猪悟能 | 100003 | 18 | 1 | 1986-09-01 | Java001班 |
| 4 | 沙悟净 | 100004 | 18 | 1 | 1986-09-01 | Java001班 |
| 5 | 宋江 | 200001 | 18 | 1 | 2000-09-01 | C++001班 |
| 6 | 武松 | 200002 | 18 | 1 | 2000-09-01 | C++001班 |
| 7 | 李逹 | 200003 | 18 | 1 | 2000-09-01 | C++001班 |
| 8 | 不想毕业 | 200004 | 18 | 1 | 2000-09-01 | C++001班 |
+----+----------+--------+------+--------+-------------+-----------+
8 rows in set (0.00 sec)
2. 内连接
2.1 语法
简写:
select 字段 from 表1 别名1, 表2 别名2 where 连接条件 and 其他条件;
mysql> select * from student s, class c where s.class_id = c.id;
+----+----------+--------+------+--------+-------------+----------+----+-----------+
| id | name | sno | age | gender | enroll_date | class_id | id | name |
+----+----------+--------+------+--------+-------------+----------+----+-----------+
| 1 | 唐三藏 | 100001 | 18 | 1 | 1986-09-01 | 1 | 1 | Java001班 |
| 2 | 孙悟空 | 100002 | 18 | 1 | 1986-09-01 | 1 | 1 | Java001班 |
| 3 | 猪悟能 | 100003 | 18 | 1 | 1986-09-01 | 1 | 1 | Java001班 |
| 4 | 沙悟净 | 100004 | 18 | 1 | 1986-09-01 | 1 | 1 | Java001班 |
| 5 | 宋江 | 200001 | 18 | 1 | 2000-09-01 | 2 | 2 | C++001班 |
| 6 | 武松 | 200002 | 18 | 1 | 2000-09-01 | 2 | 2 | C++001班 |
| 7 | 李逹 | 200003 | 18 | 1 | 2000-09-01 | 2 | 2 | C++001班 |
| 8 | 不想毕业 | 200004 | 18 | 1 | 2000-09-01 | 2 | 2 | C++001班 |
+----+----------+--------+------+--------+-------------+----------+----+-----------+
8 rows in set (0.00 sec)
规范写法:
select 字段 from 表1 别名1 [inner] join 表2 别名2 on 连接条件 where 其他条件;
mysql> select * from student s join class c on s.class_id = c.id;
+----+----------+--------+------+--------+-------------+----------+----+-----------+
| id | name | sno | age | gender | enroll_date | class_id | id | name |
+----+----------+--------+------+--------+-------------+----------+----+-----------+
| 1 | 唐三藏 | 100001 | 18 | 1 | 1986-09-01 | 1 | 1 | Java001班 |
| 2 | 孙悟空 | 100002 | 18 | 1 | 1986-09-01 | 1 | 1 | Java001班 |
| 3 | 猪悟能 | 100003 | 18 | 1 | 1986-09-01 | 1 | 1 | Java001班 |
| 4 | 沙悟净 | 100004 | 18 | 1 | 1986-09-01 | 1 | 1 | Java001班 |
| 5 | 宋江 | 200001 | 18 | 1 | 2000-09-01 | 2 | 2 | C++001班 |
| 6 | 武松 | 200002 | 18 | 1 | 2000-09-01 | 2 | 2 | C++001班 |
| 7 | 李逹 | 200003 | 18 | 1 | 2000-09-01 | 2 | 2 | C++001班 |
| 8 | 不想毕业 | 200004 | 18 | 1 | 2000-09-01 | 2 | 2 | C++001班 |
+----+----------+--------+------+--------+-------------+----------+----+-----------+
8 rows in set (0.00 sec)mysql> select * from student s inner join class c on s.class_id = c.id;
+----+----------+--------+------+--------+-------------+----------+----+-----------+
| id | name | sno | age | gender | enroll_date | class_id | id | name |
+----+----------+--------+------+--------+-------------+----------+----+-----------+
| 1 | 唐三藏 | 100001 | 18 | 1 | 1986-09-01 | 1 | 1 | Java001班 |
| 2 | 孙悟空 | 100002 | 18 | 1 | 1986-09-01 | 1 | 1 | Java001班 |
| 3 | 猪悟能 | 100003 | 18 | 1 | 1986-09-01 | 1 | 1 | Java001班 |
| 4 | 沙悟净 | 100004 | 18 | 1 | 1986-09-01 | 1 | 1 | Java001班 |
| 5 | 宋江 | 200001 | 18 | 1 | 2000-09-01 | 2 | 2 | C++001班 |
| 6 | 武松 | 200002 | 18 | 1 | 2000-09-01 | 2 | 2 | C++001班 |
| 7 | 李逹 | 200003 | 18 | 1 | 2000-09-01 | 2 | 2 | C++001班 |
| 8 | 不想毕业 | 200004 | 18 | 1 | 2000-09-01 | 2 | 2 | C++001班 |
+----+----------+--------+------+--------+-------------+----------+----+-----------+
8 rows in set (0.00 sec)
- join两边肯定是表名
- on后面肯定是条件
2.2 示例
- 查询唐三藏同学的成绩
-- 创建成绩表
mysql> drop table if exists score;
Query OK, 0 rows affected, 1 warning (0.00 sec)mysql> create table score (-> id bigint primary key auto_increment,-> student_id bigint not null,-> course_id bigint not null,-> score float not null-> );
Query OK, 0 rows affected (0.02 sec)mysql> 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),-> (80, 7, 2),(92, 7, 6);
Query OK, 20 rows affected (0.01 sec)
Records: 20 Duplicates: 0 Warnings: 0mysql> select * from score;
+----+------------+-----------+-------+
| id | student_id | course_id | score |
+----+------------+-----------+-------+
| 1 | 1 | 1 | 70.5 |
| 2 | 1 | 3 | 98.5 |
| 3 | 1 | 5 | 33 |
| 4 | 1 | 6 | 98 |
| 5 | 2 | 1 | 60 |
| 6 | 2 | 5 | 59.5 |
| 7 | 3 | 1 | 33 |
| 8 | 3 | 3 | 68 |
| 9 | 3 | 5 | 99 |
| 10 | 4 | 1 | 67 |
| 11 | 4 | 3 | 23 |
| 12 | 4 | 5 | 56 |
| 13 | 4 | 6 | 72 |
| 14 | 5 | 1 | 81 |
| 15 | 5 | 5 | 37 |
| 16 | 6 | 2 | 56 |
| 17 | 6 | 4 | 43 |
| 18 | 6 | 6 | 79 |
| 19 | 7 | 2 | 80 |
| 20 | 7 | 6 | 92 |
+----+------------+-----------+-------+
20 rows in set (0.00 sec)
- 取两张表的笛卡尔积
mysql> select * from student, score;
+----+----------+--------+------+--------+-------------+----------+----+------------+-----------+-------+
| id | name | sno | age | gender | enroll_date | class_id | id | student_id | course_id | score |
+----+----------+--------+------+--------+-------------+----------+----+------------+-----------+-------+
| 8 | 不想毕业 | 200004 | 18 | 1 | 2000-09-01 | 2 | 1 | 1 | 1 | 70.5 |
| 7 | 李逹 | 200003 | 18 | 1 | 2000-09-01 | 2 | 1 | 1 | 1 | 70.5 |
| 6 | 武松 | 200002 | 18 | 1 | 2000-09-01 | 2 | 1 | 1 | 1 | 70.5 |
| 5 | 宋江 | 200001 | 18 | 1 | 2000-09-01 | 2 | 1 | 1 | 1 | 70.5 |
| 4 | 沙悟净 | 100004 | 18 | 1 | 1986-09-01 | 1 | 1 | 1 | 1 | 70.5 |
| 3 | 猪悟能 | 100003 | 18 | 1 | 1986-09-01 | 1 | 1 | 1 | 1 | 70.5 |
| 2 | 孙悟空 | 100002 | 18 | 1 | 1986-09-01 | 1 | 1 | 1 | 1 | 70.5 |
| 1 | 唐三藏 | 100001 | 18 | 1 | 1986-09-01 | 1 | 1 | 1 | 1 | 70.5 |
| 8 | 不想毕业 | 200004 | 18 | 1 | 2000-09-01 | 2 | 2 | 1 | 3 | 98.5 |
| 7 | 李逹 | 200003 | 18 | 1 | 2000-09-01 | 2 | 2 | 1 | 3 | 98.5 |
| 6 | 武松 | 200002 | 18 | 1 | 2000-09-01 | 2 | 2 | 1 | 3 | 98.5 |
| 5 | 宋江 | 200001 | 18 | 1 | 2000-09-01 | 2 | 2 | 1 | 3 | 98.5 |
| 4 | 沙悟净 | 100004 | 18 | 1 | 1986-09-01 | 1 | 2 | 1 | 3 | 98.5 |
| 3 | 猪悟能 | 100003 | 18 | 1 | 1986-09-01 | 1 | 2 | 1 | 3 | 98.5 |
| 2 | 孙悟空 | 100002 | 18 | 1 | 1986-09-01 | 1 | 2 | 1 | 3 | 98.5 |
| 1 | 唐三藏 | 100001 | 18 | 1 | 1986-09-01 | 1 | 2 | 1 | 3 | 98.5 |
| 8 | 不想毕业 | 200004 | 18 | 1 | 2000-09-01 | 2 | 3 | 1 | 5 | 33 |
| 7 | 李逹 | 200003 | 18 | 1 | 2000-09-01 | 2 | 3 | 1 | 5 | 33 |
| 6 | 武松 | 200002 | 18 | 1 | 2000-09-01 | 2 | 3 | 1 | 5 | 33 |
| 5 | 宋江 | 200001 | 18 | 1 | 2000-09-01 | 2 | 3 | 1 | 5 | 33 |
| 4 | 沙悟净 | 100004 | 18 | 1 | 1986-09-01 | 1 | 3 | 1 | 5 | 33 |
| 3 | 猪悟能 | 100003 | 18 | 1 | 1986-09-01 | 1 | 3 | 1 | 5 | 33 |
| 2 | 孙悟空 | 100002 | 18 | 1 | 1986-09-01 | 1 | 3 | 1 | 5 | 33 |
| 1 | 唐三藏 | 100001 | 18 | 1 | 1986-09-01 | 1 | 3 | 1 | 5 | 33 |
| 8 | 不想毕业 | 200004 | 18 | 1 | 2000-09-01 | 2 | 4 | 1 | 6 | 98 |
| 7 | 李逹 | 200003 | 18 | 1 | 2000-09-01 | 2 | 4 | 1 | 6 | 98 |
| 6 | 武松 | 200002 | 18 | 1 | 2000-09-01 | 2 | 4 | 1 | 6 | 98 |
| 5 | 宋江 | 200001 | 18 | 1 | 2000-09-01 | 2 | 4 | 1 | 6 | 98 |
| 4 | 沙悟净 | 100004 | 18 | 1 | 1986-09-01 | 1 | 4 | 1 | 6 | 98 |
| 3 | 猪悟能 | 100003 | 18 | 1 | 1986-09-01 | 1 | 4 | 1 | 6 | 98 |
| 2 | 孙悟空 | 100002 | 18 | 1 | 1986-09-01 | 1 | 4 | 1 | 6 | 98 |
| 1 | 唐三藏 | 100001 | 18 | 1 | 1986-09-01 | 1 | 4 | 1 | 6 | 98 |
| 8 | 不想毕业 | 200004 | 18 | 1 | 2000-09-01 | 2 | 5 | 2 | 1 | 60 |
| 7 | 李逹 | 200003 | 18 | 1 | 2000-09-01 | 2 | 5 | 2 | 1 | 60 |
| 6 | 武松 | 200002 | 18 | 1 | 2000-09-01 | 2 | 5 | 2 | 1 | 60 |
| 5 | 宋江 | 200001 | 18 | 1 | 2000-09-01 | 2 | 5 | 2 | 1 | 60 |
| 4 | 沙悟净 | 100004 | 18 | 1 | 1986-09-01 | 1 | 5 | 2 | 1 | 60 |
| 3 | 猪悟能 | 100003 | 18 | 1 | 1986-09-01 | 1 | 5 | 2 | 1 | 60 |
| 2 | 孙悟空 | 100002 | 18 | 1 | 1986-09-01 | 1 | 5 | 2 | 1 | 60 |
| 1 | 唐三藏 | 100001 | 18 | 1 | 1986-09-01 | 1 | 5 | 2 | 1 | 60 |
| 8 | 不想毕业 | 200004 | 18 | 1 | 2000-09-01 | 2 | 6 | 2 | 5 | 59.5 |
| 7 | 李逹 | 200003 | 18 | 1 | 2000-09-01 | 2 | 6 | 2 | 5 | 59.5 |
| 6 | 武松 | 200002 | 18 | 1 | 2000-09-01 | 2 | 6 | 2 | 5 | 59.5 |
| 5 | 宋江 | 200001 | 18 | 1 | 2000-09-01 | 2 | 6 | 2 | 5 | 59.5 |
| 4 | 沙悟净 | 100004 | 18 | 1 | 1986-09-01 | 1 | 6 | 2 | 5 | 59.5 |
| 3 | 猪悟能 | 100003 | 18 | 1 | 1986-09-01 | 1 | 6 | 2 | 5 | 59.5 |
| 2 | 孙悟空 | 100002 | 18 | 1 | 1986-09-01 | 1 | 6 | 2 | 5 | 59.5 |
| 1 | 唐三藏 | 100001 | 18 | 1 | 1986-09-01 | 1 | 6 | 2 | 5 | 59.5 |
| 8 | 不想毕业 | 200004 | 18 | 1 | 2000-09-01 | 2 | 7 | 3 | 1 | 33 |
| 7 | 李逹 | 200003 | 18 | 1 | 2000-09-01 | 2 | 7 | 3 | 1 | 33 |
| 6 | 武松 | 200002 | 18 | 1 | 2000-09-01 | 2 | 7 | 3 | 1 | 33 |
| 5 | 宋江 | 200001 | 18 | 1 | 2000-09-01 | 2 | 7 | 3 | 1 | 33 |
| 4 | 沙悟净 | 100004 | 18 | 1 | 1986-09-01 | 1 | 7 | 3 | 1 | 33 |
| 3 | 猪悟能 | 100003 | 18 | 1 | 1986-09-01 | 1 | 7 | 3 | 1 | 33 |
| 2 | 孙悟空 | 100002 | 18 | 1 | 1986-09-01 | 1 | 7 | 3 | 1 | 33 |
| 1 | 唐三藏 | 100001 | 18 | 1 | 1986-09-01 | 1 | 7 | 3 | 1 | 33 |
| 8 | 不想毕业 | 200004 | 18 | 1 | 2000-09-01 | 2 | 8 | 3 | 3 | 68 |
| 7 | 李逹 | 200003 | 18 | 1 | 2000-09-01 | 2 | 8 | 3 | 3 | 68 |
| 6 | 武松 | 200002 | 18 | 1 | 2000-09-01 | 2 | 8 | 3 | 3 | 68 |
| 5 | 宋江 | 200001 | 18 | 1 | 2000-09-01 | 2 | 8 | 3 | 3 | 68 |
| 4 | 沙悟净 | 100004 | 18 | 1 | 1986-09-01 | 1 | 8 | 3 | 3 | 68 |
| 3 | 猪悟能 | 100003 | 18 | 1 | 1986-09-01 | 1 | 8 | 3 | 3 | 68 |
| 2 | 孙悟空 | 100002 | 18 | 1 | 1986-09-01 | 1 | 8 | 3 | 3 | 68 |
| 1 | 唐三藏 | 100001 | 18 | 1 | 1986-09-01 | 1 | 8 | 3 | 3 | 68 |
| 8 | 不想毕业 | 200004 | 18 | 1 | 2000-09-01 | 2 | 9 | 3 | 5 | 99 |
| 7 | 李逹 | 200003 | 18 | 1 | 2000-09-01 | 2 | 9 | 3 | 5 | 99 |
| 6 | 武松 | 200002 | 18 | 1 | 2000-09-01 | 2 | 9 | 3 | 5 | 99 |
| 5 | 宋江 | 200001 | 18 | 1 | 2000-09-01 | 2 | 9 | 3 | 5 | 99 |
| 4 | 沙悟净 | 100004 | 18 | 1 | 1986-09-01 | 1 | 9 | 3 | 5 | 99 |
| 3 | 猪悟能 | 100003 | 18 | 1 | 1986-09-01 | 1 | 9 | 3 | 5 | 99 |
| 2 | 孙悟空 | 100002 | 18 | 1 | 1986-09-01 | 1 | 9 | 3 | 5 | 99 |
| 1 | 唐三藏 | 100001 | 18 | 1 | 1986-09-01 | 1 | 9 | 3 | 5 | 99 |
| 8 | 不想毕业 | 200004 | 18 | 1 | 2000-09-01 | 2 | 10 | 4 | 1 | 67 |
| 7 | 李逹 | 200003 | 18 | 1 | 2000-09-01 | 2 | 10 | 4 | 1 | 67 |
| 6 | 武松 | 200002 | 18 | 1 | 2000-09-01 | 2 | 10 | 4 | 1 | 67 |
| 5 | 宋江 | 200001 | 18 | 1 | 2000-09-01 | 2 | 10 | 4 | 1 | 67 |
| 4 | 沙悟净 | 100004 | 18 | 1 | 1986-09-01 | 1 | 10 | 4 | 1 | 67 |
| 3 | 猪悟能 | 100003 | 18 | 1 | 1986-09-01 | 1 | 10 | 4 | 1 | 67 |
| 2 | 孙悟空 | 100002 | 18 | 1 | 1986-09-01 | 1 | 10 | 4 | 1 | 67 |
| 1 | 唐三藏 | 100001 | 18 | 1 | 1986-09-01 | 1 | 10 | 4 | 1 | 67 |
| 8 | 不想毕业 | 200004 | 18 | 1 | 2000-09-01 | 2 | 11 | 4 | 3 | 23 |
| 7 | 李逹 | 200003 | 18 | 1 | 2000-09-01 | 2 | 11 | 4 | 3 | 23 |
| 6 | 武松 | 200002 | 18 | 1 | 2000-09-01 | 2 | 11 | 4 | 3 | 23 |
| 5 | 宋江 | 200001 | 18 | 1 | 2000-09-01 | 2 | 11 | 4 | 3 | 23 |
| 4 | 沙悟净 | 100004 | 18 | 1 | 1986-09-01 | 1 | 11 | 4 | 3 | 23 |
| 3 | 猪悟能 | 100003 | 18 | 1 | 1986-09-01 | 1 | 11 | 4 | 3 | 23 |
| 2 | 孙悟空 | 100002 | 18 | 1 | 1986-09-01 | 1 | 11 | 4 | 3 | 23 |
| 1 | 唐三藏 | 100001 | 18 | 1 | 1986-09-01 | 1 | 11 | 4 | 3 | 23 |
| 8 | 不想毕业 | 200004 | 18 | 1 | 2000-09-01 | 2 | 12 | 4 | 5 | 56 |
| 7 | 李逹 | 200003 | 18 | 1 | 2000-09-01 | 2 | 12 | 4 | 5 | 56 |
| 6 | 武松 | 200002 | 18 | 1 | 2000-09-01 | 2 | 12 | 4 | 5 | 56 |
| 5 | 宋江 | 200001 | 18 | 1 | 2000-09-01 | 2 | 12 | 4 | 5 | 56 |
| 4 | 沙悟净 | 100004 | 18 | 1 | 1986-09-01 | 1 | 12 | 4 | 5 | 56 |
| 3 | 猪悟能 | 100003 | 18 | 1 | 1986-09-01 | 1 | 12 | 4 | 5 | 56 |
| 2 | 孙悟空 | 100002 | 18 | 1 | 1986-09-01 | 1 | 12 | 4 | 5 | 56 |
| 1 | 唐三藏 | 100001 | 18 | 1 | 1986-09-01 | 1 | 12 | 4 | 5 | 56 |
| 8 | 不想毕业 | 200004 | 18 | 1 | 2000-09-01 | 2 | 13 | 4 | 6 | 72 |
| 7 | 李逹 | 200003 | 18 | 1 | 2000-09-01 | 2 | 13 | 4 | 6 | 72 |
| 6 | 武松 | 200002 | 18 | 1 | 2000-09-01 | 2 | 13 | 4 | 6 | 72 |
| 5 | 宋江 | 200001 | 18 | 1 | 2000-09-01 | 2 | 13 | 4 | 6 | 72 |
| 4 | 沙悟净 | 100004 | 18 | 1 | 1986-09-01 | 1 | 13 | 4 | 6 | 72 |
| 3 | 猪悟能 | 100003 | 18 | 1 | 1986-09-01 | 1 | 13 | 4 | 6 | 72 |
| 2 | 孙悟空 | 100002 | 18 | 1 | 1986-09-01 | 1 | 13 | 4 | 6 | 72 |
| 1 | 唐三藏 | 100001 | 18 | 1 | 1986-09-01 | 1 | 13 | 4 | 6 | 72 |
| 8 | 不想毕业 | 200004 | 18 | 1 | 2000-09-01 | 2 | 14 | 5 | 1 | 81 |
| 7 | 李逹 | 200003 | 18 | 1 | 2000-09-01 | 2 | 14 | 5 | 1 | 81 |
| 6 | 武松 | 200002 | 18 | 1 | 2000-09-01 | 2 | 14 | 5 | 1 | 81 |
| 5 | 宋江 | 200001 | 18 | 1 | 2000-09-01 | 2 | 14 | 5 | 1 | 81 |
| 4 | 沙悟净 | 100004 | 18 | 1 | 1986-09-01 | 1 | 14 | 5 | 1 | 81 |
| 3 | 猪悟能 | 100003 | 18 | 1 | 1986-09-01 | 1 | 14 | 5 | 1 | 81 |
| 2 | 孙悟空 | 100002 | 18 | 1 | 1986-09-01 | 1 | 14 | 5 | 1 | 81 |
| 1 | 唐三藏 | 100001 | 18 | 1 | 1986-09-01 | 1 | 14 | 5 | 1 | 81 |
| 8 | 不想毕业 | 200004 | 18 | 1 | 2000-09-01 | 2 | 15 | 5 | 5 | 37 |
| 7 | 李逹 | 200003 | 18 | 1 | 2000-09-01 | 2 | 15 | 5 | 5 | 37 |
| 6 | 武松 | 200002 | 18 | 1 | 2000-09-01 | 2 | 15 | 5 | 5 | 37 |
| 5 | 宋江 | 200001 | 18 | 1 | 2000-09-01 | 2 | 15 | 5 | 5 | 37 |
| 4 | 沙悟净 | 100004 | 18 | 1 | 1986-09-01 | 1 | 15 | 5 | 5 | 37 |
| 3 | 猪悟能 | 100003 | 18 | 1 | 1986-09-01 | 1 | 15 | 5 | 5 | 37 |
| 2 | 孙悟空 | 100002 | 18 | 1 | 1986-09-01 | 1 | 15 | 5 | 5 | 37 |
| 1 | 唐三藏 | 100001 | 18 | 1 | 1986-09-01 | 1 | 15 | 5 | 5 | 37 |
| 8 | 不想毕业 | 200004 | 18 | 1 | 2000-09-01 | 2 | 16 | 6 | 2 | 56 |
| 7 | 李逹 | 200003 | 18 | 1 | 2000-09-01 | 2 | 16 | 6 | 2 | 56 |
| 6 | 武松 | 200002 | 18 | 1 | 2000-09-01 | 2 | 16 | 6 | 2 | 56 |
| 5 | 宋江 | 200001 | 18 | 1 | 2000-09-01 | 2 | 16 | 6 | 2 | 56 |
| 4 | 沙悟净 | 100004 | 18 | 1 | 1986-09-01 | 1 | 16 | 6 | 2 | 56 |
| 3 | 猪悟能 | 100003 | 18 | 1 | 1986-09-01 | 1 | 16 | 6 | 2 | 56 |
| 2 | 孙悟空 | 100002 | 18 | 1 | 1986-09-01 | 1 | 16 | 6 | 2 | 56 |
| 1 | 唐三藏 | 100001 | 18 | 1 | 1986-09-01 | 1 | 16 | 6 | 2 | 56 |
| 8 | 不想毕业 | 200004 | 18 | 1 | 2000-09-01 | 2 | 17 | 6 | 4 | 43 |
| 7 | 李逹 | 200003 | 18 | 1 | 2000-09-01 | 2 | 17 | 6 | 4 | 43 |
| 6 | 武松 | 200002 | 18 | 1 | 2000-09-01 | 2 | 17 | 6 | 4 | 43 |
| 5 | 宋江 | 200001 | 18 | 1 | 2000-09-01 | 2 | 17 | 6 | 4 | 43 |
| 4 | 沙悟净 | 100004 | 18 | 1 | 1986-09-01 | 1 | 17 | 6 | 4 | 43 |
| 3 | 猪悟能 | 100003 | 18 | 1 | 1986-09-01 | 1 | 17 | 6 | 4 | 43 |
| 2 | 孙悟空 | 100002 | 18 | 1 | 1986-09-01 | 1 | 17 | 6 | 4 | 43 |
| 1 | 唐三藏 | 100001 | 18 | 1 | 1986-09-01 | 1 | 17 | 6 | 4 | 43 |
| 8 | 不想毕业 | 200004 | 18 | 1 | 2000-09-01 | 2 | 18 | 6 | 6 | 79 |
| 7 | 李逹 | 200003 | 18 | 1 | 2000-09-01 | 2 | 18 | 6 | 6 | 79 |
| 6 | 武松 | 200002 | 18 | 1 | 2000-09-01 | 2 | 18 | 6 | 6 | 79 |
| 5 | 宋江 | 200001 | 18 | 1 | 2000-09-01 | 2 | 18 | 6 | 6 | 79 |
| 4 | 沙悟净 | 100004 | 18 | 1 | 1986-09-01 | 1 | 18 | 6 | 6 | 79 |
| 3 | 猪悟能 | 100003 | 18 | 1 | 1986-09-01 | 1 | 18 | 6 | 6 | 79 |
| 2 | 孙悟空 | 100002 | 18 | 1 | 1986-09-01 | 1 | 18 | 6 | 6 | 79 |
| 1 | 唐三藏 | 100001 | 18 | 1 | 1986-09-01 | 1 | 18 | 6 | 6 | 79 |
| 8 | 不想毕业 | 200004 | 18 | 1 | 2000-09-01 | 2 | 19 | 7 | 2 | 80 |
| 7 | 李逹 | 200003 | 18 | 1 | 2000-09-01 | 2 | 19 | 7 | 2 | 80 |
| 6 | 武松 | 200002 | 18 | 1 | 2000-09-01 | 2 | 19 | 7 | 2 | 80 |
| 5 | 宋江 | 200001 | 18 | 1 | 2000-09-01 | 2 | 19 | 7 | 2 | 80 |
| 4 | 沙悟净 | 100004 | 18 | 1 | 1986-09-01 | 1 | 19 | 7 | 2 | 80 |
| 3 | 猪悟能 | 100003 | 18 | 1 | 1986-09-01 | 1 | 19 | 7 | 2 | 80 |
| 2 | 孙悟空 | 100002 | 18 | 1 | 1986-09-01 | 1 | 19 | 7 | 2 | 80 |
| 1 | 唐三藏 | 100001 | 18 | 1 | 1986-09-01 | 1 | 19 | 7 | 2 | 80 |
| 8 | 不想毕业 | 200004 | 18 | 1 | 2000-09-01 | 2 | 20 | 7 | 6 | 92 |
| 7 | 李逹 | 200003 | 18 | 1 | 2000-09-01 | 2 | 20 | 7 | 6 | 92 |
| 6 | 武松 | 200002 | 18 | 1 | 2000-09-01 | 2 | 20 | 7 | 6 | 92 |
| 5 | 宋江 | 200001 | 18 | 1 | 2000-09-01 | 2 | 20 | 7 | 6 | 92 |
| 4 | 沙悟净 | 100004 | 18 | 1 | 1986-09-01 | 1 | 20 | 7 | 6 | 92 |
| 3 | 猪悟能 | 100003 | 18 | 1 | 1986-09-01 | 1 | 20 | 7 | 6 | 92 |
| 2 | 孙悟空 | 100002 | 18 | 1 | 1986-09-01 | 1 | 20 | 7 | 6 | 92 |
| 1 | 唐三藏 | 100001 | 18 | 1 | 1986-09-01 | 1 | 20 | 7 | 6 | 92 |
+----+----------+--------+------+--------+-------------+----------+----+------------+-----------+-------+
160 rows in set (0.00 sec)
- 根据表与表之间的关系,确定过滤条件
mysql> select * from student s, score sco where s.id = sco.student_id and s.name = '唐三藏';
+----+--------+--------+------+--------+-------------+----------+----+------------+-----------+-------+
| id | name | sno | age | gender | enroll_date | class_id | id | student_id | course_id | score |
+----+--------+--------+------+--------+-------------+----------+----+------------+-----------+-------+
| 1 | 唐三藏 | 100001 | 18 | 1 | 1986-09-01 | 1 | 1 | 1 | 1 | 70.5 |
| 1 | 唐三藏 | 100001 | 18 | 1 | 1986-09-01 | 1 | 2 | 1 | 3 | 98.5 |
| 1 | 唐三藏 | 100001 | 18 | 1 | 1986-09-01 | 1 | 3 | 1 | 5 | 33 |
| 1 | 唐三藏 | 100001 | 18 | 1 | 1986-09-01 | 1 | 4 | 1 | 6 | 98 |
+----+--------+--------+------+--------+-------------+----------+----+------------+-----------+-------+
4 rows in set (0.00 sec)
- 精简sql语句
mysql> select s.id, s.name, sco.score from student s, score sco where s.id = sco.student_id and s.name = '唐三藏';
+----+--------+-------+
| id | name | score |
+----+--------+-------+
| 1 | 唐三藏 | 70.5 |
| 1 | 唐三藏 | 98.5 |
| 1 | 唐三藏 | 33 |
| 1 | 唐三藏 | 98 |
+----+--------+-------+
4 rows in set (0.00 sec)
- 查询所有同学的总成绩,以及同学的个人信息
mysql> select * from student s, score sco where s.id = sco.student_id;
+----+--------+--------+------+--------+-------------+----------+----+------------+-----------+-------+
| id | name | sno | age | gender | enroll_date | class_id | id | student_id | course_id | score |
+----+--------+--------+------+--------+-------------+----------+----+------------+-----------+-------+
| 1 | 唐三藏 | 100001 | 18 | 1 | 1986-09-01 | 1 | 1 | 1 | 1 | 70.5 |
| 1 | 唐三藏 | 100001 | 18 | 1 | 1986-09-01 | 1 | 2 | 1 | 3 | 98.5 |
| 1 | 唐三藏 | 100001 | 18 | 1 | 1986-09-01 | 1 | 3 | 1 | 5 | 33 |
| 1 | 唐三藏 | 100001 | 18 | 1 | 1986-09-01 | 1 | 4 | 1 | 6 | 98 |
| 2 | 孙悟空 | 100002 | 18 | 1 | 1986-09-01 | 1 | 5 | 2 | 1 | 60 |
| 2 | 孙悟空 | 100002 | 18 | 1 | 1986-09-01 | 1 | 6 | 2 | 5 | 59.5 |
| 3 | 猪悟能 | 100003 | 18 | 1 | 1986-09-01 | 1 | 7 | 3 | 1 | 33 |
| 3 | 猪悟能 | 100003 | 18 | 1 | 1986-09-01 | 1 | 8 | 3 | 3 | 68 |
| 3 | 猪悟能 | 100003 | 18 | 1 | 1986-09-01 | 1 | 9 | 3 | 5 | 99 |
| 4 | 沙悟净 | 100004 | 18 | 1 | 1986-09-01 | 1 | 10 | 4 | 1 | 67 |
| 4 | 沙悟净 | 100004 | 18 | 1 | 1986-09-01 | 1 | 11 | 4 | 3 | 23 |
| 4 | 沙悟净 | 100004 | 18 | 1 | 1986-09-01 | 1 | 12 | 4 | 5 | 56 |
| 4 | 沙悟净 | 100004 | 18 | 1 | 1986-09-01 | 1 | 13 | 4 | 6 | 72 |
| 5 | 宋江 | 200001 | 18 | 1 | 2000-09-01 | 2 | 14 | 5 | 1 | 81 |
| 5 | 宋江 | 200001 | 18 | 1 | 2000-09-01 | 2 | 15 | 5 | 5 | 37 |
| 6 | 武松 | 200002 | 18 | 1 | 2000-09-01 | 2 | 16 | 6 | 2 | 56 |
| 6 | 武松 | 200002 | 18 | 1 | 2000-09-01 | 2 | 17 | 6 | 4 | 43 |
| 6 | 武松 | 200002 | 18 | 1 | 2000-09-01 | 2 | 18 | 6 | 6 | 79 |
| 7 | 李逹 | 200003 | 18 | 1 | 2000-09-01 | 2 | 19 | 7 | 2 | 80 |
| 7 | 李逹 | 200003 | 18 | 1 | 2000-09-01 | 2 | 20 | 7 | 6 | 92 |
+----+--------+--------+------+--------+-------------+----------+----+------------+-----------+-------+
20 rows in set (0.00 sec)
mysql> select s.id, s.name, s.age, sum(sco.score) from student s, score sco where s.id = sco.student_id group by (sco.student_id);
+----+--------+------+----------------+
| id | name | age | sum(sco.score) |
+----+--------+------+----------------+
| 1 | 唐三藏 | 18 | 300 |
| 2 | 孙悟空 | 18 | 119.5 |
| 3 | 猪悟能 | 18 | 200 |
| 4 | 沙悟净 | 18 | 218 |
| 5 | 宋江 | 18 | 118 |
| 6 | 武松 | 18 | 178 |
| 7 | 李逹 | 18 | 172 |
+----+--------+------+----------------+
7 rows in set (0.01 sec)
- 查询所有同学每门课的成绩,以及同学的个人信息
创建课程表
mysql> drop table if exists course;
Query OK, 0 rows affected (0.02 sec)mysql> create table course (-> id bigint primary key auto_increment,-> name varchar(20) not null-> );
Query OK, 0 rows affected (0.04 sec)mysql> insert into course (name) values ('Java'), ('C++'), ('MySQL'), ('操作系统'), ('计算机网络'), ('数据结构');
Query OK, 6 rows affected (0.01 sec)
Records: 6 Duplicates: 0 Warnings: 0mysql> select * from course;
+----+------------+
| id | name |
+----+------------+
| 1 | Java |
| 2 | C++ |
| 3 | MySQL |
| 4 | 操作系统 |
| 5 | 计算机网络 |
| 6 | 数据结构 |
+----+------------+
6 rows in set (0.00 sec)
- 取笛卡尔积(这里共有960条,只截取部分)
mysql> select * from student, course, score;
+----+----------+--------+------+--------+-------------+----------+----+------------+----+------------+-----------+-------+
| id | name | sno | age | gender | enroll_date | class_id | id | name | id | student_id | course_id | score |
+----+----------+--------+------+--------+-------------+----------+----+------------+----+------------+-----------+-------+
| 8 | 不想毕业 | 200004 | 18 | 1 | 2000-09-01 | 2 | 1 | Java | 1 | 1 | 1 | 70.5 |
| 8 | 不想毕业 | 200004 | 18 | 1 | 2000-09-01 | 2 | 2 | C++ | 1 | 1 | 1 | 70.5 |
| 8 | 不想毕业 | 200004 | 18 | 1 | 2000-09-01 | 2 | 3 | MySQL | 1 | 1 | 1 | 70.5 |
| 8 | 不想毕业 | 200004 | 18 | 1 | 2000-09-01 | 2 | 4 | 操作系统 | 1 | 1 | 1 | 70.5 |
| 8 | 不想毕业 | 200004 | 18 | 1 | 2000-09-01 | 2 | 5 | 计算机网络 | 1 | 1 | 1 | 70.5 |
| 8 | 不想毕业 | 200004 | 18 | 1 | 2000-09-01 | 2 | 6 | 数据结构 | 1 | 1 | 1 | 70.5 |
| 7 | 李逹 | 200003 | 18 | 1 | 2000-09-01 | 2 | 1 | Java | 1 | 1 | 1 | 70.5 |
| 7 | 李逹 | 200003 | 18 | 1 | 2000-09-01 | 2 | 2 | C++ | 1 | 1 | 1 | 70.5 |
| 7 | 李逹 | 200003 | 18 | 1 | 2000-09-01 | 2 | 3 | MySQL | 1 | 1 | 1 | 70.5 |
| 7 | 李逹 | 200003 | 18 | 1 | 2000-09-01 | 2 | 4 | 操作系统 | 1 | 1 | 1 | 70.5 |
| 7 | 李逹 | 200003 | 18 | 1 | 2000-09-01 | 2 | 5 | 计算机网络 | 1 | 1 | 1 | 70.5 |
| 7 | 李逹 | 200003 | 18 | 1 | 2000-09-01 | 2 | 6 | 数据结构 | 1 | 1 | 1 | 70.5 |
| 2 | 孙悟空 | 100002 | 18 | 1 | 1986-09-01 | 1 | 1 | Java | 20 | 7 | 6 | 92 |
| 2 | 孙悟空 | 100002 | 18 | 1 | 1986-09-01 | 1 | 2 | C++ | 20 | 7 | 6 | 92 |
| 2 | 孙悟空 | 100002 | 18 | 1 | 1986-09-01 | 1 | 3 | MySQL | 20 | 7 | 6 | 92 |
| 2 | 孙悟空 | 100002 | 18 | 1 | 1986-09-01 | 1 | 4 | 操作系统 | 20 | 7 | 6 | 92 |
| 2 | 孙悟空 | 100002 | 18 | 1 | 1986-09-01 | 1 | 5 | 计算机网络 | 20 | 7 | 6 | 92 |
| 2 | 孙悟空 | 100002 | 18 | 1 | 1986-09-01 | 1 | 6 | 数据结构 | 20 | 7 | 6 | 92 |
| 1 | 唐三藏 | 100001 | 18 | 1 | 1986-09-01 | 1 | 1 | Java | 20 | 7 | 6 | 92 |
| 1 | 唐三藏 | 100001 | 18 | 1 | 1986-09-01 | 1 | 2 | C++ | 20 | 7 | 6 | 92 |
| 1 | 唐三藏 | 100001 | 18 | 1 | 1986-09-01 | 1 | 3 | MySQL | 20 | 7 | 6 | 92 |
| 1 | 唐三藏 | 100001 | 18 | 1 | 1986-09-01 | 1 | 4 | 操作系统 | 20 | 7 | 6 | 92 |
| 1 | 唐三藏 | 100001 | 18 | 1 | 1986-09-01 | 1 | 5 | 计算机网络 | 20 | 7 | 6 | 92 |
| 1 | 唐三藏 | 100001 | 18 | 1 | 1986-09-01 | 1 | 6 | 数据结构 | 20 | 7 | 6 | 92 |
+----+----------+--------+------+--------+-------------+----------+----+------------+----+------------+-----------+-------+
960 rows in set (0.00 sec)
- 查看表结构,确认表连接的条件
mysql> desc student;
+-------------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+-------------+------+-----+---------+----------------+
| id | bigint | NO | PRI | NULL | auto_increment |
| name | varchar(20) | NO | | NULL | |
| sno | varchar(10) | NO | | NULL | |
| age | int | YES | | NULL | |
| gender | tinyint(1) | YES | | NULL | |
| enroll_date | date | YES | | NULL | |
| class_id | bigint | NO | | NULL | |
+-------------+-------------+------+-----+---------+----------------+
7 rows in set (0.00 sec)mysql> desc score;
+------------+--------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+--------+------+-----+---------+----------------+
| id | bigint | NO | PRI | NULL | auto_increment |
| student_id | bigint | NO | | NULL | |
| course_id | bigint | NO | | NULL | |
| score | float | NO | | NULL | |
+------------+--------+------+-----+---------+----------------+
4 rows in set (0.00 sec)mysql> desc course;
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| id | bigint | NO | PRI | NULL | auto_increment |
| name | varchar(20) | NO | | NULL | |
+-------+-------------+------+-----+---------+----------------+
2 rows in set (0.00 sec)
- 添加过滤条件
mysql> select * from student s, score sco, course c where s.id = sco.student_id and c.id = sco.course_id;
+----+--------+--------+------+--------+-------------+----------+----+------------+-----------+-------+----+------------+
| id | name | sno | age | gender | enroll_date | class_id | id | student_id | course_id | score | id | name |
+----+--------+--------+------+--------+-------------+----------+----+------------+-----------+-------+----+------------+
| 1 | 唐三藏 | 100001 | 18 | 1 | 1986-09-01 | 1 | 1 | 1 | 1 | 70.5 | 1 | Java |
| 1 | 唐三藏 | 100001 | 18 | 1 | 1986-09-01 | 1 | 2 | 1 | 3 | 98.5 | 3 | MySQL |
| 1 | 唐三藏 | 100001 | 18 | 1 | 1986-09-01 | 1 | 3 | 1 | 5 | 33 | 5 | 计算机网络 |
| 1 | 唐三藏 | 100001 | 18 | 1 | 1986-09-01 | 1 | 4 | 1 | 6 | 98 | 6 | 数据结构 |
| 2 | 孙悟空 | 100002 | 18 | 1 | 1986-09-01 | 1 | 5 | 2 | 1 | 60 | 1 | Java |
| 2 | 孙悟空 | 100002 | 18 | 1 | 1986-09-01 | 1 | 6 | 2 | 5 | 59.5 | 5 | 计算机网络 |
| 3 | 猪悟能 | 100003 | 18 | 1 | 1986-09-01 | 1 | 7 | 3 | 1 | 33 | 1 | Java |
| 3 | 猪悟能 | 100003 | 18 | 1 | 1986-09-01 | 1 | 8 | 3 | 3 | 68 | 3 | MySQL |
| 3 | 猪悟能 | 100003 | 18 | 1 | 1986-09-01 | 1 | 9 | 3 | 5 | 99 | 5 | 计算机网络 |
| 4 | 沙悟净 | 100004 | 18 | 1 | 1986-09-01 | 1 | 10 | 4 | 1 | 67 | 1 | Java |
| 4 | 沙悟净 | 100004 | 18 | 1 | 1986-09-01 | 1 | 11 | 4 | 3 | 23 | 3 | MySQL |
| 4 | 沙悟净 | 100004 | 18 | 1 | 1986-09-01 | 1 | 12 | 4 | 5 | 56 | 5 | 计算机网络 |
| 4 | 沙悟净 | 100004 | 18 | 1 | 1986-09-01 | 1 | 13 | 4 | 6 | 72 | 6 | 数据结构 |
| 5 | 宋江 | 200001 | 18 | 1 | 2000-09-01 | 2 | 14 | 5 | 1 | 81 | 1 | Java |
| 5 | 宋江 | 200001 | 18 | 1 | 2000-09-01 | 2 | 15 | 5 | 5 | 37 | 5 | 计算机网络 |
| 6 | 武松 | 200002 | 18 | 1 | 2000-09-01 | 2 | 16 | 6 | 2 | 56 | 2 | C++ |
| 6 | 武松 | 200002 | 18 | 1 | 2000-09-01 | 2 | 17 | 6 | 4 | 43 | 4 | 操作系统 |
| 6 | 武松 | 200002 | 18 | 1 | 2000-09-01 | 2 | 18 | 6 | 6 | 79 | 6 | 数据结构 |
| 7 | 李逹 | 200003 | 18 | 1 | 2000-09-01 | 2 | 19 | 7 | 2 | 80 | 2 | C++ |
| 7 | 李逹 | 200003 | 18 | 1 | 2000-09-01 | 2 | 20 | 7 | 6 | 92 | 6 | 数据结构 |
+----+--------+--------+------+--------+-------------+----------+----+------------+-----------+-------+----+------------+
20 rows in set (0.01 sec)
- 精简查询字段,得到最终结果
mysql> select s.*, c.name, sco.score from student s, score sco, course c where s.id = sco.student_id and c.id = sco.course_id;
+----+--------+--------+------+--------+-------------+----------+------------+-------+
| id | name | sno | age | gender | enroll_date | class_id | name | score |
+----+--------+--------+------+--------+-------------+----------+------------+-------+
| 1 | 唐三藏 | 100001 | 18 | 1 | 1986-09-01 | 1 | Java | 70.5 |
| 1 | 唐三藏 | 100001 | 18 | 1 | 1986-09-01 | 1 | MySQL | 98.5 |
| 1 | 唐三藏 | 100001 | 18 | 1 | 1986-09-01 | 1 | 计算机网络 | 33 |
| 1 | 唐三藏 | 100001 | 18 | 1 | 1986-09-01 | 1 | 数据结构 | 98 |
| 2 | 孙悟空 | 100002 | 18 | 1 | 1986-09-01 | 1 | Java | 60 |
| 2 | 孙悟空 | 100002 | 18 | 1 | 1986-09-01 | 1 | 计算机网络 | 59.5 |
| 3 | 猪悟能 | 100003 | 18 | 1 | 1986-09-01 | 1 | Java | 33 |
| 3 | 猪悟能 | 100003 | 18 | 1 | 1986-09-01 | 1 | MySQL | 68 |
| 3 | 猪悟能 | 100003 | 18 | 1 | 1986-09-01 | 1 | 计算机网络 | 99 |
| 4 | 沙悟净 | 100004 | 18 | 1 | 1986-09-01 | 1 | Java | 67 |
| 4 | 沙悟净 | 100004 | 18 | 1 | 1986-09-01 | 1 | MySQL | 23 |
| 4 | 沙悟净 | 100004 | 18 | 1 | 1986-09-01 | 1 | 计算机网络 | 56 |
| 4 | 沙悟净 | 100004 | 18 | 1 | 1986-09-01 | 1 | 数据结构 | 72 |
| 5 | 宋江 | 200001 | 18 | 1 | 2000-09-01 | 2 | Java | 81 |
| 5 | 宋江 | 200001 | 18 | 1 | 2000-09-01 | 2 | 计算机网络 | 37 |
| 6 | 武松 | 200002 | 18 | 1 | 2000-09-01 | 2 | C++ | 56 |
| 6 | 武松 | 200002 | 18 | 1 | 2000-09-01 | 2 | 操作系统 | 43 |
| 6 | 武松 | 200002 | 18 | 1 | 2000-09-01 | 2 | 数据结构 | 79 |
| 7 | 李逹 | 200003 | 18 | 1 | 2000-09-01 | 2 | C++ | 80 |
| 7 | 李逹 | 200003 | 18 | 1 | 2000-09-01 | 2 | 数据结构 | 92 |
+----+--------+--------+------+--------+-------------+----------+------------+-------+
20 rows in set (0.00 sec)
在工作中尽量少做大量的表关联查询,有些公司也规定,一般表关联查询不超过三张表。
3. 外连接
外连接分为左外连接、右外连接和全外来连接 三种类型,MySQL不支持全外连接。
- 左外连接:返回左表的所有记录和右表中匹配的记录。如果右表中没有匹配的记录,则结果集中对应的字段会显示null。
- 右外连接:与左外连接相反,返回右表的所有记录和左表中匹配的记录。如果左表中没有匹配的记录,则结果集中对应字段会显示为null。
- 全外连接:结合了左外连接和右外连接的特点,返回左右表中的所有记录。如果某一边表中没有匹配的记录,则结果集中对应字段会显示为NULL。
3.1 语法
-- 左外连接(基表在left join 的左边)
select 字段名 from 表名1 left join 表名2 on 连接条件;
-- 右外连接(基表在right join的右边)
select 字段 from 表名1 right join 表名2 on 连接条件;
3.2 示例
- 查询没有参加考试的同学信息(左外连接为例)
mysql> select * from student s left join score sco on s.id = sco.student_id;
+----+----------+--------+------+--------+-------------+----------+------+------------+-----------+-------+
| id | name | sno | age | gender | enroll_date | class_id | id | student_id | course_id | score |
+----+----------+--------+------+--------+-------------+----------+------+------------+-----------+-------+
| 1 | 唐三藏 | 100001 | 18 | 1 | 1986-09-01 | 1 | 4 | 1 | 6 | 98 |
| 1 | 唐三藏 | 100001 | 18 | 1 | 1986-09-01 | 1 | 3 | 1 | 5 | 33 |
| 1 | 唐三藏 | 100001 | 18 | 1 | 1986-09-01 | 1 | 2 | 1 | 3 | 98.5 |
| 1 | 唐三藏 | 100001 | 18 | 1 | 1986-09-01 | 1 | 1 | 1 | 1 | 70.5 |
| 2 | 孙悟空 | 100002 | 18 | 1 | 1986-09-01 | 1 | 6 | 2 | 5 | 59.5 |
| 2 | 孙悟空 | 100002 | 18 | 1 | 1986-09-01 | 1 | 5 | 2 | 1 | 60 |
| 3 | 猪悟能 | 100003 | 18 | 1 | 1986-09-01 | 1 | 9 | 3 | 5 | 99 |
| 3 | 猪悟能 | 100003 | 18 | 1 | 1986-09-01 | 1 | 8 | 3 | 3 | 68 |
| 3 | 猪悟能 | 100003 | 18 | 1 | 1986-09-01 | 1 | 7 | 3 | 1 | 33 |
| 4 | 沙悟净 | 100004 | 18 | 1 | 1986-09-01 | 1 | 13 | 4 | 6 | 72 |
| 4 | 沙悟净 | 100004 | 18 | 1 | 1986-09-01 | 1 | 12 | 4 | 5 | 56 |
| 4 | 沙悟净 | 100004 | 18 | 1 | 1986-09-01 | 1 | 11 | 4 | 3 | 23 |
| 4 | 沙悟净 | 100004 | 18 | 1 | 1986-09-01 | 1 | 10 | 4 | 1 | 67 |
| 5 | 宋江 | 200001 | 18 | 1 | 2000-09-01 | 2 | 15 | 5 | 5 | 37 |
| 5 | 宋江 | 200001 | 18 | 1 | 2000-09-01 | 2 | 14 | 5 | 1 | 81 |
| 6 | 武松 | 200002 | 18 | 1 | 2000-09-01 | 2 | 18 | 6 | 6 | 79 |
| 6 | 武松 | 200002 | 18 | 1 | 2000-09-01 | 2 | 17 | 6 | 4 | 43 |
| 6 | 武松 | 200002 | 18 | 1 | 2000-09-01 | 2 | 16 | 6 | 2 | 56 |
| 7 | 李逹 | 200003 | 18 | 1 | 2000-09-01 | 2 | 20 | 7 | 6 | 92 |
| 7 | 李逹 | 200003 | 18 | 1 | 2000-09-01 | 2 | 19 | 7 | 2 | 80 |
| 8 | 不想毕业 | 200004 | 18 | 1 | 2000-09-01 | 2 | NULL | NULL | NULL | NULL |
+----+----------+--------+------+--------+-------------+----------+------+------------+-----------+-------+
21 rows in set (0.01 sec)
mysql> select * from student s left join score sco on s.id = sco.student_id where sco.id is null;
+----+----------+--------+------+--------+-------------+----------+------+------------+-----------+-------+
| id | name | sno | age | gender | enroll_date | class_id | id | student_id | course_id | score |
+----+----------+--------+------+--------+-------------+----------+------+------------+-----------+-------+
| 8 | 不想毕业 | 200004 | 18 | 1 | 2000-09-01 | 2 | NULL | NULL | NULL | NULL |
+----+----------+--------+------+--------+-------------+----------+------+------------+-----------+-------+
1 row in set (0.00 sec)mysql> select s.* from student s left join score sco on s.id = sco.student_id where sco.id is null;
+----+----------+--------+------+--------+-------------+----------+
| id | name | sno | age | gender | enroll_date | class_id |
+----+----------+--------+------+--------+-------------+----------+
| 8 | 不想毕业 | 200004 | 18 | 1 | 2000-09-01 | 2 |
+----+----------+--------+------+--------+-------------+----------+
1 row in set (0.00 sec)
- 查询没有学生的班级(右外连接为例)
mysql> select * from student s right join class c on s.class_id = c.id;
+------+----------+--------+------+--------+-------------+----------+----+-----------+
| id | name | sno | age | gender | enroll_date | class_id | id | name |
+------+----------+--------+------+--------+-------------+----------+----+-----------+
| 4 | 沙悟净 | 100004 | 18 | 1 | 1986-09-01 | 1 | 1 | Java001班 |
| 3 | 猪悟能 | 100003 | 18 | 1 | 1986-09-01 | 1 | 1 | Java001班 |
| 2 | 孙悟空 | 100002 | 18 | 1 | 1986-09-01 | 1 | 1 | Java001班 |
| 1 | 唐三藏 | 100001 | 18 | 1 | 1986-09-01 | 1 | 1 | Java001班 |
| 8 | 不想毕业 | 200004 | 18 | 1 | 2000-09-01 | 2 | 2 | C++001班 |
| 7 | 李逹 | 200003 | 18 | 1 | 2000-09-01 | 2 | 2 | C++001班 |
| 6 | 武松 | 200002 | 18 | 1 | 2000-09-01 | 2 | 2 | C++001班 |
| 5 | 宋江 | 200001 | 18 | 1 | 2000-09-01 | 2 | 2 | C++001班 |
| NULL | NULL | NULL | NULL | NULL | NULL | NULL | 3 | 前端001班 |
+------+----------+--------+------+--------+-------------+----------+----+-----------+
9 rows in set (0.00 sec)mysql> select c.* from student s right join class c on s.class_id = c.id where s.id is null;
+----+-----------+
| id | name |
+----+-----------+
| 3 | 前端001班 |
+----+-----------+
1 row in set (0.00 sec)
最终MySQL在执行右外连接时,会把它转换为左外连接。
4. 自连接
4.1 应用场景
自连接是自己与自己取笛卡尔积,可以把行转化成列,在查询的时候可以使用where条件对结果进行过滤,或者说实现行与行之间的比较。在做表连接时为表起不同的别名。
-- 不为表起别名(不能正常查询)
mysql> select * from score, score;
ERROR 1066 (42000): Not unique table/alias: 'score'
-- 为表起别名(可以正常查询)select * from score sco1, score sco2;
4.2 示例
- 显示所有“MySQL”成绩比“Java”成绩高的成绩信息
mysql> select * from score s1, score s2 where s1.student_id = s2.student_id and s1.course_id = 1 and s2.course_id = 3 and s2.score > s1.score;
+----+------------+-----------+-------+----+------------+-----------+-------+
| id | student_id | course_id | score | id | student_id | course_id | score |
+----+------------+-----------+-------+----+------------+-----------+-------+
| 1 | 1 | 1 | 70.5 | 2 | 1 | 3 | 98.5 |
| 7 | 3 | 1 | 33 | 8 | 3 | 3 | 68 |
+----+------------+-----------+-------+----+------------+-----------+-------+
2 rows in set (0.01 sec)mysql> select s1.student_id, s1.score 'Java分数', s2.score 'MySQL分数' from score s1, score s2 where s1.student_id = s2.student_id and s1.course_id = 1 and s2.course_id = 3 and s2.score > s1.score;
+------------+----------+-----------+
| student_id | Java分数 | MySQL分数 |
+------------+----------+-----------+
| 1 | 70.5 | 98.5 |
| 3 | 33 | 68 |
+------------+----------+-----------+
2 rows in set (0.00 sec)
4.3 表连接练习
- 显示所有"MySQL"成绩 比“Java”成绩高的学生信息和班级以及成绩信息
select s.id, s.`name` '姓名', cla.name, s1.score 'mysql成绩', s2.score 'Java成绩'
from
score s1,
score s2,
student s,
class cla
where
s1.student_id = s2.student_id
and
s.id = s1.student_id
and
s.class_id = cla.id
and
s1.course_id = 3
and
s2.course_id = 1
and
s1.score > s2.score;
+----+--------+-----------+-----------+----------+
| id | 姓名 | name | mysql成绩 | Java成绩 |
+----+--------+-----------+-----------+----------+
| 1 | 唐三藏 | Java001班 | 98.5 | 70.5 |
| 3 | 猪悟能 | Java001班 | 68 | 33 |
+----+--------+-----------+-----------+----------+
2 rows in set (0.00 sec)
5. 子查询
子查询使把一个select语句的结果当作另一个select查询语句的条件,也叫嵌套查询。
5.1 语法
select * from table1 where col_name1 {= | IN}select col_name1 from table2 where col_name2 {= | IN} [(select ...)] ...
)
5.2 单行子查询
嵌套的查询中只返回一行数据
- 查询与“不想毕业”同学的同班同学
mysql> select class_id from student where name = '不想毕业';
+----------+
| class_id |
+----------+
| 2 |
+----------+
1 row in set (0.00 sec)mysql> select name from student where class_id = ( select class_id from student where name = '不想毕业');
+----------+
| name |
+----------+
| 宋江 |
| 武松 |
| 李逹 |
| 不想毕业 |
+----------+
4 rows in set (0.01 sec)mysql> select name from student where class_id = ( select class_id from student where name = '不想毕业') and name <> '不想毕业';
+------+
| name |
+------+
| 宋江 |
| 武松 |
| 李逹 |
+------+
3 rows in set (0.00 sec)
5.3 多行子查询
嵌套的查询中返回多行数据,使用[NOT]IN关键字
- 查询“MySQL”或“Java”课程的成绩信息
mysql> select * from course where name = 'MySQL' or name = 'Java';
+----+-------+
| id | name |
+----+-------+
| 1 | Java |
| 3 | MySQL |
+----+-------+
2 rows in set (0.00 sec)mysql> select * from score where course_id IN (select id from course where name = 'MySQL' or name = 'Java');
+----+------------+-----------+-------+
| id | student_id | course_id | score |
+----+------------+-----------+-------+
| 1 | 1 | 1 | 70.5 |
| 2 | 1 | 3 | 98.5 |
| 5 | 2 | 1 | 60 |
| 7 | 3 | 1 | 33 |
| 8 | 3 | 3 | 68 |
| 10 | 4 | 1 | 67 |
| 11 | 4 | 3 | 23 |
| 14 | 5 | 1 | 81 |
+----+------------+-----------+-------+
8 rows in set (0.01 sec)
- 查询除了“MySQL”和“Java”课程的成绩信息
mysql> select * from score where course_id NOT IN (select id from course where name = 'MySQL' or name = 'Java');
+----+------------+-----------+-------+
| id | student_id | course_id | score |
+----+------------+-----------+-------+
| 3 | 1 | 5 | 33 |
| 4 | 1 | 6 | 98 |
| 6 | 2 | 5 | 59.5 |
| 9 | 3 | 5 | 99 |
| 12 | 4 | 5 | 56 |
| 13 | 4 | 6 | 72 |
| 15 | 5 | 5 | 37 |
| 16 | 6 | 2 | 56 |
| 17 | 6 | 4 | 43 |
| 18 | 6 | 6 | 79 |
| 19 | 7 | 2 | 80 |
| 20 | 7 | 6 | 92 |
+----+------------+-----------+-------+
12 rows in set (0.01 sec)
5.4 多列子查询
单行子查询和多行子查询都只返回一列数据,多列子查询中可以返回多个列的数据,外层查询与嵌套查询的内层查询的列要匹配。
- 查询重复录入的分数
-- 插入重复的分数
mysql> insert into score(score, student_id, course_id) values (70.5, 1, 1), (98.5, 1, 3), (60, 2, 1);
Query OK, 3 rows affected (0.03 sec)
Records: 3 Duplicates: 0 Warnings: 0mysql> select * from score order by student_id asc, score desc;
+----+------------+-----------+-------+
| id | student_id | course_id | score |
+----+------------+-----------+-------+
| 2 | 1 | 3 | 98.5 |
| 22 | 1 | 3 | 98.5 |
| 4 | 1 | 6 | 98 |
| 1 | 1 | 1 | 70.5 |
| 21 | 1 | 1 | 70.5 |
| 3 | 1 | 5 | 33 |
| 5 | 2 | 1 | 60 |
| 23 | 2 | 1 | 60 |
| 6 | 2 | 5 | 59.5 |
| 9 | 3 | 5 | 99 |
| 8 | 3 | 3 | 68 |
| 7 | 3 | 1 | 33 |
| 13 | 4 | 6 | 72 |
| 10 | 4 | 1 | 67 |
| 12 | 4 | 5 | 56 |
| 11 | 4 | 3 | 23 |
| 14 | 5 | 1 | 81 |
| 15 | 5 | 5 | 37 |
| 18 | 6 | 6 | 79 |
| 16 | 6 | 2 | 56 |
| 17 | 6 | 4 | 43 |
| 20 | 7 | 6 | 92 |
| 19 | 7 | 2 | 80 |
+----+------------+-----------+-------+
23 rows in set (0.00 sec)
- 对重复的列进行分组
mysql> select student_id, course_id, score from score group by student_id, course_id, score;
+------------+-----------+-------+
| student_id | course_id | score |
+------------+-----------+-------+
| 1 | 1 | 70.5 |
| 1 | 3 | 98.5 |
| 1 | 5 | 33 |
| 1 | 6 | 98 |
| 2 | 1 | 60 |
| 2 | 5 | 59.5 |
| 3 | 1 | 33 |
| 3 | 3 | 68 |
| 3 | 5 | 99 |
| 4 | 1 | 67 |
| 4 | 3 | 23 |
| 4 | 5 | 56 |
| 4 | 6 | 72 |
| 5 | 1 | 81 |
| 5 | 5 | 37 |
| 6 | 2 | 56 |
| 6 | 4 | 43 |
| 6 | 6 | 79 |
| 7 | 2 | 80 |
| 7 | 6 | 92 |
+------------+-----------+-------+
20 rows in set (0.00 sec)
- 统计以下每个分组的记录数
mysql> select student_id, course_id, score, count(*) from score group by student_id, course_id, score;
+------------+-----------+-------+----------+
| student_id | course_id | score | count(*) |
+------------+-----------+-------+----------+
| 1 | 1 | 70.5 | 2 |
| 1 | 3 | 98.5 | 2 |
| 1 | 5 | 33 | 1 |
| 1 | 6 | 98 | 1 |
| 2 | 1 | 60 | 2 |
| 2 | 5 | 59.5 | 1 |
| 3 | 1 | 33 | 1 |
| 3 | 3 | 68 | 1 |
| 3 | 5 | 99 | 1 |
| 4 | 1 | 67 | 1 |
| 4 | 3 | 23 | 1 |
| 4 | 5 | 56 | 1 |
| 4 | 6 | 72 | 1 |
| 5 | 1 | 81 | 1 |
| 5 | 5 | 37 | 1 |
| 6 | 2 | 56 | 1 |
| 6 | 4 | 43 | 1 |
| 6 | 6 | 79 | 1 |
| 7 | 2 | 80 | 1 |
| 7 | 6 | 92 | 1 |
+------------+-----------+-------+----------+
20 rows in set (0.00 sec)
- 如果分组的记录大于1,则表示有重复记录,对分组的结果进行过滤
mysql> select student_id, course_id, score, count(*) from score group by student_id, course_id, score having count(*) > 1;
+------------+-----------+-------+----------+
| student_id | course_id | score | count(*) |
+------------+-----------+-------+----------+
| 1 | 1 | 70.5 | 2 |
| 1 | 3 | 98.5 | 2 |
| 2 | 1 | 60 | 2 |
+------------+-----------+-------+----------+
3 rows in set (0.00 sec)
- 确定内层的条件
mysql> select student_id, course_id, score from score group by student_id, course_id, score having count(*) > 1;
+------------+-----------+-------+
| student_id | course_id | score |
+------------+-----------+-------+
| 1 | 1 | 70.5 |
| 1 | 3 | 98.5 |
| 2 | 1 | 60 |
+------------+-----------+-------+
3 rows in set (0.00 sec)
- 加入外层查询
mysql> select * from score where (student_id, course_id, score) in (select student_id, course_id, score from score group by student_id, course_id, score having count(*) > 1);
+----+------------+-----------+-------+
| id | student_id | course_id | score |
+----+------------+-----------+-------+
| 1 | 1 | 1 | 70.5 |
| 2 | 1 | 3 | 98.5 |
| 5 | 2 | 1 | 60 |
| 21 | 1 | 1 | 70.5 |
| 22 | 1 | 3 | 98.5 |
| 23 | 2 | 1 | 60 |
+----+------------+-----------+-------+
6 rows in set (0.00 sec)
内层查询结果中的列与外层条件中的列一定要匹配。
5.5 在from 子句中使用子查询
当一个查询产生结果时,MySQL自动创建一个临时表,然后把结果集放在这个临时表中,最终返回给用户,在from子句中也可以使用临时表进行子查询或表连接操作。
- 查询所有比“Java001班”平均分高的成绩信息
- 先算出Java001班的平均分
select * from score sco, (
-- 1. 使用子查询返回的值,用于where子句中
-- 2. 使用子查询生成的临时表,用于form子句中
select avg(sco.score) as avg_score from score sco, student stu, class c
where
stu.id = sco.student_id
and
stu.class_id = c.id
and
c.name = 'Java001班') as temp -- 为临时表起一个别名,以便在条件过滤中使用临时表
where sco.score > temp.avg_score;+----+------------+-----------+-------+-----------+
| id | student_id | course_id | score | avg_score |
+----+------------+-----------+-------+-----------+
| 1 | 1 | 1 | 70.5 | 66.65625 |
| 2 | 1 | 3 | 98.5 | 66.65625 |
| 4 | 1 | 6 | 98 | 66.65625 |
| 8 | 3 | 3 | 68 | 66.65625 |
| 9 | 3 | 5 | 99 | 66.65625 |
| 10 | 4 | 1 | 67 | 66.65625 |
| 13 | 4 | 6 | 72 | 66.65625 |
| 14 | 5 | 1 | 81 | 66.65625 |
| 18 | 6 | 6 | 79 | 66.65625 |
| 19 | 7 | 2 | 80 | 66.65625 |
| 20 | 7 | 6 | 92 | 66.65625 |
| 21 | 1 | 1 | 70.5 | 66.65625 |
| 22 | 1 | 3 | 98.5 | 66.65625 |
+----+------------+-----------+-------+-----------+
13 rows in set (0.00 sec)
6. 合并查询
在实际应用中,为了合并多个select操作返回的结果,可以使用集合操作符union,union all
-- 创建student1表
mysql> create table student1 like student;
Query OK, 0 rows affected (0.06 sec)
-- 插入数据
mysql> insert into student1 (name, sno, age, gender, enroll_date, class_id) values-> ('唐三藏', '100001', 18, 1, '1986-09-01', 1),-> ('刘备', '300001', 18, 1, '1993-09-01', 3),-> ('张飞', '300002', 18, 1, '1993-09-01', 3),-> ('关羽', '300003', 18, 1, '1993-09-01', 3);
Query OK, 4 rows affected (0.01 sec)
Records: 4 Duplicates: 0 Warnings: 0mysql> select * from student1;
+----+--------+--------+------+--------+-------------+----------+
| id | name | sno | age | gender | enroll_date | class_id |
+----+--------+--------+------+--------+-------------+----------+
| 1 | 唐三藏 | 100001 | 18 | 1 | 1986-09-01 | 1 |
| 2 | 刘备 | 300001 | 18 | 1 | 1993-09-01 | 3 |
| 3 | 张飞 | 300002 | 18 | 1 | 1993-09-01 | 3 |
| 4 | 关羽 | 300003 | 18 | 1 | 1993-09-01 | 3 |
+----+--------+--------+------+--------+-------------+----------+
4 rows in set (0.01 sec)
6.1 Union
该操作符用于取得两个结果集的并集。当使用该操作符时,会自动去掉结果集中的重复行。
- ** 查询student表中id<3 的同学 和 student1 表中的所有同学**
mysql> select * from student where id < 3;
+----+--------+--------+------+--------+-------------+----------+
| id | name | sno | age | gender | enroll_date | class_id |
+----+--------+--------+------+--------+-------------+----------+
| 1 | 唐三藏 | 100001 | 18 | 1 | 1986-09-01 | 1 |
| 2 | 孙悟空 | 100002 | 18 | 1 | 1986-09-01 | 1 |
+----+--------+--------+------+--------+-------------+----------+
2 rows in set (0.00 sec)mysql> select * from student1;
+----+--------+--------+------+--------+-------------+----------+
| id | name | sno | age | gender | enroll_date | class_id |
+----+--------+--------+------+--------+-------------+----------+
| 1 | 唐三藏 | 100001 | 18 | 1 | 1986-09-01 | 1 |
| 2 | 刘备 | 300001 | 18 | 1 | 1993-09-01 | 3 |
| 3 | 张飞 | 300002 | 18 | 1 | 1993-09-01 | 3 |
| 4 | 关羽 | 300003 | 18 | 1 | 1993-09-01 | 3 |
+----+--------+--------+------+--------+-------------+----------+
4 rows in set (0.00 sec)mysql> select * from student where id < 3 union select * from student1;
+----+--------+--------+------+--------+-------------+----------+
| id | name | sno | age | gender | enroll_date | class_id |
+----+--------+--------+------+--------+-------------+----------+
| 1 | 唐三藏 | 100001 | 18 | 1 | 1986-09-01 | 1 |
| 2 | 孙悟空 | 100002 | 18 | 1 | 1986-09-01 | 1 |
| 2 | 刘备 | 300001 | 18 | 1 | 1993-09-01 | 3 |
| 3 | 张飞 | 300002 | 18 | 1 | 1993-09-01 | 3 |
| 4 | 关羽 | 300003 | 18 | 1 | 1993-09-01 | 3 |
+----+--------+--------+------+--------+-------------+----------+
5 rows in set (0.00 sec)
6.2 Union all
该操作符用于取两个结果集中的并集。当使用该操作符时,不会去掉结果中的重复行。
- 查询student表中id<3 的同学 和 student1 表中的所有同学
mysql> select * from student where id < 3 union all select * from student1;
+----+--------+--------+------+--------+-------------+----------+
| id | name | sno | age | gender | enroll_date | class_id |
+----+--------+--------+------+--------+-------------+----------+
| 1 | 唐三藏 | 100001 | 18 | 1 | 1986-09-01 | 1 |
| 2 | 孙悟空 | 100002 | 18 | 1 | 1986-09-01 | 1 |
| 1 | 唐三藏 | 100001 | 18 | 1 | 1986-09-01 | 1 |
| 2 | 刘备 | 300001 | 18 | 1 | 1993-09-01 | 3 |
| 3 | 张飞 | 300002 | 18 | 1 | 1993-09-01 | 3 |
| 4 | 关羽 | 300003 | 18 | 1 | 1993-09-01 | 3 |
+----+--------+--------+------+--------+-------------+----------+
6 rows in set (0.00 sec)
7. 插入查询结果
7.1 语法
insert into table_name [(column [, column ...])] select ...
7.2 示例
- 将student表中的C++001班的同学复制到student1表中
mysql> insert into student1(name, sno, age, gender, enroll_date, class_id)-> select s.name, s.sno, s.age, s.gender, s.enroll_date, s.class_id-> from student s, class c where s.class_id = c.id and c.name = 'C++001班';
Query OK, 4 rows affected (0.01 sec)
Records: 4 Duplicates: 0 Warnings: 0mysql> select * from student1;
+----+----------+--------+------+--------+-------------+----------+
| id | name | sno | age | gender | enroll_date | class_id |
+----+----------+--------+------+--------+-------------+----------+
| 1 | 唐三藏 | 100001 | 18 | 1 | 1986-09-01 | 1 |
| 2 | 刘备 | 300001 | 18 | 1 | 1993-09-01 | 3 |
| 3 | 张飞 | 300002 | 18 | 1 | 1993-09-01 | 3 |
| 4 | 关羽 | 300003 | 18 | 1 | 1993-09-01 | 3 |
| 5 | 宋江 | 200001 | 18 | 1 | 2000-09-01 | 2 |
| 6 | 武松 | 200002 | 18 | 1 | 2000-09-01 | 2 |
| 7 | 李逹 | 200003 | 18 | 1 | 2000-09-01 | 2 |
| 8 | 不想毕业 | 200004 | 18 | 1 | 2000-09-01 | 2 |
+----+----------+--------+------+--------+-------------+----------+
8 rows in set (0.01 sec)
为重复的列指定 表名.列号 , 不重复的列可以不用加表名,但是还是推荐使用表名.列名 的方式指定查询列表。
相关文章:
【MySQL】-- 联合查询
文章目录 1. 简介1.1 为什么要使用联合查询1.2 多表联合查询时MySQL内部是如何进行计算的 2. 内连接2.1 语法2.2 示例 3. 外连接3.1 语法3.2 示例 4. 自连接4.1 应用场景4.2 示例4.3 表连接练习 5. 子查询5.1 语法5.2 单行子查询5.3 多行子查询5.4 多列子查询5.5 在from 子句中…...
《C++ Templates》:有关const、引用、指针的一些函数模板实参推导的例子
1.T按值传递 最简单的模板例子: template<typename T> void func(T x) {std::cout << typeid(T).name() << std::endl;x 20;cout << x; } 这种情况下,T永远不会被推导成带顶层const或引用的类型 【顶层const即变量本身不能…...
【算法】随机快速排序和随机选择算法
文章目录 1、随机快速排序1.1 什么是随机快排1.2 随机快排的好处 2、随机选择算法 前言: 快速排序就是每次划分前,通过一种方法将一个基准值的位置确定好,再进入不同的部分重复相同的工作以此确定好每个值的位置以达到有序。如果你之前并不了…...
si551x时钟芯片linux下调试总结
目录 前言一、依赖文档、工具二、让芯片工作的流程三、以上步骤的SOC下代码实现 前言 本文总结调试SKYWORKS芯片厂商Si5512时钟芯片时的笔记,基于linux5.10.xxx内核,在arm64架构的SOC上验证; 一、依赖文档、工具 文档名说明下载链接Si5518…...
5.6-DAE实现
解决问题: 随机缺失(实验室指标未检测)系统性噪声(设备测量误差)类别不平衡(健康/患病人群比例悬殊) 思路:引入可控噪声 → 重建原始数据 实现步骤 (1)…...
MCU怎么运行深度学习模型
Gitee仓库 git clone https://gitee.com/banana-peel-x/freedom-learn.git项目场景: 解决面试时遗留的问题,面试官提了两个问题:1.单片机能跑深度学习的模型吗? 2.为什么FreeRTOS要采用SVC去触发第一个任务,只用Pend…...
背单词软件开发英语app开发,超级单词表开发,河南数匠软件开发
在数字化教育浪潮席卷全球的当下,英语教育行业面临着教学模式创新与教学效率提升的双重挑战。如何借助技术力量,为学生提供更优质、更高效的英语学习体验,成为众多英语教育机构亟待解决的问题。河南数匠软件开发有限公司,作为专注…...
AI视觉质检的落地困境与突破路径
摘要 人工智能(AI)视觉质检技术凭借其在提升效率、降低成本和优化质量控制方面的巨大潜力,正成为现代制造业转型升级的关键驱动力。然而,尽管前景广阔,AI视觉质检在实际落地过程中仍面临诸多严峻挑战,主要…...
检测内存条好坏有工具,推荐几款内存检测工具
检测内存条的好坏其实很重要,这直接就关系到计算机是不是能够稳定的运行,也有一部分人就会关注内存检测的工具。你应该如何来选择的,不如看一下以下的这几个。 MemTest86是一个比较受到大家喜欢的内存检测工具,会支持各种类型&…...
认识tomcat(了解)
启动 1. windows版本 解压后,就能用,启动,是bin路径下的startup.bat , 关闭是ctrl C . 启动后,可以访问 http://127.0.0.1:8080。为什么是8080,因为如下这个配置文件 部署 将项目放置到webapps目录下,即…...
[20250507] AI边缘计算开发板行业调研报告 (2024年最新版)
[20250507] AI边缘计算开发板行业调研报告 (2024年最新版) 一、行业背景 随着物联网设备激增与AI模型轻量化,边缘计算成为AI落地核心场景。AI边缘计算开发板(Edge AI Board)作为硬件载体,需满足低延迟…...
前端实现文件下载
目录 1.说明 2.示例--excel 3.示例--csv 1.说明 在开发中经常会出现下载csv或者excel文件,可以通过后端下载,也可以通过前端下载,如果在前端页面中可以直接获取到要下载的数据,可以通过前端下载的方式,更加高效便捷…...
深入理解Redis缓存与数据库不一致问题及其解决方案
什么是Redis缓存数据与数据库不一致 在现代应用中,Redis作为一种高速缓存系统,被广泛用于提升系统性能。Redis缓存数据与数据库不一致,指的是缓存中的数据与数据库中的数据不匹配,导致读取缓存时得到的不是最新或正确的数据。 R…...
六级阅读———2024.12卷一 仔细阅读2
文章 An awakening has been taking place in the physical world against the beauty model that has been dictated to us for years.But in the digital arena,social media determines what is considered beautiful.(51) The two opposing struggles are taking place i…...
【Python】字符串 转为 JSON 格式的注意事项
1. 字符串转json 我们如果使用sql存储json格式,要将json转为字符串才能转。 存入sql前,字典格式转json字符串可以用这个: Table_ [{"id": 1,"name": "Alice","task": 25,"work": &quo…...
镜像和容器的管理
一、镜像的管理 获取镜像并生成相关容器 # 拉取镜像 docker pull alpine # 默认是latest,也就是最新版本,也可指定版本(在镜像名后边加“:版本号”) # 或者 # 从主机中导入镜像到docker中 docker image load -i /test#生成容器 …...
Scrapy框架之Scrapyd部署及Gerapy分布式爬虫管理框架的使用
Scrapyd Scrapyd 是一个用于部署和运行 Scrapy 爬虫的服务器。 1.安装 Scrapyd服务端:pip install scrapyd Scrapyd客户端:pip install scrapyd-client 运行scrapyd 浏览器输入http://127.0.0.1:6800/ 2.配置 安装完成后,需要对 Scra…...
【uniapp】errMsg: “navigateTo:fail timeout“
项目场景: 在点击编辑的时候不能跳转的编辑的页面,然后直接报错errMsg: "navigateTo:fail timeout" 解决方案: 看看是否是出现了盒子的冒泡事件导致了两次调用跳转路径 tap.stop...
亿级流量系统架构设计与实战(五)
高并发写场景方案 1 : 数据分片之数据库分库分表 数据分片思想:可以将资源拆开分为多份,拆分的多份小的资源一起构成完整资源。 分库和分表 分库: 分库指的是将数据库拆分为多个小数据库,原来存储在单个数据库中的数据被分开存储到各个小数据库中。 分表:分表指的是将…...
机器学习——逻辑回归ROC练习
一、 题目要求: 给定以下二分类模型的预测结果,手动绘制ROC曲线并计算AUC值: y_true [0, 1, 0, 1, 0, 1] # 真实标签(0负类,1正类) y_score [0.2, 0.7, 0.3, 0.6, 0.1, 0.8] # 模型预测得分 代码展示…...
Kubernetes学习笔记
云计算三层模型 IaaS(基础设施即服务):提供虚拟化计算资源(如虚拟机、存储、网络)。 PaaS(平台即服务):提供应用开发和部署环境(如数据库、中间件、运行时)。…...
【DB2】DB2启动失败报错SQL1042C
在本地某次启动db2时报错SQL1042C,具体报错如下 [db2inst1standby ~]$ db2start 05/07/2025 16:32:53 0 0 SQL1042C An unexpected system error occurred. SQL1032N No start database manager command was issued. SQLSTATE57019在网上百度到说是需要…...
Redis相关命令详解与原理
Redis是什么? Redis 是Remote Dictionary Server(Redis) 的缩写,是一个使用 C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型的Key-Value数据库,并提供多种语言的API。 它是一种 NoSQL(not-only sql,…...
[吾爱出品][Windows] 产品销售管理系统2.0
[Windows] 产品销售管理系统 链接:https://pan.xunlei.com/s/VOPej1bHMRCHy2np9w3TBOyKA1?pwdgjy7# 使用方法:1、先设置一下图片保存路径 2、维护产品。客户等基础信息。例如:销售类型:一次性 销售编码:RCX。 3、销…...
基于OpenTelemetry的分布式链路追踪Trace实现(PHP篇)
目录 引言一、OpenTelemetry是一套可观测性标准协议二、分布式追踪(Trace)是OpenTelemetry的核心功能之一三、OpenTelemetry的架构原理四、OpenTelemetry的分布式追踪(Trace)实践1、准备PHP环境2、下载SDK3、编写实例代码…...
电气工程中漏源电压Vds的平台电压是什么?
在MOSFET(金属 - 氧化物 - 半导体场效应晶体管)中,漏源电压 VDS 的平台电压是其输出特性曲线中的一个关键概念。 定义 在MOSFET的输出特性曲线里,当器件工作于饱和区时,漏源电流ID对漏源电压VDS的变化不太敏感&…...
第35周Zookkeeper+Dubbo Dubbo
Dubbo 详解 一、Dubbo 是什么 官网与定义 Dubbo 是一款高性能、轻量级的开源服务框架,其官网为 double.apache.org,提供中文版本(网址含 “zh”)。 核心能力 Dubbo 具备六大核心能力: 面向接口代理的高性能 RPC …...
allegro出gerber时,单击Artwork并没有弹窗的问题
使用allegro出gerber时,有时点击 Artwork图标并未如愿以偿的弹出窗口。。。 可按下面尝试恢复,注,删除前可先备份该两支文件。。。 看时间戳,删除最近的下面标红两支文件即可。...
【神经网络与深度学习】VAE 中的先验分布指的是什么
VAE 中的先验分布是什么? 在 变分自编码器(VAE) 中,先验分布指的是对潜在空间中随机变量的概率分布假设。通常情况下,VAE 设定潜在变量服从 标准正态分布 ( N(0, I) ),其中 ( 0 ) 代表均值为零的向量&…...
信息革命对经济、货币体系及权力结构的颠覆性影响
一、地理束缚的瓦解与权力转移 生产要素去实体化 思想、知识与数据取代实物资产成为核心价值来源,光速传播特性使经济活动突破物理边界。跨境远程医疗、跨国虚拟企业等新形态挑战传统管辖权概念,政府难以通过地域垄断攫取超额收益。 管辖权竞争白热化 …...
leetcode文件级全局变量会在测试用例之间相互影响
背景:在做Leetcode 743使用文件级全局变量idx,不同用例之间idx一直在。参考leetcode的文档: 解决办法:我选择在核心函数的开头,加入初始化代码(每次用例调用都会重新初始化至原始状态)...
如何查看电脑显卡配置参数 一文读懂
显卡是电脑的重要硬件之一,尤其对于游戏玩家、设计师、视频编辑等用户来说,显卡的性能直接影响电脑的使用体验。如果您想知道电脑的显卡信息,或者打算升级显卡,那么了解如何查看显卡配置是非常必要的。本文将为您提供多种简单实用…...
获取嵌入(Embeddings)的方法与实践
获取嵌入(Embeddings)的方法与实践 摘要 本文详细介绍了获取嵌入(Embeddings)的多种方法,包括降维技术和神经网络训练方法。通过具体的实例和可视化展示,我们将了解如何将高维数据转换为有意义的低维表示,以及如何根据具体任务需求选择合适…...
【国产化】在银河麒麟ARM环境下离线安装docker
1、前言 采用离线安装的方式。 关于离线安装的方式官网有介绍,但是说的很简单,网址:Binaries | Docker Docs 官网介绍的有几种主流linux系统的安装方式,但是没有kylin的,所以在此记录一下。 在安装过程中也遇到了些…...
基于大模型的子宫平滑肌瘤全周期预测与诊疗方案研究
目录 一、引言 1.1 研究背景与意义 1.2 研究目的与创新点 二、大模型技术原理与应用现状 2.1 大模型概述 2.2 相关技术原理 2.3 医疗领域应用现状 三、子宫平滑肌瘤术前预测 3.1 预测指标与数据收集 3.2 大模型预测模型构建 3.3 预测结果分析与应用 四、子宫平滑肌…...
SpringBoot 集成 Ehcache 实现本地缓存
SpringBoot 集成 Ehcache 实现本地缓存_springboot ehcache-CSDN博客...
linux下MySql的安装与配置
一键三联,把mysql的安装与配置也写了,供各位参考。 --------------------------------------MySql的安装与配置-------------------------------------- 1 将下载的 压缩包解压到指定目录 tar -zxvf mysql-5.7.26-linux-glibc2.12-x86_64.tar.gz 卸载…...
普通IT的股票交易成长史--20250507晚复盘
声明:本文章的内容只是自己学习的总结,不构成投资建议。价格行为理论学习可参考简介中的几位,感谢他们的无私奉献。 送给自己的话: 仓位就是生命,绝对不能满仓!!!!&…...
准确---Typora配置Gitee图床并实现自动图片上传
下载地址:https://github.com/Molunerfinn/picgo/releases 安装就直接下一步,下一步就行 安装完以后然后回到Typora上偏好设置指定一下路径 默认是 C:\Program Files\PicGo\PicGo.exe 并且还需要选择规则 接下来就需要去PicGo上面配置了 配置之前需要去…...
力扣热题100之回文链表
题目 给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。 代码 方法一: 将链表值复制到数组中,在数组中判断是否是回文列表 # Definition for singl…...
基于Node.js的Web爬虫: 使用Axios和Cheerio抓取网页数据
1. 环境准备 在开始之前,请确保计算机上已安装Node.js mkdir webScraper cd webScraper npm init -y npm install axios cheerio expressaxios: 用于发送HTTP请求。cheerio: 用于解析和操作HTML。express: 用于创建Web服务器。 2. 创建爬虫 在文件夹中创建一个新…...
如何用命令行判断一个exe是不是c#wpf开发的
在powershell下执行 $assembly [Reflection.Assembly]::ReflectionOnlyLoadFrom("你的exe全路径") $references $assembly.GetReferencedAssemblies() echo $assembly $references | Where-Object { $_.Name -match "PresentationFramework|PresentationCore…...
SpringBoot项目接入DeepSeek
在这个demo当中,我使用的是JDK8Spring Boot 2.6.x,下面直接给大家附上完整的代码。 一、项目结构 deepseek - demo/ ├── src/ │ ├── main/ │ │ ├── java/ │ │ │ └── cn/ │ │ │ └── mzl/ │ │ │ …...
C++ lambda表达式的捕获原理
目录 C Lambda表达式捕获机制的详细原理分析Lambda的本质机制关键实现细节特殊捕获方式[ ]空捕获[&]全引用捕获[]全值(拷贝)捕获混合捕获[,&variable]拷贝及部分引用捕获[&,variable]引用及部分拷贝捕获 显式捕获[variable]拷贝捕获部分变量[&variable]引用捕获…...
修改图像分辨率
在这个教程中,您将学习如何使用Python和深度学习技术来调整图像的分辨率。我们将从基础的图像处理技术开始,逐步深入到使用预训练的深度学习模型进行图像超分辨率处理。 一、常规修改方法 1. 安装Pillow库 首先,你需要确保你的Python环境中…...
【面板数据】公开整理-各省刑事案件统计数据集(2011-2023年)
刑事案件数量是衡量一个地区社会治安状况的重要指标。近年来,我国各地在推进法治建设和社会治理现代化的背景下,刑事案件的数量呈现出明显的区域差异和年度波动,通过年度案件数据,可以反映出社会安全水平的变化趋势,为…...
ABAP使用GET_TAX_PERCENTAGE 函数取税率
ABAP使用GET_TAX_PERCENTAGE 函数取税率 今天在做含税价的时候查到的,记录一下。S4 Hana 的环境。 先DATA一个 ftaxp GET_TAX_PERCENTAGE 函数,实例为采购订单进项税。 OK,搞定。...
鞅与停时 - 一种特别的概率论问题
讨论一个有趣的概率问题: [P3334 ZJOI2013] 抛硬币 - 洛谷 实际上是一个猴子打字问题,考虑一直无规律随即打字的猴子,键盘上只有A-Z一共26个字母,对于一个特定的字符串 S S S : ABCABCAB ,能否在有限的打…...
Android 有线网开发调试总结
Android 有线网开发调试总结 文章目录 Android 有线网开发调试总结一、前言二、有线网开发1、开关2、相关日志(3)相关广播(4)demo示例 三、其他1、Android 有线网开发调试小结2、Android13 有线网开关研究3、Android9、11 有线网络…...
.net在DB First模式使用pgsql
nuget要安装: Npgsql.EntityFrameworkCore.PostgreSQL Microsoft.EntityFrameworkCore.Tools vs2022-->工具-->nuget包管理器-->程序包管理器控制台-->输入命令: Scaffold-DbContext "Hostlocalhost;Databasemydatabase;Usernamemyu…...