Jadual Kandungan
多表联合查询
多表链接查询
复制条件多表查询
子语句查询
 1、作为表名使用
 2.求最大工资那个人的姓名和薪水
3. 求工资高于所有人员平均工资的人员
Rumah pangkalan data tutorial mysql mysql怎样两表查询?

mysql怎样两表查询?

Oct 02, 2020 am 10:14 AM
mysql

mysql两表查询的方法:1、使用“select 字段列表 from 表1,表2 [where 条件]”进行查询;2、使用“SELECT 字段列表 FROM 表1 关键字 JOIN 表2 ON 表1.字段 = 表2.字段;”进行查询。

mysql怎样两表查询?

mysql怎样两表查询?下面本篇文章给大家介绍一下mysql中进行多表查询的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。

多表联合查询

#创建表和数据

#创建部门
CREATE TABLE IF NOT EXISTS dept (
    did int not null auto_increment PRIMARY KEY,
    dname VARCHAR(50) not null COMMENT '部门名称'
)ENGINE=INNODB DEFAULT charset utf8;


#添加部门数据
INSERT INTO `dept` VALUES ('1', '教学部');
INSERT INTO `dept` VALUES ('2', '销售部');
INSERT INTO `dept` VALUES ('3', '市场部');
INSERT INTO `dept` VALUES ('4', '人事部');
INSERT INTO `dept` VALUES ('5', '鼓励部');

