Rumah > Artikel > pangkalan data > Adakah terdapat pernyataan pertanyaan bersarang dalam mysql?
Terdapat penyataan pertanyaan bersarang dalam mysql Sintaksnya ialah "PILIH pernyataan WHERE keadaan (PILIH pernyataan)"; lapisan pernyataan pertanyaan, iaitu, gunakan hasil pertanyaan dalam sebagai data yang dirujuk oleh pertanyaan luar.
Persekitaran pengendalian tutorial ini: sistem Windows 10, versi mysql8.0.22, komputer Dell G3.
Pertanyaan bersarang, juga dipanggil subkueri, ialah kaedah pertanyaan yang sering digunakan dalam kerja sebenar. Subquery sebenarnya ialah lapisan pernyataan pertanyaan yang bersarang selepas di mana dalam pernyataan pertanyaan sedia ada, iaitu, hasil pertanyaan dalam digunakan sebagai jadual data yang dirujuk oleh pertanyaan luar.
Dalam kerja, kita sering menghadapi 4 subkueri, yang mengandungi pengendali perbandingan (>, >=,
# 创建学员信息表 CREATE TABLE stu_info ( id INT AUTO_INCREMENT PRIMARY KEY, iname VARCHAR(20), gender CHAR(1), department VARCHAR(10), age TINYINT, province VARCHAR(10), email VARCHAR(50), mobilephone CHAR(11) ); # 向学员表中插入数据 INSERT INTO stu_info(iname,gender,department,age,province,email,mobilephone) VALUES ('张勇','男','数学系',23,'河南','sfddf123dd@163.com','13323564321'), ('王兵','男','数学系',25,'江苏','lss1993@163.com','17823774329'), ('刘伟','男','计算机系',21,'江苏','qawsed112@126.com','13834892240'), ('张峰','男','管理系',22,'上海','102945328@qq.com','13923654481'), ('董敏','女','生物系',22,'浙江','82378339@qq.com','13428439022'), ('徐晓红','女','计算机系',24,'浙江','xixiaohong@gmail.com','13720097528'), ('赵伊美','女','数学系',21,'江苏','zhaomeimei@163.com','13417723980'), ('王建国','男','管理系',24,'浙江','9213228402@qq.com','13768329901'), ('刘清','女','统计系',23,'安徽','lq1128@gmail.com','17823651180'), ('赵家和','男','计算机系',28,'山东','dcrzdbjh@163.com','13827811311'); # 创建学员成绩表 CREATE TABLE stu_score( id INT , Excel TINYINT, Tableau TINYINT, MySQL TINYINT ); # 向成绩表中插入数据 INSERT INTO stu_score VALUES (1,87,72,88), (3,90,66,72), (2,90,70,86), (4,88,82,76), (8,92,67,80), (10,88,82,89), (5,79,66,60), (7,91,78,90), (6,82,79,88), (9,85,70,85); # 1.查询年龄超过所有学员平均年龄的学员信息 SELECT * FROM stu_info WHERE age >= avg(age); #需要注意的是Where后面不能使用聚合函数 #应该修改成 SELECT AVG(age) FROM stu_info; SELECT * FROM stu_info WHERE age>=23.3 #二合一 # 1.查询年龄超过所有学员平均年龄的学员信息 SELECT * FROM stu_info WHERE age >= (SELECT AVG(age) FROM stu_info); # 2.查询年龄不低于所属系平均年龄的学员信息 SELECT * FROM stu_info AS s1 WHERE age>= ( SELECT avg(age) FROM stu_info AS s2 WHERE s1.department = s2.department);
Apabila menggunakan pertanyaan bersarang dengan pengendali perbandingan, anda perlu ambil perhatian bahawa subkueri selepas pengendali perbandingan hanya boleh mengembalikan satu hasil.
(2) Pertanyaan bersarang yang mengandungi SEBARANG atau SEMUA kata kunci
Untuk pertanyaan bersarang yang mengandungi operator perbandingan, bahagian bersarang pernyataan pertanyaan hanya boleh mengembalikan satu nilai. Jika subquery mengembalikan berbilang nilai, anda perlu menggunakan SEBARANG atau SEMUA kata kunci. Biasanya, kata kunci ANY / ALL sering digunakan dengan operator perbandingan Berikut adalah hasil gabungan 6 operator perbandingan dan kata kunci ANY / ALL:
# 1.查询非管理系中比管理系任意一个学员年龄小的学员信息 SELECT * FROM stu_info WHERE age <p><img src="https://img.php.cn/upload/article/000/000/067/4324f62c03299e4da154e72d7d28ebb8-1.png" alt="Adakah terdapat pernyataan pertanyaan bersarang dalam mysql?"> Di sini Logik pertanyaan maklumat untuk pelajar bukan pengurusan). <br></p><pre class="brush:php;toolbar:false"># 2.查询非管理系中比管理系所有学员年龄大的学员信息 SELECT * FROM stu_info WHERE age > ALL (SELECT DISTINCT age FROM stu_info WHERE department = '管理系') AND department != '管理系';
Logik pertanyaan di sini adalah seperti berikut: tanya dahulu umur pelajar di jabatan pengurusan (buang pendua), dan keputusan yang diperolehi ialah 22 dan 24; umur pelajar di jabatan bukan pengurusan Maklumat tentang pelajar yang berumur lebih daripada 22 dan 24 (iaitu, maklumat tentang pelajar bukan pengurusan yang berumur lebih daripada 24 tahun).
Apabila syarat pertanyaan melibatkan nilai diskret terhitung tertentu yang diketahui, kami boleh memilih kata kunci IN untuk melengkapkan pengekstrakan data. Kata kunci IN mempunyai dua kegunaan:
# 1.查询数学系和计算机系的学员信息 SELECT * FROM stu_info WHERE department IN('数学系','计算机系'); # 2.查询与张勇、刘伟同一个系的学员信息 SELECT * FROM stu_info WHERE department IN (SELECT department FROM stu_info WHERE iname IN('张勇','刘伟')); # 3.查询MySQL成绩大于85分的学员信息 SELECT * FROM stu_info WHERE id IN (SELECT id FROM stu_score WHERE MySQL > 85);Perlu diambil perhatian bahawa apabila menggunakan pertanyaan bersarang kata kunci IN, bahagian bersarang hanya boleh mengembalikan maklumat satu medan (seperti medan jabatan atau medan id di atas). dua atau lebih maklumat medan dikembalikan, ralat sintaks akan berlaku. (4) Pertanyaan bersarang yang mengandungi kata kunci EXISTS
Peranan kata kunci EXISTS sangat serupa dengan kata kunci IN Perbezaannya ialah pertanyaan bersarang menggunakan kata kunci EXISTS tidak mengembalikan nilai tertentu. Tetapkan, tetapi nilai logik yang memenuhi syarat (iaitu, Betul/Salah). Dengan kata lain, fungsi EXISTS adalah untuk "menentukan sama ada terdapat rekod yang memenuhi syarat-syarat tertentu Jika rekod sedemikian wujud, ia akan mengembalikan Benar (Benar), jika tiada rekod sedemikian, ia akan mengembalikan Salah (Salah." ).
# 查询MySQL成绩大于85分的学员信息 SELECT * FROM stu_info WHERE EXISTS(SELECT * FROM stu_score WHERE stu_score.id = stu_info.id AND MySQL > 85);Perlu diambil perhatian bahawa tiada parameter antara pernyataan bersarang WHERE menggunakan kata kunci EXISTS dan kata kunci EXISTS Ini kerana EXISTS hanya memerlukan satu parameter, biasanya satu ditambahkan di sebelah kanan subkueri EXISTS kenyataan. Selain itu, dalam subkueri selepas EXISTS, anda boleh menulis sebarang medan dalam jadual atau asterisk atau pemalar selepas SELECT, kerana subkueri selepas EXISTS hanya mengambil berat sama ada terdapat rekod yang memenuhi syarat. Keputusan yang dikembalikan di bawah adalah sama: [Tambahan] Mengenai dua kata kunci IN dan EXIST, terdapat juga dua kata kunci lanjutan NOT IN dan NOT EXISTS
# 查询数学系和计算机系之外的学员信息 # 方法一 SELECT * FROM stu_info WHERE department NOT IN('数学系','计算机系'); #方法二 SELECT * FROM stu_info WHERE NOT EXISTS(SELECT * FROM stu_score WHERE department IN('数学系','计算机系') and stu_score.id = stu_info.id); # not exists的逻辑比较复杂,需要大家慢慢领会 # 主要看not exists括号中的sql语句是否有结果,无结果:才会继续执行where条件;有结果:视为 where条件不成立。 # 当子查询和主查询有关联条件时,相当于从主查询中去掉子查询的数据。Untuk IN dan EXISTS The dua kata kunci boleh digantikan antara satu sama lain dalam kebanyakan kes Perbezaan utama ialah kecekapan penggunaan Dalam keadaan biasa, menggunakan EXISTS adalah lebih cekap daripada IN, tetapi penggunaan khusus bergantung pada keadaan sebenar: IN sesuai untuk jadual luaran yang besar. tetapi jadual dalaman. Di atas kita hanya mengetahui tentang subquery selepas pernyataan where Selain itu, subquery juga boleh diletakkan selepas pernyataan pilih, dari pernyataan, dan mempunyai pernyataan. Pembelajaran yang disyorkan:
Atas ialah kandungan terperinci Adakah terdapat pernyataan pertanyaan bersarang dalam mysql?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!