我有这个SQL表:
User_table:
-id_user;
-name;
-(etc);
X_table:
-id_x;
-id_user;
-(etc);
Z_table:
-id_Z;
-id_user;
-(etc);
Y_table:
-id_Y;
-id_user;
-(etc);
我想从X,Z,Y表中选择所有数据,正确的语法是什么?是否有可能超过2个表?
答案 0 :(得分:0)
如果你想选择更多的表,你应该使用'join'来...
例如:
select U.id_user, X.id_x
from User_table U join X_table X on U.id_user = X.id_user
group by ...
答案 1 :(得分:0)
第1部分 - 加入和结合
这个答案包括:
第1部分 使用内部联接连接两个或多个表(有关其他信息,请参阅维基百科条目) 如何使用联合查询 左外连接(此stackOverflow答案非常适合描述连接类型) 相交查询(以及如果数据库不支持它们如何重现它们) - 这是SQL-Server的功能(请参阅info),这也是我首先编写这一整个内容的部分原因。 第2部分 子查询 - 它们是什么,它们可以在哪里使用以及需要注意什么 笛卡尔加入了AKA - 哦,痛苦! 有许多方法可以从数据库中的多个表中检索数据。在这个答案中,我将使用ANSI-92连接语法。这可能与许多使用旧版ANSI-89语法的其他教程不同(如果你习惯了89,可能看起来不那么直观 - 但我只能说是尝试它),因为它更容易了解查询何时开始变得更复杂。为什么要用它?是否有性能提升?简短的回答是否定的,但是一旦你习惯它就会更容易阅读。使用这种语法更容易阅读其他人编写的查询。
我还将使用一个小型caryard的概念,它有一个数据库来跟踪它有哪些可用的汽车。所有者雇用了你作为他的IT计算机人员,并期望你能够丢掉他所要求的数据。
我已经制作了一些将由最终表使用的查找表。这将为我们提供一个合理的模型。首先,我将针对具有以下结构的示例数据库运行查询。我将尝试思考在开始时所犯的常见错误,并解释它们出了什么问题 - 当然还有如何纠正错误。
第一张桌子只是一个颜色列表,以便我们知道车场里有什么颜色。 [预]
mysql> create table colors(id int(3) not null auto_increment primary key,
-> color varchar(15), paint varchar(10));
Query OK, 0 rows affected (0.01 sec)
mysql> show columns from colors;
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| id | int(3) | NO | PRI | NULL | auto_increment |
| color | varchar(15) | YES | | NULL | |
| paint | varchar(10) | YES | | NULL | |
+-------+-------------+------+-----+---------+----------------+
3 rows in set (0.01 sec)
mysql> insert into colors (color, paint) values ('Red', 'Metallic'),
-> ('Green', 'Gloss'), ('Blue', 'Metallic'),
-> ('White' 'Gloss'), ('Black' 'Gloss');
Query OK, 5 rows affected (0.00 sec)
Records: 5 Duplicates: 0 Warnings: 0
mysql> select * from colors;
+----+-------+----------+
| id | color | paint |
+----+-------+----------+
| 1 | Red | Metallic |
| 2 | Green | Gloss |
| 3 | Blue | Metallic |
| 4 | White | Gloss |
| 5 | Black | Gloss |
+----+-------+----------+
5 rows in set (0.00 sec)
The brands table identifies the different brands of the cars out caryard could possibly sell.
mysql> create table brands (id int(3) not null auto_increment primary key,
-> brand varchar(15));
Query OK, 0 rows affected (0.01 sec)
mysql> show columns from brands;
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| id | int(3) | NO | PRI | NULL | auto_increment |
| brand | varchar(15) | YES | | NULL | |
+-------+-------------+------+-----+---------+----------------+
2 rows in set (0.01 sec)
mysql> insert into brands (brand) values ('Ford'), ('Toyota'),
-> ('Nissan'), ('Smart'), ('BMW');
Query OK, 5 rows affected (0.00 sec)
Records: 5 Duplicates: 0 Warnings: 0
mysql> select * from brands;
+----+--------+
| id | brand |
+----+--------+
| 1 | Ford |
| 2 | Toyota |
| 3 | Nissan |
| 4 | Smart |
| 5 | BMW |
+----+--------+
5 rows in set (0.00 sec)
[/预]
模型表将涵盖不同类型的汽车,使用不同的汽车类型而不是实际的汽车模型会更简单。
[预]
mysql> create table models (id int(3) not null auto_increment primary key,
-> model varchar(15));
Query OK, 0 rows affected (0.01 sec)
mysql> show columns from models;
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| id | int(3) | NO | PRI | NULL | auto_increment |
| model | varchar(15) | YES | | NULL | |
+-------+-------------+------+-----+---------+----------------+
2 rows in set (0.00 sec)
mysql> insert into models (model) values ('Sports'), ('Sedan'), ('4WD'), ('Luxury');
Query OK, 4 rows affected (0.00 sec)
Records: 4 Duplicates: 0 Warnings: 0
mysql> select * from models;
+----+--------+
| id | model |
+----+--------+
| 1 | Sports |
| 2 | Sedan |
| 3 | 4WD |
| 4 | Luxury |
+----+--------+
4 rows in set (0.00 sec)
[/预]
最后,要把所有这些其他表格捆绑在一起,将所有这些表格联系在一起。 ID字段实际上是用于识别汽车的唯一批号。
[预]
mysql> create table cars (id int(3) not null auto_increment primary key,
-> color int(3), brand int(3), model int(3));
Query OK, 0 rows affected (0.01 sec)
mysql> show columns from cars;
+-------+--------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------+------+-----+---------+----------------+
| id | int(3) | NO | PRI | NULL | auto_increment |
| color | int(3) | YES | | NULL | |
| brand | int(3) | YES | | NULL | |
| model | int(3) | YES | | NULL | |
+-------+--------+------+-----+---------+----------------+
4 rows in set (0.00 sec)
mysql> insert into cars (color, brand, model) values (1,2,1), (3,1,2), (5,3,1),
-> (4,4,2), (2,2,3), (3,5,4), (4,1,3), (2,2,1), (5,2,3), (4,5,1);
Query OK, 10 rows affected (0.00 sec)
Records: 10 Duplicates: 0 Warnings: 0
mysql> select * from cars;
+----+-------+-------+-------+
| id | color | brand | model |
+----+-------+-------+-------+
| 1 | 1 | 2 | 1 |
| 2 | 3 | 1 | 2 |
| 3 | 5 | 3 | 1 |
| 4 | 4 | 4 | 2 |
| 5 | 2 | 2 | 3 |
| 6 | 3 | 5 | 4 |
| 7 | 4 | 1 | 3 |
| 8 | 2 | 2 | 1 |
| 9 | 5 | 2 | 3 |
| 10 | 4 | 5 | 1 |
+----+-------+-------+-------+
10 rows in set (0.00 sec)
[/预]
这将为我们提供足够的数据(我希望),以涵盖不同类型的连接的下面的示例,并提供足够的数据,使它们值得。
因此,老板想知道他所拥有的所有跑车的身份证明。
这是一个简单的两个表连接。我们有一个表格,用于识别模型和包含可用库存的表格。如您所见,cars表的model列中的数据与我们拥有的cars表的models列相关。现在,我们知道模型表的体育ID为1,因此我们可以编写连接。 [预]
select
ID,
model
from
cars
join models
on model=ID