子查询
SELECT order_num FROM orderitems WHERE prod_id='TNT2';
SELECT cust_id FROM orders WHERE order_num IN (SELECT order_num FROM orderitems WHERE prod_id='TNT2');
SELECT cust_name,cust_contact FROM customers WHERE cust_id IN (SELECT cust_id FROM orders WHERE order_num IN (SELECT order_num FROM orderitems WHERE prod_id='TNT2'));
SELECT prod_name,prod_price,vend_name FROM products,vendors WHERE products.vend_id=vendors.vend_id ORDER BY prod_name,vend_name;
SELECT * FROM orders;
order_num | order_date | cust_id |
20005 | 2005-09-01 00:00:00 | 10001 |
20006 | 2005-09-12 00:00:00 | 10003 |
20007 | 2005-09-30 00:00:00 | 10004 |
20008 | 2005-10-03 00:00:00 | 10005 |
SELECT cust_name,cust_state,cust_id FROM customers;
cust_name | cust_state | cust_id |
Coyote Inc. | MI | 10001 |
Mouse House | NULL | 10002 |
Wascals | IN | 10003 |
Yosemite Place | AZ | 10004 |
The Fudds | IL | 10005 |
SELECT COUNT(*) AS orders FROM orders WHERE cust_id=10001;
SELECT cust_name,cust_state,(SELECT COUNT(*) FROM orders WHERE orders.cust_id=customers.cust_id) AS orders FROM customers ORDER BY cust_name;
cust_name | cust_state | orders |
Coyote Inc. |
MI | 1 |
Mouse House | NULL | 0 |
The Fudds | IL | 1 |
Wascals | IN | 1 |
Yosemite Place | AZ | 1 |
关系表的设计
把信息分解成多个表,一类数据一个表,各表通过常用的值互相关联。
主键:主键为某个表的一列,用来唯一标识每行
外键:外键为某个表的一列,它包含另一个表的主键值。
联结
SELECT vend_name,vend_id FROM vendors ORDER BY vend_name;
vend_name | vend_id |
ACME | 1003 |
Anvils R Us | 1001 |
Furball Inc | 1004 |
Jet Set | 1005 |
Jouets Et Ours | 1006 |
LT Supplies | 1002 |
SELECT prod_name,prod_price,vend_id FROM products ORDER BY prod_name;
prod_name | prod_price | vend_id |
.5 ton anvil | 5.99 | 1001 |
1 ton anvil | 9.99 | 1001 |
2 ton anvil | 14.99 | 1001 |
Bird seed | 10.00 | 1003 |
Carrots | 2.50 | 1003 |
Detonator | 13.00 | 1003 |
Fuses | 3.42 | 1002 |
JetPack 1000 | 35.00 | 1005 |
JetPack2000 | 55.00 | 1005 |
Oil can | 8.99 | 1002 |
Safe | 50.00 | 1003 |
Sling | 4.49 | 1003 |
TNT (1 stick) | 2.50 | 1003 |
TNT(5 sticks) | 10.00 | 1003 |
SELECT prod_name,prod_price,vend_name FROM vendors,products WHERE vendors.vend_id=products.vend_id ORDER BY prod_name,vend_name;
prod_name | prod_price | vend_name |
.5 ton anvil | 5.99 | Anvils R Us |
1 ton anvil | 9.99 | Anvils R Us |
2 ton anvil | 14.99 | Anvils R Us |
Bird seed | 10.00 | ACME |
Carrots | 2.50 | ACME |
Detonator | 13.00 | ACME |
Fuses | 3.42 | LT Supplies |
JetPack 1000 | 35.00 | Jet Set |
JetPack2000 | 55.00 | Jet Set |
Oil can | 8.99 | LT Supplies |
Safe | 50.00 | ACME |
Sling | 4.49 | ACME |
TNT (1 stick) | 2.50 | ACME |
TNT(5 sticks) | 10.00 | ACME |
SELECT vend_name,prod_name,prod_price,vend_id FROM vendors,products WHERE vendors.vend_id=products.vend_id ORDER BY vend_name,prod_name;
ERROR 1052 (23000): Column 'vend_id' in filed list is ambigous
SELECT vend_name,prod_name,prod_price FROM vendors,products ORDER BY vend_name,prod_name;
SELECT vend_name,prod_name,prod_price FROM vendors,products WHERE vendors.vend_id=products.vend_id ORDER BY vend_name,prod_name;
联结条件:WHERE vendors.vend_id=products.vend_id
有联结条件:vendors表中的每行和products表中的每行匹配,满足匹配条件的才返回;
无联结条件:vendors表中的每行和products表中的每行匹配,返回 vendors的行数*products的行数 (笛卡尔积)