多表查詢(三) Union

2021-05-24 01:20:29 字數 1002 閱讀 7818

基本表:http://blog.csdn.net/qinyushuang/archive/2010/12/31/6110245.aspx

1、關係的集合運算

注意:r差s不等於s差r。

2、union 

sql提供了union運算子,對集合進行關係並運算,但是沒有直接提供集合交和集合差的操作,可以用其他方法來實現。

eg:在student表中,查詢選修了1號或者10號課程的學生的學號,姓名,所在系資訊。

查詢結果:

上面的例子用or來實現如下:

查詢結果:

觀察上面兩組結果可以知道:or運算子的結果比用union運算子的結果多出了兩條重複的記錄。因為集合操作自動去除重複的元組。而or運算子則不具備這個功能。當然也可以用distinct關鍵字去除上面結果中重複的記錄。

另外,如果使用union運算子想要保留重複的記錄的話,可以在union後面使用all關鍵字指明。即在union後加了all關鍵字後,結果和上面使用or的結果 是一樣的。

eg2:對不同表的不同字段採用union運算子

在student表和teacher表中,查詢選修了1號或者10號課程的學生姓名,所在系,課程號資訊,以及1號或者10號課程的教師的姓名,所在系,課程號資訊。

可見對於union運算子,只要求列的型別匹配即可,列名是可以不同的,如上面例子中的sname和tname;

如果要對union運算後的結果排序,可以在order by 後用序號的形式,這樣就不用考慮結果存在列名問題。當然如果給不同列名取了相同的列名,則也不存在這個問題。

eg3:多表連線的綜合運用

從student表中查詢至少修過「計算機入門」或者「生物工程概論」兩門課程中的一門的學生學號,姓名及所修課程名和課程成績

分析:課程號和課程成績在course表中,而學生的學號和姓名資訊在student表中,顯然需要對兩個表根據cno進行等值內連線,分別查詢兩門課程之一的資訊,而後進行集合並運算

查詢**如下:

查詢結果如下:

3、多表連線的注意問題:

mysql 中關於 union 查詢多表排序的問題

union 若是不使用表的命名空間直接排序的話只需要在語句後直接加order by就可以 select name,age,day from user1 union select name,age,day from user2 order by day這樣可以直接對兩個表綜合排序 但是如果使用命名空間...

多表查詢 多表查詢 多表查詢

查詢語法 select 列表名稱 from 表明列表 where 笛卡爾積 有兩個集合a,b,取這兩個集合的所有組成情況 要完成多表查詢,需要消除無用的資料 多表查詢分類 1 內連線查詢 1 隱式內連線 使用where消除無用的資料 例子 select t1.name,t1.gender,t2.na...

mysql 多表查詢or MySQL 多表查詢

前期準備 建表create table dep id int,name varchar 20 create table emp id int primary key auto increment,name varchar 20 enum male female not null default ma...