子查询: 使用SELECT语句查询出来的结果集, 实际上也可以看做一个表. 既然是一个表, 我们就可以用他作为其他查询语句的表
子查询语句也是一个SELECT语句, 使用小括号()括起来
注意:
在SELECT查询语句中使用子查询, 相当于把结果集看做一个表
如果作为WHERE子句的条件, 则子查询可以不起别名
如: SELECT * FROM user_table1 WHERE age < (SELECT AVG(age) FROM user_table1);
如果作为FROM后被查询的表, 子查询必须起别名
如: SELECT * FROM (SELECT username FROM user_table1) AS user WHERE username = 'zhangsan';
注意:
如果不起别名会报错: Every derived table must have its own alias
虽然起了别名, 但结果集实际还是结果集, 并不会变成真的表
使用UPDATE, DELETE语句时, 被更新的表不能用在set或where的子查询
否则会报错: You can't specify target table 'xxx' for update in FROM clause
解决办法: 在操作被更新的表的子查询外再套一层SELECT * FROM(是否取别名取决于是用在FROM还是WHERE子句), 然后外层再执行UPDATE或DELETE
如: DELETE FROM stutb WHERE score < (SELECT * FROM (SELECT AVG(score) FROM stutb WHERE department LIKE 'javaEE基础班') AS avgscore);
# 一个SELECT查询
SELECT username FROM user_table1;
# 如果把以上看做一个表, 假设这个表名为user, 则我们会这样写
SELECT * FROM user WHERE username = 'zhangsan';
# 可以得到
|username|
|--------|
|zhangsan|
# 所以, 我们把user替换为刚才的SELECT语句, 并用小括号将SELECT语句括起来
# 替换结果类似于下面这样
# SELECT * FROM user WHERE username = 'zhangsan';
# SELECT * FROM (SELECT username FROM user_table1) AS user WHERE username = 'zhangsan';
# 执行一下
SELECT * FROM (SELECT username FROM user_table1) WHERE username = 'zhangsan';
# 也可以得到
|username|
|--------|
|zhangsan|
# 这就是子查询, 括号内的查询相当于父查询语句的一个孩子, 使用子查询的结果作为表继续查询
SELECT sname FROM sort;
sheet = SELECT sname FROM sort;
SELECT * FROM (SELECT sname FROM sort) AS z WHERE sname = '家电';
-- 多表查询
-- 1-->内连接查询 查询多表直接的交集
-- 显示内查询
SELECT * FROM dinner d INNER JOIN food f INNER JOIN dinner2food df ON d.did=df.did AND f.fid=df.fid;
-- 隐式内查询(推荐用这个)
SELECT * FROM dinner d, food f, dinner2food df WHERE d.did=df.did AND f.fid=df.fid;
-- 2-->外连接查询
-- 右外查询
SELECT * FROM (dinner d, food f) RIGHT JOIN dinner2food df ON d.did=df.did AND f.fid= df.fid;
-- 左外查询
SELECT * FROM dinner2food df LEFT JOIN (dinner d, food f) ON d.did=df.did AND f.fid=df.fid;
外键的添加方式
方式一 外部添加:
注意, 外键的字段必须存在
alter table 表名 add foreign key (外键的字段名)references (主表)指向的表名(主表的主键字段名);
方式二 建表时添加
CREATE TABLE cards(
cid INT PRIMARY KEY AUTO_INCREMENT,
number VARCHAR(20),
cname VARCHAR(20),
uid INT,
FOREIGN KEY (uid) REFERENCES users(uid)