Rumah  >  Artikel  >  pangkalan data  >  Penggunaan asas mysql left join dan perbezaan antara on dan where

Penggunaan asas mysql left join dan perbezaan antara on dan where

WBOY
WBOYke hadapan
2023-06-02 23:54:361666semak imbas

Kata Pengantar

Apabila kami menulis pernyataan SQL, kami tidak boleh mengelak daripada menggunakan kata kunci sambungan, seperti sambungan dalam dan sambungan luar. Terdapat banyak jenis. Saya akan menyiarkan di sini gambar yang saya temui di tempat lain:

Penggunaan asas mysql left join dan perbezaan antara on dan where

Saya rasa gambar ini sangat terperinci Ia menunjukkan penyataan SQL sertai dalam artikel ini sebagai contoh, ditakrifkan dalam talian seperti berikut: Kata kunci LEFT JOIN akan mengembalikan semua baris dari jadual kiri, walaupun tiada baris yang sepadan dalam jadual kanan.

Sebenarnya, secara literal, left join agak mudah difahami, tetapi masih terdapat beberapa masalah semasa penggunaan, seperti keadaan selepas dan selepas di mana, Hasilnya adalah berbeza akan belajar tentang cantuman kiri dari cetek ke dalam.

Instance

CREATE TABLE `class` (
  `class_id` int NOT NULL,
  `class_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
  `class_grade` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
  PRIMARY KEY (`class_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 ROW_FORMAT=COMPACT;

jadual skor:

CREATE TABLE `score` (
  `class_id` int NOT NULL,
  `stu_id` varchar(11) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
  `score` int DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 ROW_FORMAT=COMPACT;

Masing-masing mempunyai data:

Penggunaan asas mysql left join dan perbezaan antara on dan where

Penggunaan asas mysql left join dan perbezaan antara on dan where

S1: pilih c.class_id,c.class_name,c.class_grade,s.stu_id,s.skor daripada kelas c kiri sertai markah s pada c.class_id=s.class_id.

Ayat ini boleh ditulis semula sebagai: Kami menganalisis pernyataan ini Jadual kiri ialah jadual kelas, jadual kanan ialah jadual skor, dan medan berkaitannya ialah class_id. Apabila class_id dalam jadual kiri ialah 1, terdapat dua rekod dalam jadual kanan dengan class_id 1 apabila class_id dalam jadual kiri ialah 2, class_id dalam dua rekod dalam jadual kanan ialah 2; jadual kiri ialah 3, terdapat satu rekod dalam jadual kanan Kelas_id rekod ialah 3, jadi kita harus mendapat lima rekod:

1	语文	A	A002	82
1	语文	A	A001	91
2	数学	B	A002	87
2	数学	B	A001	95
3	英语	C	B003	65

S2: pilih c.class_id,c.class_name,c.class_grade, s.stu_id,s.skor dari kelas c meninggalkan skor s pada c.class_id=s.class_id dan s.skor=90.
Berdasarkan contoh soalan pertama, yang ini mempunyai syarat tambahan s.skor=90 Ini bermakna medan skor skor jadual yang betul ialah 90, tetapi apabila kita melihat data dalam jadual, kita dapati tiada markah 90 dalam jadual yang betul , ok, adakah keputusan itu kosong? Lagipun, jadual di sebelah kanan tidak mempunyai data yang memenuhi syarat.

Malah, jika anda melaksanakan pernyataan SQL ini, anda akhirnya akan mendapat keputusan, tetapi anda hanya akan mendapat tiga keping data Semua medan dalam jadual kiri dipaparkan, dan semua medan dalam jadual kanan adalah kosong. Ini kerana tiada rekod dalam jadual kanan dengan skor 90, jadi medan dalam jadual kanan kosong.

On menapis data dahulu dan kemudian menyambungkannya, manakala tempat menapis data selepas melakukan pertanyaan berkaitan antara kedua-dua jadual Perbezaan antara on dan where adalah di sini, dan contoh berikut juga akan merangkumi perkara ini dua adalah berbeza.

1	语文	A		
2	数学	B		
3	英语	C

S3: pilih c.class_id,c.class_name,c.class_grade,s.stu_id,s.skor dari kelas c meninggalkan skor s pada c.class_id=s.class_id di mana c.class_name=&lsquo ;Bahasa Cina’ dan s.skor=90.

Anda perlu memberi perhatian kepada perbezaan antara where dan on, kerana pernyataan ini melibatkan kata kunci where. Hasil pertanyaan sql ini kosong Ini kerana kedua-dua jadual disambungkan untuk menanyakan keputusan terlebih dahulu, dan kemudian ditapis Hasil daripada pertanyaan jadual yang disambungkan ialah tiada rekod padanan class_name=‘中文’ , dan skor=90, jadi Hasil pertanyaan kosong.

S4: pilih c.class_id,c.class_name,c.class_grade,s.stu_id,s.skor daripada kelas c kiri sertai markah s pada c.class_id=s.class_id dan 1=0.

Kami kadangkala menambah 1=1 selepas keadaan di mana SQL, dan 1=0 di sini bermakna perkaitan antara kedua-dua jadual telah gagal, jadi hasilnya hanya akan memaparkan data dari jadual kiri.

1	语文	A	null	null
2	数学	B	null	null
3	英语	C	null	null

S5: pilih c.class_id,c.class_name,c.class_grade,s.stu_id,s.skor daripada kelas c meninggalkan markah sertai s pada 1=0.

Hasil pelaksanaan ini adalah sama seperti pernyataan SQL di atas Malah, semua kandungan jadual kiri dipaparkan.

1	语文	A	null	null
2	数学	B	null	null
3	英语	C	null	null

S6: pilih c.class_id,c.class_name,c.class_grade,s.stu_id,s.skor daripada kelas c meninggalkan skor s pada c.class_id=s.class_id dan c.class_name=&lsquo "Cina".

Ini memerlukan menapis rekod dengan class_name sebagai bahasa dalam jadual kanan Terdapat dua rekod, dan kemudian menyambungkan dua rekod dalam jadual sebelah kiri.

1	语文	A	A002	82
1	语文	A	A001	91
2	数学	B	null	null
3	英语	C	null	null

S7: pilih c.class_id,c.class_name,c.class_grade,s.stu_id,s.skor daripada kelas c meninggalkan markah sertai s pada c.class_id=s.class_id dan c.class_name=&lsquo ;Bahasa Inggeris’.

Analisis soalan yang sama seperti yang sebelumnya (hasil di kawasan kosong adalah batal):

1	语文	A		
2	数学	B		
3	英语	C	B003	65

S8: pilih c.class_id,c.class_name,c.class_grade,s.stu_id ,s.skor daripada kelas c meninggalkan sertai markah s pada c.class_id=s.class_id dan c.class_name=‘体育’.

Tiada data dalam jadual kanan dan nama_kelas adalah sukan, jadi jadual kanan kosong dan semua data dalam jadual kiri dipaparkan Medan yang sepadan dalam jadual kanan kosong:

1	语文	A		
2	数学	B		
3	英语	C

S9: pilih c .class_id,c.class_name,c.class_grade,s.stu_id,s.skor dari kelas c kiri sertai markah s pada c.class_id=s.class_id dan c.class_name=‘中文&rsquo ; dan s.skor=91.

右表中只有一条记录的score为91,所以需要拿左表与右表的这一条数据进行关联,左表只有语文可以与右表的那一条数据对上,所以结果为:

1	语文	A	A001	91
2	数学	B		
3	英语	C

Q10:select c.class_id,c.class_name,c.class_grade,s.stu_id,s.score from class c left join score s on c.class_id=s.class_id and c.class_name=‘体育’ and s.score=90。

右表中没有数据的score为90,同样左表中也没有class_name为体育,但是这并不意味着最后的结果就是空了,只要没有where条件,最终的结果数量最起码也会是左表中原先的数据数量,所以这条sql会返回左表的全部数据。

1	语文	A		
2	数学	B		
3	英语	C

Q11:select c.class_id,c.class_name,c.class_grade,s.stu_id,s.score from class c left join score s on c.class_id=s.class_id where c.class_name=‘英语’。

需要注意的点:条件是在where中的,也就是在表关联之后,再进行过滤的,所以最终的结果只会有一条:

3	英语	C	B003	65

Q12:select c.class_id,c.class_name,c.class_grade,s.stu_id,s.score from class c left join score s on c.class_id=s.class_id where s.score=91。

和上面一样,是在连表查询之后,找出score=90的数据:

1	语文	A	A001	91

Q12;select c.class_id,c.class_name,c.class_grade,s.stu_id,s.score from class c left join score s on c.class_id=s.class_id where c.class_name=‘语文’ and s.score=91。

我们将两表连接查询后,找出结果中class_name为语文,score为91的记录,只有一条:

1	语文	A	A001	91

Atas ialah kandungan terperinci Penggunaan asas mysql left join dan perbezaan antara on dan where. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam