赞
踩
一、按等级查询 mysql> create table grade( -> low int(3), -> upp int(3), -> grade char(1) -> ); Query OK, 0 rows affected (0.87 sec) mysql> insert into grade values(90,100,'A'); Query OK, 1 row affected (0.21 sec) mysql> insert into grade values(80,89,'B'); Query OK, 1 row affected (0.11 sec) mysql> insert into grade values(70,79,'C'); Query OK, 1 row affected (0.09 sec) mysql> insert into grade values(60,69,'D'); Query OK, 1 row affected (0.11 sec) mysql> insert into grade values(0,59,'E'); Query OK, 1 row affected (0.10 sec) mysql> select * from grade; +------+------+-------+ | low | upp | grade | +------+------+-------+ | 90 | 100 | A | | 80 | 89 | B | | 70 | 79 | C | | 60 | 69 | D | | 0 | 59 | E | +------+------+-------+ 5 rows in set (0.00 sec) mysql> select sno,cno,grade from score,grade -> where degree between low and upp; --太智能了吧!! +-----+--------+-------+ | sno | cno | grade | +-----+--------+-------+ | 100 | 3-105 | C | | 100 | 3-245 | C | | 101 | 6-1166 | E | | 102 | 3-245 | A | | 103 | 3-105 | B | | 103 | 3-245 | B | | 103 | 6-1166 | E | | 104 | 3-105 | E | | 104 | 3-245 | A | | 104 | 6-1166 | B | | 105 | 3-245 | B | | 105 | 6-1166 | B | +-----+--------+-------+ 二、连接查询(内连接、左连接、右连接) 内连接 inner join 或者 join 外连接 1、左连接 left join 或者 left outer join 2、右连接 right join 或者 right outer join 3、完全外连接 full join 或者 full outer join 创建两个表: create database testJoin; person表 id,name,cardid create table person( id int, name varchar(20), cardId int ); card表 id,name create table card( id int, name varchar(20) ); insert into card values(1,'fanka'); insert into card values(2,'jianhangka'); insert into card values(3,'nonghangka'); insert into card values(4,'gongshangka'); insert into card values(5,'youzhengka'); insert into person values(1,'zhangsan',1); insert into person values(2,'lisi',3); insert into person values(3,'wangwu',6); mysql> select * from card; +------+-------------+ | id | name | +------+-------------+ | 1 | fanka | | 2 | jianhangka | | 3 | nonghangka | | 4 | gongshangka | | 5 | youzhengka | +------+-------------+ mysql> select * from person; +------+----------+--------+ | id | name | cardId | +------+----------+--------+ | 1 | zhangsan | 1 | | 2 | lisi | 3 | | 3 | wangwu | 6 | +------+----------+--------+ 目前并没有创建外键! ——inner join 查询(查找有关系的数据!) select * from person inner join card on person.cardId=card.id;--注意语法! +------+----------+--------+------+------------+ | id | name | cardId | id | name | +------+----------+--------+------+------------+ | 1 | zhangsan | 1 | 1 | fanka | | 2 | lisi | 3 | 3 | nonghangka | +------+----------+--------+------+------------+ 内联查询,其实就是两张表中的数据,通过某个字段相等,查询出相关记录数据。 或者省略inner: select * from person join card on person.cardId=card.id;--注意语法! +------+----------+--------+------+------------+ | id | name | cardId | id | name | +------+----------+--------+------+------------+ | 1 | zhangsan | 1 | 1 | fanka | | 2 | lisi | 3 | 3 | nonghangka | +------+----------+--------+------+------------+ ——left join 查询(左外连接) select * from person left join card on person.cardId=card.id; +------+----------+--------+------+------------+ | id | name | cardId | id | name | +------+----------+--------+------+------------+ | 1 | zhangsan | 1 | 1 | fanka | | 2 | lisi | 3 | 3 | nonghangka | | 3 | wangwu | 6 | NULL | NULL | +------+----------+--------+------+------------+ 左外连接,会把左边表里面的所有数据取出来,而右边表中的数据,如果有相等的,就显示出来 如果没有,就会补 NULL。 select * from person left outer join card on person.cardId=card.id; +------+----------+--------+------+------------+ | id | name | cardId | id | name | +------+----------+--------+------+------------+ | 1 | zhangsan | 1 | 1 | fanka | | 2 | lisi | 3 | 3 | nonghangka | | 3 | wangwu | 6 | NULL | NULL | +------+----------+--------+------+------------+ ——right join 查询(右外连接) select * from person right join card on person.cardId=card.id; +------+----------+--------+------+-------------+ | id | name | cardId | id | name | +------+----------+--------+------+-------------+ | 1 | zhangsan | 1 | 1 | fanka | | 2 | lisi | 3 | 3 | nonghangka | | NULL | NULL | NULL | 2 | jianhangka | | NULL | NULL | NULL | 4 | gongshangka | | NULL | NULL | NULL | 5 | youzhengka | +------+----------+--------+------+-------------+ 右外连接,会把右边表里面的所有数据取出来,而左边表中的数据,如果有相等的,就显示出来 如果没有,就会补 NULL。 或者多个outer: select * from person right outer join card on person.cardId=card.id; +------+----------+--------+------+-------------+ | id | name | cardId | id | name | +------+----------+--------+------+-------------+ | 1 | zhangsan | 1 | 1 | fanka | | 2 | lisi | 3 | 3 | nonghangka | | NULL | NULL | NULL | 2 | jianhangka | | NULL | NULL | NULL | 4 | gongshangka | | NULL | NULL | NULL | 5 | youzhengka | +------+----------+--------+------+-------------+ —— full join 查询(全外连接)——但是mysql不支持full join!!!! select * from person full join card on person.cardId=card.id; 三、mysql为什么不支持 full join 全外连接? inner join 其实是两表的交集 left join 是左表并交集 right join 是右表并交集 full join 全集:用union将 left join 和 right join 联合起来! 即是: mysql> select * from person right outer join card on person.cardId=card.id -> union -> select * from person left outer join card on person.cardId=card.id; +------+----------+--------+------+-------------+ | id | name | cardId | id | name | +------+----------+--------+------+-------------+ | 1 | zhangsan | 1 | 1 | fanka | | 2 | lisi | 3 | 3 | nonghangka | | NULL | NULL | NULL | 2 | jianhangka | | NULL | NULL | NULL | 4 | gongshangka | | NULL | NULL | NULL | 5 | youzhengka | | 3 | wangwu | 6 | NULL | NULL | +------+----------+--------+------+-------------+ 6 rows in set (0.47 sec) 或者: mysql> select * from person left outer join card on person.cardId=card.id -> union -> select * from person right outer join card on person.cardId=card.id; +------+----------+--------+------+-------------+ | id | name | cardId | id | name | +------+----------+--------+------+-------------+ | 1 | zhangsan | 1 | 1 | fanka | | 2 | lisi | 3 | 3 | nonghangka | | 3 | wangwu | 6 | NULL | NULL | | NULL | NULL | NULL | 2 | jianhangka | | NULL | NULL | NULL | 4 | gongshangka | | NULL | NULL | NULL | 5 | youzhengka | +------+----------+--------+------+-------------+
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。