您的位置:首页 > 数据库 > MySQL

【MySql】使用记录<三>

2015-08-10 20:35 645 查看
左右连接问题:

[code]根据给出的表结构按要求写出SQL语句。
**Match 赛程表**
字段名称    字段类型    描述
matchID int 主键
hostTeamID  int 主队的ID
guestTeamID int 客队的ID
matchResult varchar(20) 比赛结果,如(2:0)
matchTime   date    比赛开始时间

**Team 参赛队伍表**
字段名称    字段类型    描述
teamID  int 主键
teamName    varchar(20) 队伍名称

Match的hostTeamID与guestTeamID都与Team中的teamID关联
查出 2006-6-1 到2006-7-1之间举行的所有比赛,并且用以下形式列出:
拜仁  2:0 不来梅 2006-6-21

mysql> select * from m;
+-----+------+------+------+------------+
| mid | hid  | gid  | mres | matime     |
+-----+------+------+------+------------+
|   1 |    1 |    2 | 2:0  | 2006-05-21 |
|   2 |    2 |    3 | 1:2  | 2006-06-21 |
|   3 |    3 |    1 | 2:5  | 2006-06-25 |
|   4 |    2 |    1 | 3:2  | 2006-07-21 |
+-----+------+------+------+------------+
4 rows in set (0.00 sec)

mysql> select * from t;
+------+----------+
| tid  | tname    |
+------+----------+
|    1 | 国安     |
|    2 | 申花     |
|    3 | 公益联队 |
+------+----------+
3 rows in set (0.00 sec)


select m.*,t1.tname as htname,t2.tname as gname from m inner join t as t1 on m.hid=t1.tid inner join t as t2 on m.gid=t2.tid;

[code]+------+------+------+------+------------+----------+----------+
| mid  | hid  | gid  | mres | matime     | htname   | gname    |
+------+------+------+------+------------+----------+----------+
|    1 |    1 |    2 | 2:0  | 2006-05-21 | 国安     | 申花     |
|    2 |    2 |    3 | 1:2  | 2006-06-21 | 申花     | 布尔联队 |
|    3 |    3 |    1 | 2:5  | 2006-06-25 | 布尔联队 | 国安     |
|    4 |    2 |    1 | 3:2  | 2006-07-21 | 申花     | 国安     |
+------+------+------+------+------------+----------+----------+


mysql> select mid,t1.tname as htname,mres,t2.tname as gname,matime from m inner join t as t1 on m.hid=t1.tid inner join t as t2 on m.gid=t2.tid; //将组合到的大表再作为左表

[code]+------+----------+------+----------+------------+
| mid  | htname   | mres | gname    | matime     |
+------+----------+------+----------+------------+
|    1 | 国安     | 2:0  | 申花     | 2006-05-21 |
|    2 | 申花     | 1:2  | 布尔联队 | 2006-06-21 |
|    3 | 布尔联队 | 2:5  | 国安     | 2006-06-25 |
|    4 | 申花     | 3:2  | 国安     | 2006-07-21 |
+------+----------+------+----------+------------+


mysql> select mid,t1.tname as htname,mres,t2.tname as gname,matime from m inner join t as t1 on m.hid=t1.tid inner join t as t2 on m.gid=t2.tid where matime between ‘2006-06-01’ and ‘2006-07-01’;

[code]+------+----------+------+----------+------------+
| mid  | htname   | mres | gname    | matime     |
+------+----------+------+----------+------------+
|    2 | 申花     | 1:2  | 布尔联队 | 2006-06-21 |
|    3 | 布尔联队 | 2:5  | 国安     | 2006-06-25 |
+------+----------+------+----------+------------+


这里面最主要的就是练习连接中的别名! 多次使用

关键字 union

示意:把两条和多条sql语句的查询集,合成一个集合

sql_1 union sql_2 可以是同一张表,也可以是不同的表格

[code]mysql> create table tmp(id int unsigned auto_increment primary key,name varchar(32) not null);
mysql> insert into tmp values(1,'jimiy'),
    -> (2,'Tom'),
    -> (3,'Kitty');
