-- 多表查询:多张表联合起来查询
-- 多表联合
-- 我要查询每个人的订单信息
-- 多张表没有关联条件的查询,查询出的结果是没有意义的
-- 像这种吧多张表简单关联起来查询,查询出来称之为笛卡尔积
-- 就是把多张表的列数相加,行数相乘,这样得出的查询结果
select user.*,order.* from user,order; -- 多张表没有条件查询
-- 我们在进行多张表查询的时候,要有关联条件
-- 如果是N张表关联查询,需要N-1个关联条件
-- 我要查询每个人的订单信息
-- 将主键与外键关联起来
select user.*,order.* from user,order where user.id=order.user_id;
-- 给表起别名 (as 可以省略)
select u.*,o.* from user as u,orders as o where u.id=o.user_id;
-- 上述方法称为内连接
-- 内连接:不符合条件的数据是不展示出来的
-- 隐式内连接
select user.*,`orders`.* from user,orders where user.`id`=`orders`.`user_id`;
-- 显式内连接
select user.*,orders.* from user inner join orders on user.is=orders.user_id;
-- 外连接:左外连接和右外连接 这两个可以互换
-- 查询所有用户的订单,所有用户必须展示出来,这个用户如果没有订单,他的订单信息以null展示出来
-- 左外连接
-- 想让哪张表全部展示出来,就把哪张表写在left左边
select user.*,orders.* from user left outer join orders on user.id=orders.user_id;
select user.*,orders.* from orders left outer join user on user.id=orders.user_id;
-- 右外连接
select user.*,orders.* from orders right outer join user on user.id=orders.user_id;
select user.*,orders.* from user right outer join orders on user.id=orders.user_id;
-- 子查询:一个主查询所要的条件,他来自另一个子查询,用于一步查不出来然后分步骤查,最后再用子查询写出来。
-- 查询用户为张三的订单详情
-- 1.我们先在user表中把张三的id查出来
select user.id from user where usr.username='张三';
-- 2.拿着上一步查出的id去订单表里面查出订单的信息
select orders.* from orders where orders.user_id=3;
-- 使用子查询,把上面两步合二为一 子查询需要用括号引起来
select orders.* from orders where orders.user_id=(select user.id from user where usr.username='张三');
-- 查询出订单价格大于300的所有用户信息
-- 1.在订单表中吧大于300的订单的user_id查出来
select orders.`user_id` from orders where orders.`totalprice`>300
-- 2.拿着上一步的user_id去用户表里查询
select user.* from user where id=3 OR id=5;
-- 合二为一
SELECT user.* FROM USER WHERE id IN(SELECT orders.`user_id` FROM orders WHERE orders.`totalprice`>300)
-- 再次嵌套查看相关客户的订单信息
SELECT lsb.*,orders.* FROM (SELECT user.* FROM USER WHERE id IN(SELECT orders.`user_id` FROM orders WHERE orders.`totalprice`>300)) AS lsb INNER JOIN orders ON lsb.id=orders.`user_id`
SELECT lsb.*,orders.* FROM (SELECT user.* FROM USER WHERE id IN(SELECT orders.`user_id` FROM orders WHERE orders.`totalprice`>300)) AS lsb LEFT OUTER JOIN orders ON lsb.id=orders.`user_id`
-- 不使用子查询,用内连接直接做
SELECT orders.*,user.* FROM USER,orders WHERE orders.`user_id`=user.`id` AND orders.`totalprice`>300;
-- 自查询
-- 查询emp表中 员工姓名所对应的上司姓名
-- 将这张表看做两张完全想用的A B表
-- A表员工的老板号=B表老板的员工号
select a.ename,b.ename from emp as a,emp as b where a.mgr=b.empno;
-- 查询所有用户的所有订单以及订单中的所有信息
-- 显式内连接
SELECT u.*,o.*,product.* FROM USER u INNER JOIN orders o ON u.`id`=o.`user_id` INNER JOIN `orderitem` ON o.`id`=`orderitem`.`oid` INNER JOIN `product` ON `orderitem`.`pid`=product.`id`
SELECT u.*,o.*,product.* FROM USER u LEFT JOIN orders o ON u.`id`=o.`user_id` LEFT JOIN `orderitem` ON o.`id`=`orderitem`.`oid` LEFT JOIN `product` ON `orderitem`.`pid`=product.`id`
-- 把一张旧表中的数据,复制到一张新表中
create table myemp as select * from emp;
-- 只想要旧表中的表头,不要表中的数据 需要写一个条件使条件为假就行
create table myemp2 as select * from emp where 1=2;
-- 只想复制其中个别字段
CREATE TABLE myemp4 AS SELECT emp.`empno`,emp.`ename`,emp.`sal` FROM emp;