-- 创建人员
DROP TABLE IF EXISTS `person`;
CREATE TABLE `person` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL,
  `age` tinyint(4) DEFAULT '0',
  `sex` enum('男','女','人妖') NOT NULL DEFAULT '人妖',
  `salary` decimal(10,2) NOT NULL DEFAULT '250.00',
  `hire_date` date NOT NULL,
  `dept_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8;

-- 添加人员数据

-- 教学部
INSERT INTO `person` VALUES ('1', 'alex', '28', '人妖', '53000.00', '2010-06-21', '1');
INSERT INTO `person` VALUES ('2', 'wupeiqi', '23', '男', '8000.00', '2011-02-21', '1');
INSERT INTO `person` VALUES ('3', 'egon', '30', '男', '6500.00', '2015-06-21', '1');
INSERT INTO `person` VALUES ('4', 'jingnvshen', '18', '女', '6680.00', '2014-06-21', '1');

-- 销售部
INSERT INTO `person` VALUES ('5', '歪歪', '20', '女', '3000.00', '2015-02-21', '2');
INSERT INTO `person` VALUES ('6', '星星', '20', '女', '2000.00', '2018-01-30', '2');
INSERT INTO `person` VALUES ('7', '格格', '20', '女', '2000.00', '2018-02-27', '2');
INSERT INTO `person` VALUES ('8', '周周', '20', '女', '2000.00', '2015-06-21', '2');

-- 市场部
INSERT INTO `person` VALUES ('9', '月月', '21', '女', '4000.00', '2014-07-21', '3');
INSERT INTO `person` VALUES ('10', '安琪', '22', '女', '4000.00', '2015-07-15', '3');

-- 人事部
INSERT INTO `person` VALUES ('11', '周明月', '17', '女', '5000.00', '2014-06-21', '4');

-- 鼓励部
INSERT INTO `person` VALUES ('12', '苍老师', '33', '女', '1000000.00', '2018-02-21', null);
Salin selepas log masuk

多表查询语法

select  字段1,字段2... from 表1,表2... [where 条件]
Salin selepas log masuk

注意: 如果不加条件直接进行查询,则会出现以下效果,这种结果我们称之为 笛卡尔乘积

#查询人员和部门所有信息
select * from person,dept 
Salin selepas log masuk

笛卡尔乘积公式 : A表中数据条数   *  B表中数据条数  = 笛卡尔乘积.

#笛卡尔乘积示例

mysql> select * from person ,dept;
+----+----------+-----+-----+--------+------+-----+--------+
| id | name     | age | sex | salary | did  | did | dname  |
+----+----------+-----+-----+--------+------+-----+--------+
|  1 | alex     |  28 | 女  |  53000 |    1 |   1 | python |
|  1 | alex     |  28 | 女  |  53000 |    1 |   2 | linux  |
|  1 | alex     |  28 | 女  |  53000 |    1 |   3 | 明教   |
|  2 | wupeiqi  |  23 | 女  |  29000 |    1 |   1 | python |
|  2 | wupeiqi  |  23 | 女  |  29000 |    1 |   2 | linux  |
|  2 | wupeiqi  |  23 | 女  |  29000 |    1 |   3 | 明教   |
|  3 | egon     |  30 | 男  |  27000 |    1 |   1 | python |
|  3 | egon     |  30 | 男  |  27000 |    1 |   2 | linux  |
|  3 | egon     |  30 | 男  |  27000 |    1 |   3 | 明教   |
|  4 | oldboy   |  22 | 男  |      1 |    2 |   1 | python |
|  4 | oldboy   |  22 | 男  |      1 |    2 |   2 | linux  |
|  4 | oldboy   |  22 | 男  |      1 |    2 |   3 | 明教   |
|  5 | jinxin   |  33 | 女  |  28888 |    1 |   1 | python |
|  5 | jinxin   |  33 | 女  |  28888 |    1 |   2 | linux  |
|  5 | jinxin   |  33 | 女  |  28888 |    1 |   3 | 明教   |
|  6 | 张无忌   |  20 | 男  |   8000 |    3 |   1 | python |
|  6 | 张无忌   |  20 | 男  |   8000 |    3 |   2 | linux  |
|  6 | 张无忌   |  20 | 男  |   8000 |    3 |   3 | 明教   |
|  7 | 令狐冲   |  22 | 男  |   6500 | NULL |   1 | python |
|  7 | 令狐冲   |  22 | 男  |   6500 | NULL |   2 | linux  |
|  7 | 令狐冲   |  22 | 男  |   6500 | NULL |   3 | 明教   |
|  8 | 东方不败 |  23 | 女  |  18000 | NULL |   1 | python |
|  8 | 东方不败 |  23 | 女  |  18000 | NULL |   2 | linux  |
|  8 | 东方不败 |  23 | 女  |  18000 | NULL |   3 | 明教   |
+----+----------+-----+-----+--------+------+-----+--------+
Salin selepas log masuk
#查询人员和部门所有信息
select * from person,dept where person.did = dept.did;
Salin selepas log masuk

#注意: 多表查询时,一定要找到两个表中相互关联的字段,并且作为条件使用

示例

mysql> select * from person,dept where person.did = dept.did;
+----+---------+-----+-----+--------+-----+-----+--------+
| id | name    | age | sex | salary | did | did | dname  |
+----+---------+-----+-----+--------+-----+-----+--------+
|  1 | alex    |  28 | 女  |  53000 |   1 |   1 | python |
|  2 | wupeiqi |  23 | 女  |  29000 |   1 |   1 | python |
|  3 | egon    |  30 | 男  |  27000 |   1 |   1 | python |
|  4 | oldboy  |  22 | 男  |      1 |   2 |   2 | linux  |
|  5 | jinxin  |  33 | 女  |  28888 |   1 |   1 | python |
|  6 | 张无忌  |  20 | 男  |   8000 |   3 |   3 | 明教   |
|  7 | 令狐冲  |  22 | 男  |   6500 |   2 |   2 | linux  |
+----+---------+-----+-----+--------+-----+-----+--------+
7 rows in set
Salin selepas log masuk

多表链接查询

#多表连接查询语法(重点)

SELECT 字段列表
    FROM 表1  INNER|LEFT|RIGHT JOIN  表2
ON 表1.字段 = 表2.字段;
Salin selepas log masuk

1 内连接查询 (只显示符合条件的数据)

#查询人员和部门所有信息
select * from person inner join dept  on person.did =dept.did;
Salin selepas log masuk

效果: 大家可能会发现, 内连接查询与多表联合查询的效果是一样的.

mysql> select * from person inner join  dept  on  person.did =dept.did;
+----+---------+-----+-----+--------+-----+-----+--------+
| id | name    | age | sex | salary | did | did | dname  |
+----+---------+-----+-----+--------+-----+-----+--------+
|  1 | alex    |  28 | 女  |  53000 |   1 |   1 | python |
|  2 | wupeiqi |  23 | 女  |  29000 |   1 |   1 | python |
|  3 | egon    |  30 | 男  |  27000 |   1 |   1 | python |
|  4 | oldboy  |  22 | 男  |      1 |   2 |   2 | linux  |
|  5 | jinxin  |  33 | 女  |  28888 |   1 |   1 | python |
|  6 | 张无忌  |  20 | 男  |   8000 |   3 |   3 | 明教   |
|  7 | 令狐冲  |  22 | 男  |   6500 |   2 |   2 | linux  |
+----+---------+-----+-----+--------+-----+-----+--------+
7 rows in set
Salin selepas log masuk

2 左外连接查询 (左边表中的数据优先全部显示)

#查询人员和部门所有信息
select * from person left join  dept  on  person.did =dept.did;
Salin selepas log masuk

效果:人员表中的数据全部都显示,而 部门表中的数据符合条件的才会显示,不符合条件的会以 null 进行填充.

mysql> select * from person left join  dept  on  person.did =dept.did;
+----+----------+-----+-----+--------+------+------+--------+
| id | name     | age | sex | salary | did  | did  | dname  |
+----+----------+-----+-----+--------+------+------+--------+
|  1 | alex     |  28 | 女  |  53000 |    1 |    1 | python |
|  2 | wupeiqi  |  23 | 女  |  29000 |    1 |    1 | python |
|  3 | egon     |  30 | 男  |  27000 |    1 |    1 | python |
|  5 | jinxin   |  33 | 女  |  28888 |    1 |    1 | python |
|  4 | oldboy   |  22 | 男  |      1 |    2 |    2 | linux  |
|  7 | 令狐冲   |  22 | 男  |   6500 |    2 |    2 | linux  |
|  6 | 张无忌   |  20 | 男  |   8000 |    3 |    3 | 明教   |
|  8 | 东方不败 |  23 | 女  |  18000 | NULL | NULL | NULL   |
+----+----------+-----+-----+--------+------+------+--------+
8 rows in set
Salin selepas log masuk

3 右外连接查询 (右边表中的数据优先全部显示)

#查询人员和部门所有信息
select * from person right join  dept  on  person.did =dept.did;
Salin selepas log masuk

效果:正好与[左外连接相反]

mysql> select * from person right join  dept  on  person.did =dept.did;
+----+---------+-----+-----+--------+-----+-----+--------+
| id | name    | age | sex | salary | did | did | dname  |
+----+---------+-----+-----+--------+-----+-----+--------+
|  1 | alex    |  28 | 女  |  53000 |   1 |   1 | python |
|  2 | wupeiqi |  23 | 女  |  29000 |   1 |   1 | python |
|  3 | egon    |  30 | 男  |  27000 |   1 |   1 | python |
|  4 | oldboy  |  22 | 男  |      1 |   2 |   2 | linux  |
|  5 | jinxin  |  33 | 女  |  28888 |   1 |   1 | python |
|  6 | 张无忌  |  20 | 男  |   8000 |   3 |   3 | 明教   |
|  7 | 令狐冲  |  22 | 男  |   6500 |   2 |   2 | linux  |
+----+---------+-----+-----+--------+-----+-----+--------+
7 rows in set
Salin selepas log masuk

4 全连接查询(显示左右表中全部数据)

  全连接查询:是在内连接的基础上增加 左右两边没有显示的数据
  注意: mysql并不支持全连接 full JOIN 关键字
  注意: 但是mysql 提供了 UNION 关键字.使用 UNION 可以间接实现 full JOIN 功能

#查询人员和部门的所有数据
 
SELECT * FROM person LEFT JOIN dept ON person.did = dept.did
UNION
SELECT * FROM person RIGHT JOIN dept ON person.did = dept.did;
Salin selepas log masuk

示例

mysql> SELECT * FROM person LEFT JOIN dept ON person.did = dept.did
                UNION 
            SELECT * FROM person RIGHT JOIN dept ON person.did = dept.did;
+------+----------+------+------+--------+------+------+--------+
| id   | name     | age  | sex  | salary | did  | did  | dname  |
+------+----------+------+------+--------+------+------+--------+
|    1 | alex     |   28 | 女   |  53000 |    1 |    1 | python |
|    2 | wupeiqi  |   23 | 女   |  29000 |    1 |    1 | python |
|    3 | egon     |   30 | 男   |  27000 |    1 |    1 | python |
|    5 | jinxin   |   33 | 女   |  28888 |    1 |    1 | python |
|    4 | oldboy   |   22 | 男   |      1 |    2 |    2 | linux  |
|    7 | 令狐冲   |   22 | 男   |   6500 |    2 |    2 | linux  |
|    6 | 张无忌   |   20 | 男   |   8000 |    3 |    3 | 明教   |
|    8 | 东方不败 |   23 | 女   |  18000 | NULL | NULL | NULL   |
| NULL | NULL     | NULL | NULL | NULL   | NULL |    4 | 基督教 |
+------+----------+------+------+--------+------+------+--------+
9 rows in set
Salin selepas log masuk

注意: UNION 和 UNION ALL 的区别:UNION 会去掉重复的数据,而 UNION ALL 则直接显示结果

复制条件多表查询

1、查询出 教学部 年龄大于20岁,并且工资小于40000的员工,按工资倒序排列.(要求:分别使用多表联合查询和内连接查询)

示例

#1.多表联合查询方式:
select * from person p1,dept d2 where p1.did = d2.did  
    and d2.dname='python' 
    and  age>20 
    and salary <40000 
ORDER BY salary DESC;

#2.内连接查询方式:
SELECT * FROM person p1 INNER JOIN dept d2 ON p1.did= d2.did 
    and d2.dname=&#39;python&#39; 
    and  age>20 
    and salary <40000 
ORDER BY salary DESC;
Salin selepas log masuk

2、查询每个部门中最高工资和最低工资是多少,显示部门名称

select MAX(salary),MIN(salary),dept.dname from 
        person LEFT JOIN dept
            ON person.did = dept.did
 GROUP BY person.did;
Salin selepas log masuk

子语句查询

子查询(嵌套查询): 查多次, 多个select

注意: 第一次的查询结果可以作为第二次的查询的 条件 或者 表名 使用.

子查询中可以包含:IN、NOT IN、ANY、ALL、EXISTS 和 NOT EXISTS等关键字. 还可以包含比较运算符:= 、 !=、> 、<等.

1、作为表名使用
select * from (select * from person) as 表名;
Salin selepas log masuk

ps:大家需要注意的是: 一条语句中可以有多个这样的子查询,在执行时,最里层括号(sql语句) 具有优先执行权.
注意: as 后面的表名称不能加引号('')

2.求最大工资那个人的姓名和薪水
1.求最大工资
select max(salary) from person;
2.求最大工资那个人叫什么
select name,salary from person where salary=53000;

合并
select name,salary from person where salary=(select max(salary) from person);
Salin selepas log masuk
3. 求工资高于所有人员平均工资的人员
1.求平均工资
select avg(salary) from person;

2.工资大于平均工资的 人的姓名、工资
select name,salary from person where salary > 21298.625;

合并
select name,salary from person where salary >(select avg(salary) from person);
Salin selepas log masuk

推荐教程:mysql视频教程

Atas ialah kandungan terperinci mysql怎样两表查询?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Cara Membuka Segala -galanya Di Myrise
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Hubungan antara pengguna dan pangkalan data MySQL Hubungan antara pengguna dan pangkalan data MySQL Apr 08, 2025 pm 07:15 PM

Dalam pangkalan data MySQL, hubungan antara pengguna dan pangkalan data ditakrifkan oleh kebenaran dan jadual. Pengguna mempunyai nama pengguna dan kata laluan untuk mengakses pangkalan data. Kebenaran diberikan melalui perintah geran, sementara jadual dibuat oleh perintah membuat jadual. Untuk mewujudkan hubungan antara pengguna dan pangkalan data, anda perlu membuat pangkalan data, membuat pengguna, dan kemudian memberikan kebenaran.

Integrasi RDS MySQL dengan Redshift Zero ETL Integrasi RDS MySQL dengan Redshift Zero ETL Apr 08, 2025 pm 07:06 PM

Penyederhanaan Integrasi Data: AmazonRDSMYSQL dan Integrasi Data Integrasi Zero ETL Redshift adalah di tengah-tengah organisasi yang didorong oleh data. Proses tradisional ETL (ekstrak, menukar, beban) adalah kompleks dan memakan masa, terutamanya apabila mengintegrasikan pangkalan data (seperti Amazonrdsmysql) dengan gudang data (seperti redshift). Walau bagaimanapun, AWS menyediakan penyelesaian integrasi ETL sifar yang telah mengubah keadaan ini sepenuhnya, menyediakan penyelesaian yang mudah, hampir-sebenar untuk penghijrahan data dari RDSMYSQL ke redshift. Artikel ini akan menyelam ke integrasi RDSMYSQL Zero ETL dengan redshift, menjelaskan bagaimana ia berfungsi dan kelebihan yang dibawa kepada jurutera dan pemaju data.

Cara Mengisi Nama Pengguna dan Kata Laluan MySQL Cara Mengisi Nama Pengguna dan Kata Laluan MySQL Apr 08, 2025 pm 07:09 PM

Untuk mengisi nama pengguna dan kata laluan MySQL: 1. Tentukan nama pengguna dan kata laluan; 2. Sambungkan ke pangkalan data; 3. Gunakan nama pengguna dan kata laluan untuk melaksanakan pertanyaan dan arahan.

Pengoptimuman pertanyaan di MySQL adalah penting untuk meningkatkan prestasi pangkalan data, terutama ketika berurusan dengan set data yang besar Pengoptimuman pertanyaan di MySQL adalah penting untuk meningkatkan prestasi pangkalan data, terutama ketika berurusan dengan set data yang besar Apr 08, 2025 pm 07:12 PM

1. Gunakan indeks yang betul untuk mempercepatkan pengambilan data dengan mengurangkan jumlah data yang diimbas memilih*frommployeesWherElast_name = 'Smith'; Jika anda melihat lajur jadual beberapa kali, buat indeks untuk lajur tersebut. Jika anda atau aplikasi anda memerlukan data dari pelbagai lajur mengikut kriteria, buat indeks komposit 2. Elakkan pilih * Hanya lajur yang diperlukan, jika anda memilih semua lajur yang tidak diingini, ini hanya akan memakan lebih banyak pelayan dan menyebabkan pelayan melambatkan pada masa yang tinggi atau kekerapan misalnya, jadual anda

Cara Melihat MySQL Cara Melihat MySQL Apr 08, 2025 pm 07:21 PM

Lihat pangkalan data MySQL dengan arahan berikut: Sambungkan ke pelayan: MySQL -U Pengguna Nama -P Kata Laluan Run Show pangkalan data; Perintah untuk mendapatkan semua pangkalan data yang sedia ada Pilih pangkalan data: Gunakan nama pangkalan data; Lihat Jadual: Tunjukkan Jadual; Lihat Struktur Jadual: Huraikan nama jadual; Lihat data: pilih * dari nama jadual;

MySQL: Kemudahan Pengurusan Data untuk Pemula MySQL: Kemudahan Pengurusan Data untuk Pemula Apr 09, 2025 am 12:07 AM

MySQL sesuai untuk pemula kerana mudah dipasang, kuat dan mudah untuk menguruskan data. 1. Pemasangan dan konfigurasi mudah, sesuai untuk pelbagai sistem operasi. 2. Menyokong operasi asas seperti membuat pangkalan data dan jadual, memasukkan, menanyakan, mengemas kini dan memadam data. 3. Menyediakan fungsi lanjutan seperti menyertai operasi dan subqueries. 4. Prestasi boleh ditingkatkan melalui pengindeksan, pengoptimuman pertanyaan dan pembahagian jadual. 5. Sokongan sokongan, pemulihan dan langkah keselamatan untuk memastikan keselamatan data dan konsistensi.

Bolehkah saya mengambil kata laluan pangkalan data di Navicat? Bolehkah saya mengambil kata laluan pangkalan data di Navicat? Apr 08, 2025 pm 09:51 PM

Navicat sendiri tidak menyimpan kata laluan pangkalan data, dan hanya boleh mengambil kata laluan yang disulitkan. Penyelesaian: 1. Periksa Pengurus Kata Laluan; 2. Semak fungsi "Ingat Kata Laluan" Navicat; 3. Tetapkan semula kata laluan pangkalan data; 4. Hubungi pentadbir pangkalan data.

Memahami sifat asid: tiang pangkalan data yang boleh dipercayai Memahami sifat asid: tiang pangkalan data yang boleh dipercayai Apr 08, 2025 pm 06:33 PM

Penjelasan terperinci mengenai atribut asid asid pangkalan data adalah satu set peraturan untuk memastikan kebolehpercayaan dan konsistensi urus niaga pangkalan data. Mereka menentukan bagaimana sistem pangkalan data mengendalikan urus niaga, dan memastikan integriti dan ketepatan data walaupun dalam hal kemalangan sistem, gangguan kuasa, atau pelbagai pengguna akses serentak. Gambaran keseluruhan atribut asid Atomicity: Transaksi dianggap sebagai unit yang tidak dapat dipisahkan. Mana -mana bahagian gagal, keseluruhan transaksi dilancarkan kembali, dan pangkalan data tidak mengekalkan sebarang perubahan. Sebagai contoh, jika pemindahan bank ditolak dari satu akaun tetapi tidak meningkat kepada yang lain, keseluruhan operasi dibatalkan. Begintransaction; UpdateAcCountSsetBalance = Balance-100Wh

See all articles