Query OK, 3 rows affected (0.07 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> select * from tmp;
+----+-------+
| id | name  |
+----+-------+
|  1 | jimiy |
|  2 | Tom   |
|  3 | Kitty |
+----+-------+
3 rows in set (0.00 sec)

注意:【如何添加列】
mysql> alter table tmp add column age int;
Query OK, 0 rows affected (0.78 sec)
mysql> select * from tmp;
+----+-------+------+
| id | name  | age  |
+----+-------+------+
|  1 | jimiy | NULL |
|  2 | Tom   | NULL |
|  3 | Kitty | NULL |
+----+-------+------+
3 rows in set (0.00 sec)

注意:【如何修改列】
mysql> alter table tmp change  id hid int;
Query OK, 3 rows affected (1.04 sec)
Records: 3  Duplicates: 0  Warnings: 0

【union】合并
mysql> select * from user
    -> union
    -> select * from tmp;
+-----+-------+------+
| uid | name  | age  |
+-----+-------+------+
|   1 | Jimiy |   20 |
|   2 | Tom   |   21 |
|   3 | Hello |   23 |
|   4 | Jack  |   24 |
|   5 | Kitty |   22 |
|   6 | jacki |   23 |
|   1 | jimiy |   22 |
|   2 | Tom   |   20 |
|   3 | Kitty |   23 |
+-----+-------+------+
9 rows in set (0.03 sec)
<union>语句必须满足:各语句取出的列数必须相同!【列名称不要求一致,会使用第一条,列对应完全相等的将会被合并,且合并是很耗时的操作,一般不建议让union合并,使用union all可以避免合并,速度有一个好的提升,union的语句中不用写order by,sql得到的总的结果集是可以order by的。】
可以这样:
mysql> (select * from a)
    -> union all
    -> (select * from b)
    -> order by num desc;
+------+------+
| id   | num  |
+------+------+
| e    |   99 |
| d    |   20 |
| c    |   15 |
| c    |   15 |
| b    |   10 |
| d    |   10 |
| a    |    5 |
| b    |    5 |
+------+------+
8 rows in set (0.00 sec)

把id相同的加起来:【可以把合并的看成一张大表 然后group by 再sum】
mysql> select id,sum(num) from (select * from a union all select * from b) as tmp group by id;
+------+----------+
| id   | sum(num) |
+------+----------+
| a    |        5 |
| b    |       15 |
| c    |       30 |
| d    |       30 |
| e    |       99 |
+------+----------+
5 rows in set (0.03 sec)


附:

ALTER TABLE:添加,修改,删除表的列,约束等表的定义。

查看列:desc 表名;

修改表名:alter table t_book rename to bbb;

添加列:alter table 表名 add column 列名 varchar(30);

删除列:alter table 表名 drop column 列名;

修改列名MySQL: alter table bbb change nnnnn hh int;

修改列名SQLServer:exec sp_rename’t_student.name’,’nn’,’column’;

修改列名Oracle:lter table bbb rename column nnnnn to hh int;

修改列属性:alter table t_book modify name varchar(22);

MySQL 查看约束,添加约束,删除约束 添加列,修改列,删除列

查看表的字段信息:desc 表名;

查看表的所有信息:show create table 表名;

添加主键约束:alter table 表名 add constraint 主键 (形如:PK_表名) primary key 表名(主键字段);

添加外键约束:alter table 从表 add constraint 外键(形如:FK_从表_主表) foreign key 从表(外键字段) references 主表(主键字段);

删除主键约束:alter table 表名 drop primary key;

删除外键约束:alter table 表名 drop foreign key 外键(区分大小写);

修改表名:alter table t_book rename to bbb;

添加列:alter table 表名 add column 列名 varchar(30);

删除列:alter table 表名 drop column 列名;

修改列名MySQL: alter table bbb change nnnnn hh int;

修改列名SQLServer:exec sp_rename’t_student.name’,’nn’,’column’;

修改列名Oracle:alter table bbb rename column nnnnn to hh int;

修改列属性:alter table t_book modify name varchar(22);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: