当前位置: 首页 > news >正文

MySQL作业二

目录

1、为表添加约束

2、课堂代码练习

2.1(select语句练习)

2.2外键和多表关联

2.3多表关联查询

3、练习题目

3.1单表查询

3.2多表查询

添加外键约束


1、为表添加约束

mysql> alter table t_hero add primary key(id);
#设置t_hero的主键为id

mysql> alter table t_hero modify id int not null;
#设置t_hero id属性非空

mysql> alter table t_hero modify name varchar(255) not null;
mysql> alter table t_hero add unique (name);
#设置name属性为非空非重复

mysql> alter table t_hero add constraint chk_gender check(gender in ('男', '女'));
#设置检查约束

mysql> desc t_hero;
+---------+--------------+------+-----+---------+-------+
| Field   | Type         | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+-------+
| id      | int          | NO   | PRI | NULL    |       |
| name    | varchar(255) | NO   | UNI | NULL    |       |
| age     | int          | YES  |     | NULL    |       |
| gender  | char(2)      | YES  |     | NULL    |       |
| address | varchar(255) | YES  |     | NULL    |       |
| work    | varchar(50)  | YES  |     | NULL    |       |
+---------+--------------+------+-----+---------+-------+
6 rows in set (0.00 sec)

2、课堂代码练习

2.1(select语句练习)

mysql> select * from t_hero;
+----+--------+------+--------+--------------+--------------------+
| id | name   | age  | gender | address      | work               |
+----+--------+------+--------+--------------+--------------------+
|  1 | 贾宝玉 |   20 | 男     | 贾府怡红院   | 贾府公子           |
|  2 | 林黛玉 |   17 | 女     | 贾府潇湘馆   | 千金小姐           |
|  3 | 薛宝钗 |   21 | 女     | 贾府蘅芜苑   | 贾宝玉的妻子       |
|  4 | 王熙凤 |   25 | 女     | 贾府贾琏院   | 贾府管家           |
|  5 | 孙悟空 | 1000 | 男     | 花果山       | 齐天大圣           |
|  6 | 唐僧   |   20 | 男     | 东土大唐     | 旃檀功德佛         |
|  7 | 猪八戒 | 1000 | 男     | 福陵山云栈洞 | 天蓬元帅           |
|  8 | 沙僧   | 1000 | 男     | 流沙河       | 卷帘大将           |
|  9 | 宋江   |   30 | 男     | 郓城宋家村   | 梁山寨主           |
| 10 | 林冲   |   30 | 男     | 东京         | 梁山马军五虎将之一 |
| 11 | 武松   |   25 | 男     | 清河县       | 梁山步军头领       |
| 12 | 鲁智深 |   30 | 男     | 五台山       | 梁山步军头领       |
| 13 | 刘备   |   63 | 男     | 涿郡涿县     | 蜀汉开国皇帝       |
| 14 | 诸葛亮 |   54 | 男     | 琅琊阳都     | 蜀汉丞相           |
| 15 | 曹操   |   66 | 男     | 沛国谯县     | 东汉丞相           |
| 16 | 关羽   |   60 | 男     | 河东郡解县   | 蜀汉前将军         |
+----+--------+------+--------+--------------+--------------------+
16 rows in set (0.00 sec)

mysql> select count(*) from t_hero;
+----------+
| count(*) |
+----------+
|       16 |
+----------+
1 row in set (0.00 sec)

mysql> select count(*) 总数 from t_hero;
+------+
| 总数 |
+------+
|   16 |
+------+
1 row in set (0.00 sec)

mysql> select * from t_hero where name like "猪%";
+----+--------+------+--------+--------------+----------+
| id | name   | age  | gender | address      | work     |
+----+--------+------+--------+--------------+----------+
|  7 | 猪八戒 | 1000 | 男     | 福陵山云栈洞 | 天蓬元帅 |
+----+--------+------+--------+--------------+----------+
1 row in set (0.00 sec)

mysql> select * from t_hero where age < 20;
+----+--------+------+--------+------------+----------+
| id | name   | age  | gender | address    | work     |
+----+--------+------+--------+------------+----------+
|  2 | 林黛玉 |   17 | 女     | 贾府潇湘馆 | 千金小姐 |
+----+--------+------+--------+------------+----------+
1 row in set (0.00 sec)

mysql> select * from t_hero where age <= 20;
+----+--------+------+--------+------------+------------+
| id | name   | age  | gender | address    | work       |
+----+--------+------+--------+------------+------------+
|  1 | 贾宝玉 |   20 | 男     | 贾府怡红院 | 贾府公子   |
|  2 | 林黛玉 |   17 | 女     | 贾府潇湘馆 | 千金小姐   |
|  6 | 唐僧   |   20 | 男     | 东土大唐   | 旃檀功德佛 |
+----+--------+------+--------+------------+------------+
3 rows in set (0.00 sec)

mysql> select id,name,address from t_hero where id in (2,4,8);
+----+--------+------------+
| id | name   | address    |
+----+--------+------------+
|  2 | 林黛玉 | 贾府潇湘馆 |
|  4 | 王熙凤 | 贾府贾琏院 |
|  8 | 沙僧   | 流沙河     |
+----+--------+------------+
3 rows in set (0.00 sec)

mysql> select id,name,address from t_hero where name like "林%" and age <20;
+----+--------+------------+
| id | name   | address    |
+----+--------+------------+
|  2 | 林黛玉 | 贾府潇湘馆 |
+----+--------+------------+
1 row in set (0.00 sec)

mysql> select gender from t_hero group by gender;
+--------+
| gender |
+--------+
| 男     |
| 女     |
+--------+
2 rows in set (0.00 sec)

mysql> select gender,count(gender) 数目 from t_hero group by gender;
+--------+------+
| gender | 数目 |
+--------+------+
| 男     |   13 |
| 女     |    3 |
+--------+------+
2 rows in set (0.00 sec)

mysql> select gender,count(gender) 数目 from t_hero group by gender having count(gender) > 3;
+--------+------+
| gender | 数目 |
+--------+------+
| 男     |   13 |
+--------+------+
1 row in set (0.00 sec)

mysql> select * from t_hero where age <= 20 order by age;
+----+--------+------+--------+------------+------------+
| id | name   | age  | gender | address    | work       |
+----+--------+------+--------+------------+------------+
|  2 | 林黛玉 |   17 | 女     | 贾府潇湘馆 | 千金小姐   |
|  1 | 贾宝玉 |   20 | 男     | 贾府怡红院 | 贾府公子   |
|  6 | 唐僧   |   20 | 男     | 东土大唐   | 旃檀功德佛 |
+----+--------+------+--------+------------+------------+
3 rows in set (0.00 sec)

mysql> select * from t_hero where age <= 20 order by age desc;
+----+--------+------+--------+------------+------------+
| id | name   | age  | gender | address    | work       |
+----+--------+------+--------+------------+------------+
|  1 | 贾宝玉 |   20 | 男     | 贾府怡红院 | 贾府公子   |
|  6 | 唐僧   |   20 | 男     | 东土大唐   | 旃檀功德佛 |
|  2 | 林黛玉 |   17 | 女     | 贾府潇湘馆 | 千金小姐   |
+----+--------+------+--------+------------+------------+
3 rows in set (0.00 sec)

2.2外键和多表关联

mysql> create table grade(
    -> id int auto_increment,
    -> class_name varchar(50) unique,
    -> primary key(id)
    -> );

mysql> insert into grade(class_name) value("红楼梦班"),("水浒传班"),("三国演义班"),("西游记班");

mysql> select * from grade;
+----+------------+
| id | class_name |
+----+------------+
|  3 | 三国演义班 |
|  2 | 水浒传班   |
|  1 | 红楼梦班   |
|  4 | 西游记班   |
+----+------------+

mysql> alter table t_hero add class int;

mysql> desc t_hero;
+---------+--------------+------+-----+---------+-------+
| Field   | Type         | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+-------+
| id      | int          | NO   | PRI | NULL    |       |
| name    | varchar(255) | NO   | UNI | NULL    |       |
| age     | int          | YES  |     | NULL    |       |
| gender  | char(2)      | YES  |     | NULL    |       |
| address | varchar(255) | YES  |     | NULL    |       |
| work    | varchar(50)  | YES  |     | NULL    |       |
| class   | int          | YES  | MUL | NULL    |       |
+---------+--------------+------+-----+---------+-------+

mysql> desc grade;
+------------+-------------+------+-----+---------+----------------+
| Field      | Type        | Null | Key | Default | Extra          |
+------------+-------------+------+-----+---------+----------------+
| id         | int         | NO   | PRI | NULL    | auto_increment |
| class_name | varchar(50) | YES  | UNI | NULL    |                |
+------------+-------------+------+-----+---------+----------------+

mysql> ALTER TABLE t_hero
    -> ADD CONSTRAINT fk_t_hero_grade
    -> FOREIGN KEY (class) REFERENCES grade(id);

mysql> desc t_hero;
+---------+--------------+------+-----+---------+-------+
| Field   | Type         | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+-------+
| id      | int          | NO   | PRI | NULL    |       |
| name    | varchar(255) | NO   | UNI | NULL    |       |
| age     | int          | YES  |     | NULL    |       |
| gender  | char(2)      | YES  |     | NULL    |       |
| address | varchar(255) | YES  |     | NULL    |       |
| work    | varchar(50)  | YES  |     | NULL    |       |
| class   | int          | YES  | MUL | NULL    |       |
+---------+--------------+------+-----+---------+-------+

mysql> desc grade;
+------------+-------------+------+-----+---------+----------------+
| Field      | Type        | Null | Key | Default | Extra          |
+------------+-------------+------+-----+---------+----------------+
| id         | int         | NO   | PRI | NULL    | auto_increment |
| class_name | varchar(50) | YES  | UNI | NULL    |                |
+------------+-------------+------+-----+---------+----------------+
2 rows in set (0.00 sec)

mysql> UPDATE t_hero
    -> SET class = 1
    -> WHERE name IN ('贾宝玉', '林黛玉', '薛宝钗', '王熙凤');
Query OK, 4 rows affected (0.00 sec)
Rows matched: 4  Changed: 4  Warnings: 0

mysql> UPDATE t_hero
    -> SET class = 2
    -> WHERE name IN ('宋江', '林冲', '武松', '鲁智深');
Query OK, 4 rows affected (0.01 sec)
Rows matched: 4  Changed: 4  Warnings: 0

mysql> UPDATE t_hero
    -> SET class = 3
    -> WHERE name IN ('刘备', '诸葛亮', '曹操', '关羽');
Query OK, 4 rows affected (0.00 sec)
Rows matched: 4  Changed: 4  Warnings: 0

mysql> UPDATE t_hero
    -> SET class = 4
    -> WHERE name IN ('孙悟空', '唐僧', '猪八戒', '沙僧');
Query OK, 4 rows affected (0.00 sec)
Rows matched: 4  Changed: 4  Warnings: 0

mysql> select * from t_hero;
+----+--------+------+--------+--------------+--------------------+-------+
| id | name   | age  | gender | address      | work               | class |
+----+--------+------+--------+--------------+--------------------+-------+
|  1 | 贾宝玉 |   20 | 男     | 贾府怡红院   | 贾府公子           |     1 |
|  2 | 林黛玉 |   17 | 女     | 贾府潇湘馆   | 千金小姐           |     1 |
|  3 | 薛宝钗 |   21 | 女     | 贾府蘅芜苑   | 贾宝玉的妻子       |     1 |
|  4 | 王熙凤 |   25 | 女     | 贾府贾琏院   | 贾府管家           |     1 |
|  5 | 孙悟空 | 1000 | 男     | 花果山       | 齐天大圣           |     4 |
|  6 | 唐僧   |   20 | 男     | 东土大唐     | 旃檀功德佛         |     4 |
|  7 | 猪八戒 | 1000 | 男     | 福陵山云栈洞 | 天蓬元帅           |     4 |
|  8 | 沙僧   | 1000 | 男     | 流沙河       | 卷帘大将           |     4 |
|  9 | 宋江   |   30 | 男     | 郓城宋家村   | 梁山寨主           |     2 |
| 10 | 林冲   |   30 | 男     | 东京         | 梁山马军五虎将之一 |     2 |
| 11 | 武松   |   25 | 男     | 清河县       | 梁山步军头领       |     2 |
| 12 | 鲁智深 |   30 | 男     | 五台山       | 梁山步军头领       |     2 |
| 13 | 刘备   |   63 | 男     | 涿郡涿县     | 蜀汉开国皇帝       |     3 |
| 14 | 诸葛亮 |   54 | 男     | 琅琊阳都     | 蜀汉丞相           |     3 |
| 15 | 曹操   |   66 | 男     | 沛国谯县     | 东汉丞相           |     3 |
| 16 | 关羽   |   60 | 男     | 河东郡解县   | 蜀汉前将军         |     3 |
+----+--------+------+--------+--------------+--------------------+-------+
16 rows in set (0.00 sec)

2.3多表关联查询

mysql> select * from t_hero;
+----+--------+------+--------+--------------+--------------------+-------+
| id | name   | age  | gender | address      | work               | class |
+----+--------+------+--------+--------------+--------------------+-------+
|  1 | 贾宝玉 |   20 | 男     | 贾府怡红院   | 贾府公子           |     1 |
|  2 | 林黛玉 |   17 | 女     | 贾府潇湘馆   | 千金小姐           |     1 |
|  3 | 薛宝钗 |   21 | 女     | 贾府蘅芜苑   | 贾宝玉的妻子       |     1 |
|  4 | 王熙凤 |   25 | 女     | 贾府贾琏院   | 贾府管家           |     1 |
|  5 | 孙悟空 | 1000 | 男     | 花果山       | 齐天大圣           |     4 |
|  6 | 唐僧   |   20 | 男     | 东土大唐     | 旃檀功德佛         |     4 |
|  7 | 猪八戒 | 1000 | 男     | 福陵山云栈洞 | 天蓬元帅           |     4 |
|  8 | 沙僧   | 1000 | 男     | 流沙河       | 卷帘大将           |     4 |
|  9 | 宋江   |   30 | 男     | 郓城宋家村   | 梁山寨主           |     2 |
| 10 | 林冲   |   30 | 男     | 东京         | 梁山马军五虎将之一 |     2 |
| 11 | 武松   |   25 | 男     | 清河县       | 梁山步军头领       |     2 |
| 12 | 鲁智深 |   30 | 男     | 五台山       | 梁山步军头领       |     2 |
| 13 | 刘备   |   63 | 男     | 涿郡涿县     | 蜀汉开国皇帝       |     3 |
| 14 | 诸葛亮 |   54 | 男     | 琅琊阳都     | 蜀汉丞相           |     3 |
| 15 | 曹操   |   66 | 男     | 沛国谯县     | 东汉丞相           |     3 |
| 16 | 关羽   |   60 | 男     | 河东郡解县   | 蜀汉前将军         |     3 |
+----+--------+------+--------+--------------+--------------------+-------+

mysql> select * from t_hero,grade where t_hero.class = grade.id;
+----+--------+------+--------+--------------+--------------------+-------+----+------------+
| id | name   | age  | gender | address      | work               | class | id | class_name |
+----+--------+------+--------+--------------+--------------------+-------+----+------------+
|  1 | 贾宝玉 |   20 | 男     | 贾府怡红院   | 贾府公子           |     1 |  1 | 红楼梦班   |
|  2 | 林黛玉 |   17 | 女     | 贾府潇湘馆   | 千金小姐           |     1 |  1 | 红楼梦班   |
|  3 | 薛宝钗 |   21 | 女     | 贾府蘅芜苑   | 贾宝玉的妻子       |     1 |  1 | 红楼梦班   |
|  4 | 王熙凤 |   25 | 女     | 贾府贾琏院   | 贾府管家           |     1 |  1 | 红楼梦班   |
|  5 | 孙悟空 | 1000 | 男     | 花果山       | 齐天大圣           |     4 |  4 | 西游记班   |
|  6 | 唐僧   |   20 | 男     | 东土大唐     | 旃檀功德佛         |     4 |  4 | 西游记班   |
|  7 | 猪八戒 | 1000 | 男     | 福陵山云栈洞 | 天蓬元帅           |     4 |  4 | 西游记班   |
|  8 | 沙僧   | 1000 | 男     | 流沙河       | 卷帘大将           |     4 |  4 | 西游记班   |
|  9 | 宋江   |   30 | 男     | 郓城宋家村   | 梁山寨主           |     2 |  2 | 水浒传班   |
| 10 | 林冲   |   30 | 男     | 东京         | 梁山马军五虎将之一 |     2 |  2 | 水浒传班   |
| 11 | 武松   |   25 | 男     | 清河县       | 梁山步军头领       |     2 |  2 | 水浒传班   |
| 12 | 鲁智深 |   30 | 男     | 五台山       | 梁山步军头领       |     2 |  2 | 水浒传班   |
| 13 | 刘备   |   63 | 男     | 涿郡涿县     | 蜀汉开国皇帝       |     3 |  3 | 三国演义班 |
| 14 | 诸葛亮 |   54 | 男     | 琅琊阳都     | 蜀汉丞相           |     3 |  3 | 三国演义班 |
| 15 | 曹操   |   66 | 男     | 沛国谯县     | 东汉丞相           |     3 |  3 | 三国演义班 |
| 16 | 关羽   |   60 | 男     | 河东郡解县   | 蜀汉前将军         |     3 |  3 | 三国演义班 |
+----+--------+------+--------+--------------+--------------------+-------+----+------------+
16 rows in set (0.00 sec)

mysql> select * from t_hero,grade where t_hero.class = grade.id and t_hero.name = "林黛玉";
+----+--------+------+--------+------------+----------+-------+----+------------+
| id | name   | age  | gender | address    | work     | class | id | class_name |
+----+--------+------+--------+------------+----------+-------+----+------------+
|  2 | 林黛玉 |   17 | 女     | 贾府潇湘馆 | 千金小姐 |     1 |  1 | 红 楼梦班   |
+----+--------+------+--------+------------+----------+-------+----+------------+
mysql> select * from t_hero join grade on (t_hero.class = grade.id) and
t_hero.name = "林黛玉";
+----+--------+------+--------+------------+----------+-------+----+------------+
| id | name   | age  | gender | address    | work     | class | id | class_name |
+----+--------+------+--------+------------+----------+-------+----+------------+
|  2 | 林黛玉 |   17 | 女     | 贾府潇湘馆 | 千金小姐 |     1 |  1 | 红 楼梦班   |
+----+--------+------+--------+------------+----------+-------+----+------------+
1 row in set (0.00 sec)

3、练习题目

3.1单表查询

CREATE TABLE `worker` (
 `部门号` int(11) NOT NULL,
 `职工号` int(11) NOT NULL,
 `工作时间` date NOT NULL,
 `工资` float(8,2) NOT NULL,
 `政治面貌` varchar(10) NOT NULL DEFAULT '群众',
 `姓名` varchar(20) NOT NULL,
 `出生日期` date NOT NULL,
 PRIMARY KEY (`职工号`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;

mysql> desc worker;
+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| 部门号   | int         | NO   |     | NULL    |       |
| 职工号   | int         | NO   | PRI | NULL    |       |
| 工作时间 | date        | NO   |     | NULL    |       |
| 工资     | float(8,2)  | NO   |     | NULL    |       |
| 政治面貌 | varchar(10) | NO   |     | 群众    |       |
| 姓名     | varchar(20) | NO   |     | NULL    |       |
| 出生日期 | date        | NO   |     | NULL    |       |
+----------+-------------+------+-----+---------+-------+
7 rows in set (0.00 sec)

mysql> select * from worker;
+--------+--------+------------+---------+----------+------+------------+
| 部门号 | 职工号 | 工作时间   | 工资    | 政治面貌 | 姓名 | 出生日期   |
+--------+--------+------------+---------+----------+------+------------+
|    101 |   1001 | 2015-05-04 | 3500.00 | 群众     | 张三 | 1990-07-01 |
|    101 |   1002 | 2017-02-06 | 3200.00 | 团员     | 李四 | 1997-02-08 |
|    102 |   1003 | 2011-01-04 | 8500.00 | 党员     | 王亮 | 1983-06-08 |
|    102 |   1004 | 2016-10-10 | 5500.00 | 群众     | 赵六 | 1994-09-05 |
|    102 |   1005 | 2014-04-01 | 4800.00 | 党员     | 钱七 | 1992-12-30 |
|    102 |   1006 | 2017-05-05 | 4500.00 | 党员     | 孙八 | 1996-09-02 |
+--------+--------+------------+---------+----------+------+------------+
6 rows in set (0.00 sec)
1、显示所有职工的基本信息。
mysql> select * from worker;
+--------+--------+------------+---------+----------+------+------------+
| 部门号 | 职工号 | 工作时间   | 工资    | 政治面貌 | 姓名 | 出生日期   |
+--------+--------+------------+---------+----------+------+------------+
|    101 |   1001 | 2015-05-04 | 3500.00 | 群众     | 张三 | 1990-07-01 |
|    101 |   1002 | 2017-02-06 | 3200.00 | 团员     | 李四 | 1997-02-08 |
|    102 |   1003 | 2011-01-04 | 8500.00 | 党员     | 王亮 | 1983-06-08 |
|    102 |   1004 | 2016-10-10 | 5500.00 | 群众     | 赵六 | 1994-09-05 |
|    102 |   1005 | 2014-04-01 | 4800.00 | 党员     | 钱七 | 1992-12-30 |
|    102 |   1006 | 2017-05-05 | 4500.00 | 党员     | 孙八 | 1996-09-02 |
+--------+--------+------------+---------+----------+------+------------+
6 rows in set (0.00 sec)

2、查询所有职工所属部门的部门号,不显示重复的部门号。  
mysql> select distinct `部门号` from worker;
+--------+
| 部门号 |
+--------+
|    101 |
|    102 |
+--------+
2 rows in set (0.00 sec)

3、求出所有职工的人数。 
mysql> select count(`职工号`)  总人数 from worker;
+--------+
| 总人数 |
+--------+
|      6 |
+--------+
1 row in set (0.00 sec)

4、列出最高工和最低工资。 
mysql> SELECT MAX(`工资`) AS 最高工资 FROM `worker`;
+----------+
| 最高工资 |
+----------+
|  8500.00 |
+----------+
1 row in set (0.00 sec)

mysql> SELECT MIN(`工资`) AS 最低工资 FROM `worker`;
+----------+
| 最低工资 |
+----------+
|  3200.00 |
+----------+
1 row in set (0.00 sec)

5、列出职工的平均工资和总工资。
mysql> SELECT AVG(`工资`) AS 平均工资 FROM `worker`;
+-------------+
| 平均工资    |
+-------------+
| 5000.000000 |
+-------------+
1 row in set (0.00 sec)

mysql> SELECT SUM(`工资`) AS 总工资 FROM `worker`;
+----------+
| 总工资   |
+----------+
| 30000.00 |
+----------+

6、创建一个只有职工号、姓名和参加工作的新表,名为工作日期表。 
mysql> CREATE TABLE `工作日期表` (
    ->`职工号` int(11) NOT NULL,
    ->`姓名` varchar(20) NOT NULL,
    ->`工作时间` date NOT NULL,
    -> PRIMARY KEY (`职工号`)
    -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;
Query OK, 0 rows affected, 2 warnings (0.02 sec)

7、显示所有职工的年龄。 
mysql> SELECT `姓名`,TIMESTAMPDIFF(YEAR, `出生日期`, CURDATE()) AS 年龄 FROM `worker`;
+------+------+
| 姓名 | 年龄 |
+------+------+
| 张三 |   34 |
| 李四 |   28 |
| 王亮 |   41 |
| 赵六 |   30 |
| 钱七 |   32 |
| 孙八 |   28 |
+------+------+
6 rows in set (0.00 sec)

8、列出所有姓王的职工的职工号、姓名和出生日期。
mysql> select `职工号`,`姓名`,`出生日期` from worker where `姓名` like "王%";
+--------+------+------------+
| 职工号 | 姓名 | 出生日期   |
+--------+------+------------+
|   1003 | 王亮 | 1983-06-08 |
+--------+------+------------+
1 row in set (0.00 sec)

9、列出1992年以前出生的职工的姓名、参加工作日期。
mysql> select `姓名`,`工作时间` from worker where `出生日期` < '1992-01-
01';
+------+------------+
| 姓名 | 工作时间   |
+------+------------+
| 张三 | 2015-05-04 |
| 王亮 | 2011-01-04 |
+------+------------+
2 rows in set (0.00 sec)

10、列出工资在3000-4000之间的所有职工姓名。 
mysql> select `姓名` from worker where `工资` between 3000 and 4000;
+------+
| 姓名 |
+------+
| 张三 |
| 李四 |
+------+
2 rows in set (0.00 sec)

11、列出所有张姓和李姓的职工姓名。
mysql> select `姓名` from worker where `姓名` like "张%" or `姓名` like "李%";
+------+
| 姓名 |
+------+
| 张三 |
| 李四 |
+------+
2 rows in set (0.00 sec)

12、列出所有部门号为2和3的职工号、姓名、党员否。
mysql> SELECT
    ->     `职工号`,
    ->     `姓名`,
    ->     CASE
    ->         WHEN `政治面貌` = '党员' THEN '是'
    ->         ELSE '否'
    ->     END AS 党员否
    -> FROM
    ->     `worker`
    -> WHERE
    ->     `部门号` IN (101,102);
+--------+------+--------+
| 职工号 | 姓名 | 党员否 |
+--------+------+--------+
|   1001 | 张三 | 否     |
|   1002 | 李四 | 否     |
|   1003 | 王亮 | 是     |
|   1004 | 赵六 | 否     |
|   1005 | 钱七 | 是     |
|   1006 | 孙八 | 是     |
+--------+------+--------+
6 rows in set (0.00 sec)

13、将职工表worker中的职工按出生的先后顺序排序。
mysql> select * from worker order by `出生日期`;
+--------+--------+------------+---------+----------+------+------------+
| 部门号 | 职工号 | 工作时间   | 工资    | 政治面貌 | 姓名 | 出生日期   |
+--------+--------+------------+---------+----------+------+------------+
|    102 |   1003 | 2011-01-04 | 8500.00 | 党员     | 王亮 | 1983-06-08 |
|    101 |   1001 | 2015-05-04 | 3500.00 | 群众     | 张三 | 1990-07-01 |
|    102 |   1005 | 2014-04-01 | 4800.00 | 党员     | 钱七 | 1992-12-30 |
|    102 |   1004 | 2016-10-10 | 5500.00 | 群众     | 赵六 | 1994-09-05 |
|    102 |   1006 | 2017-05-05 | 4500.00 | 党员     | 孙八 | 1996-09-02 |
|    101 |   1002 | 2017-02-06 | 3200.00 | 团员     | 李四 | 1997-02-08 |
+--------+--------+------------+---------+----------+------+------------

14、显示工资最高的前3名职工的职工号和姓名。
mysql> select `职工号`, `姓名` from worker order by `工资` desc limit 3;

+--------+------+
| 职工号 | 姓名 |
+--------+------+
|   1003 | 王亮 |
|   1004 | 赵六 |
|   1005 | 钱七 |
+--------+------+

15、求出各部门党员的人数。 
mysql> select `部门号`,count(`部门号`) 总数 from worker where `政治面貌`
 = '党员' group by `部门号`;
+--------+------+
| 部门号 | 总数 |
+--------+------+
|    102 |    3 |
+--------+------+

16、统计各部门的工资和平均工资
mysql> select `部门号`, SUM(工资) 总工资, AVG(工资) 平均工资 from worker
 group by `部门号`;
+--------+----------+-------------+
| 部门号 | 总工资   | 平均工资    |
+--------+----------+-------------+
|    101 |  6700.00 | 3350.000000 |
|    102 | 23300.00 | 5825.000000 |
+--------+----------+-------------+
2 rows in set (0.00 sec)

17、列出总人数大于3的部门号和总人数。
mysql> select `部门号`,count(`职工号`) 总人数 from worker group by `部门
号` having count(`职工号`) > 3;
+--------+--------+
| 部门号 | 总人数 |
+--------+--------+
|    102 |      4 |
+--------+--------+
1 row in set (0.00 sec)

3.2多表查询

#student表
mysql> CREATE TABLE student (
    ->     id INT(10) NOT NULL UNIQUE PRIMARY KEY,
    ->     name VARCHAR(20) NOT NULL,
    ->     sex VARCHAR(4),
    ->     birth YEAR,
    ->     department VARCHAR(20),
    ->     address VARCHAR(50)
    -> );
Query OK, 0 rows affected, 1 warning (0.03 sec)

#score表
mysql> CREATE TABLE score (
    ->     id INT(10) NOT NULL UNIQUE PRIMARY KEY AUTO_INCREMENT,
    ->     stu_id INT(10) NOT NULL,
    ->     c_name VARCHAR(20),
    ->     grade INT(10)
    -> );
Query OK, 0 rows affected, 3 warnings (0.03 sec)

mysql> desc student;
+------------+-------------+------+-----+---------+-------+
| Field      | Type        | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| id         | int         | NO   | PRI | NULL    |       |
| name       | varchar(20) | NO   |     | NULL    |       |
| sex        | varchar(4)  | YES  |     | NULL    |       |
| birth      | year        | YES  |     | NULL    |       |
| department | varchar(20) | YES  |     | NULL    |       |
| address    | varchar(50) | YES  |     | NULL    |       |
+------------+-------------+------+-----+---------+-------+
6 rows in set (0.01 sec)

mysql> desc score;
+--------+-------------+------+-----+---------+----------------+
| Field  | Type        | Null | Key | Default | Extra          |
+--------+-------------+------+-----+---------+----------------+
| id     | int         | NO   | PRI | NULL    | auto_increment |
| stu_id | int         | NO   |     | NULL    |                |
| c_name | varchar(20) | YES  |     | NULL    |                |
| grade  | int         | YES  |     | NULL    |                |
+--------+-------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

mysql> select * from student;
+-----+--------+------+-------+------------+--------------+
| id  | name   | sex  | birth | department | address      |
+-----+--------+------+-------+------------+--------------+
| 901 | 张老大 | 男   |  1985 | 计算机系   | 北京市海淀区 |
| 902 | 张老二 | 男   |  1986 | 中文系     | 北京市昌平区 |
| 903 | 张三   | 女   |  1990 | 中文系     | 湖南省永州市 |
| 904 | 李四   | 男   |  1990 | 英语系     | 辽宁省阜新市 |
| 905 | 王五   | 女   |  1991 | 英语系     | 福建省厦门市 |
| 906 | 王六   | 男   |  1988 | 计算机系   | 湖南省衡阳市 |
+-----+--------+------+-------+------------+--------------+
6 rows in set (0.00 sec)

mysql> select * from score;
+----+--------+--------+-------+
| id | stu_id | c_name | grade |
+----+--------+--------+-------+
|  1 |    901 | 计算机 |    98 |
|  2 |    901 | 英语   |    80 |
|  3 |    902 | 计算机 |    65 |
|  4 |    902 | 中文   |    88 |
|  5 |    903 | 中文   |    95 |
|  6 |    904 | 计算机 |    70 |
|  7 |    904 | 英语   |    92 |
|  8 |    905 | 英语   |    94 |
|  9 |    906 | 计算机 |    90 |
| 10 |    906 | 英语   |    85 |
+----+--------+--------+-------+
10 rows in set (0.00 sec)

1)添加外键约束

mysql> alter table score add foreign key(stu_id) references student(id);

Query OK, 10 rows affected (0.08 sec)
Records: 10  Duplicates: 0  Warnings: 0

mysql> desc score;
+--------+-------------+------+-----+---------+----------------+
| Field  | Type        | Null | Key | Default | Extra          |
+--------+-------------+------+-----+---------+----------------+
| id     | int         | NO   | PRI | NULL    | auto_increment |
| stu_id | int         | NO   | MUL | NULL    |                |
| c_name | varchar(20) | YES  |     | NULL    |                |
| grade  | int         | YES  |     | NULL    |                |
+--------+-------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

2)题目

3.查询student表的所有记录
mysql> select * from student;
+-----+--------+------+-------+------------+--------------+
| id  | name   | sex  | birth | department | address      |
+-----+--------+------+-------+------------+--------------+
| 901 | 张老大 | 男   |  1985 | 计算机系   | 北京市海淀区 |
| 902 | 张老二 | 男   |  1986 | 中文系     | 北京市昌平区 |
| 903 | 张三   | 女   |  1990 | 中文系     | 湖南省永州市 |
| 904 | 李四   | 男   |  1990 | 英语系     | 辽宁省阜新市 |
| 905 | 王五   | 女   |  1991 | 英语系     | 福建省厦门市 |
| 906 | 王六   | 男   |  1988 | 计算机系   | 湖南省衡阳市 |
+-----+--------+------+-------+------------+--------------+
6 rows in set (0.00 sec)

4.查询student表的第2条到4条记录
mysql> select * from student limit 1,3;
+-----+--------+------+-------+------------+--------------+
| id  | name   | sex  | birth | department | address      |
+-----+--------+------+-------+------------+--------------+
| 902 | 张老二 | 男   |  1986 | 中文系     | 北京市昌平区 |
| 903 | 张三   | 女   |  1990 | 中文系     | 湖南省永州市 |
| 904 | 李四   | 男   |  1990 | 英语系     | 辽宁省阜新市 |
+-----+--------+------+-------+------------+--------------+
3 rows in set (0.00 sec)

5.从student表查询所有学生的学号(id)、姓名(name)和院系(department)的信息
mysql> select id 学号,name 姓名,department 院系 from student;
+------+--------+----------+
| 学号 | 姓名   | 院系     |
+------+--------+----------+
|  901 | 张老大 | 计算机系 |
|  902 | 张老二 | 中文系   |
|  903 | 张三   | 中文系   |
|  904 | 李四   | 英语系   |
|  905 | 王五   | 英语系   |
|  906 | 王六   | 计算机系 |
+------+--------+----------+
6 rows in set (0.00 sec)

6.从student表中查询计算机系和英语系的学生的信息
mysql> select * from student where department in ('计算机系', '英语系');

+-----+--------+------+-------+------------+--------------+
| id  | name   | sex  | birth | department | address      |
+-----+--------+------+-------+------------+--------------+
| 901 | 张老大 | 男   |  1985 | 计算机系   | 北京市海淀区 |
| 904 | 李四   | 男   |  1990 | 英语系     | 辽宁省阜新市 |
| 905 | 王五   | 女   |  1991 | 英语系     | 福建省厦门市 |
| 906 | 王六   | 男   |  1988 | 计算机系   | 湖南省衡阳市 |
+-----+--------+------+-------+------------+--------------+
4 rows in set (0.00 sec)

7.从student表中查询年龄18~22岁的学生信息
mysql> SELECT *
    -> FROM student
    -> WHERE YEAR(CURDATE()) - birth BETWEEN 30 AND 40;
+-----+--------+------+-------+------------+--------------+
| id  | name   | sex  | birth | department | address      |
+-----+--------+------+-------+------------+--------------+
| 901 | 张老大 | 男   |  1985 | 计算机系   | 北京市海淀区 |
| 902 | 张老二 | 男   |  1986 | 中文系     | 北京市昌平区 |
| 903 | 张三   | 女   |  1990 | 中文系     | 湖南省永州市 |
| 904 | 李四   | 男   |  1990 | 英语系     | 辽宁省阜新市 |
| 905 | 王五   | 女   |  1991 | 英语系     | 福建省厦门市 |
| 906 | 王六   | 男   |  1988 | 计算机系   | 湖南省衡阳市 |
+-----+--------+------+-------+------------+--------------+
6 rows in set (0.00 sec)

8.从student表中查询每个院系有多少人
mysql> select department,count(id) 总数 from student  group by departmen
t;
+------------+------+
| department | 总数 |
+------------+------+
| 计算机系   |    2 |
| 中文系     |    2 |
| 英语系     |    2 |
+------------+------+
3 rows in set (0.00 sec)

9.从score表中查询每个科目的最高分
mysql> select c_name 学科, MAX(grade) 最高分 from score group by c_name;
+--------+--------+
| 学科   | 最高分 |
+--------+--------+
| 计算机 |     98 |
| 英语   |     94 |
| 中文   |     95 |
+--------+--------+
3 rows in set (0.00 sec)

10.查询李四的考试科目(c_name)和考试成绩(grade)
mysql> select student.name, score.c_name, score.grade from student,score
 where student.id = score.stu_id and student.name = "李四";
+------+--------+-------+
| name | c_name | grade |
+------+--------+-------+
| 李四 | 计算机 |    70 |
| 李四 | 英语   |    92 |
+------+--------+-------+
2 rows in set (0.00 sec)

11.用连接的方式查询所有学生的信息和考试信息
mysql> select student.*, score.c_name, score.grade from student join score on student.id = score.stu_id;
+-----+--------+------+-------+------------+--------------+--------+-------+
| id  | name   | sex  | birth | department | address      | c_name | grade |
+-----+--------+------+-------+------------+--------------+--------+-------+
| 901 | 张老大 | 男   |  1985 | 计算机系   | 北京市海淀区 | 计算机 |    98 |
| 901 | 张老大 | 男   |  1985 | 计算机系   | 北京市海淀区 | 英语   |    80 |
| 902 | 张老二 | 男   |  1986 | 中文系     | 北京市昌平区 | 计算机 |    65 |
| 902 | 张老二 | 男   |  1986 | 中文系     | 北京市昌平区 | 中文   |    88 |
| 903 | 张三   | 女   |  1990 | 中文系     | 湖南省永州市 | 中文   |    95 |
| 904 | 李四   | 男   |  1990 | 英语系     | 辽宁省阜新市 | 计算机 |    70 |
| 904 | 李四   | 男   |  1990 | 英语系     | 辽宁省阜新市 | 英语   |    92 |
| 905 | 王五   | 女   |  1991 | 英语系     | 福建省厦门市 | 英语   |    94 |
| 906 | 王六   | 男   |  1988 | 计算机系   | 湖南省衡阳市 | 计算机 |    90 |
| 906 | 王六   | 男   |  1988 | 计算机系   | 湖南省衡阳市 | 英语   |    85 |
+-----+--------+------+-------+------------+--------------+--------+-------+
10 rows in set (0.00 sec)

12.计算每个学生的总成绩
mysql> select student.name 姓名, SUM(grade) 总成绩 from student join sco
re on student.id = score.stu_id group by student.name;
+--------+--------+
| 姓名   | 总成绩 |
+--------+--------+
| 张老大 |    178 |
| 张老二 |    153 |
| 张三   |     95 |
| 李四   |    162 |
| 王五   |     94 |
| 王六   |    175 |
+--------+--------+
6 rows in set (0.00 sec)

13.计算每个考试科目的平均成绩
mysql> select c_name 科目, AVG(grade) 平均成绩 from score group by c_nam
e;
+--------+----------+
| 科目   | 平均成绩 |
+--------+----------+
| 计算机 |  80.7500 |
| 英语   |  87.7500 |
| 中文   |  91.5000 |
+--------+----------+
3 rows in set (0.00 sec)

14.查询计算机成绩低于95的学生信息
mysql> select student.name 姓名, score.grade 成绩 from student join score on student.id = score.stu_id where c_name = "计算机" having score.grade < 95 ;
+--------+------+
| 姓名   | 成绩 |
+--------+------+
| 张老二 |   65 |
| 李四   |   70 |
| 王六   |   90 |
+--------+------+
3 rows in set (0.00 sec)

15.查询同时参加计算机和英语考试的学生的信息
mysql> SELECT
    ->     s.*,
    ->     sc1.grade AS 计算机成绩,
    ->     sc2.grade AS 英语成绩
    -> FROM
    ->     student s
    -> JOIN
    ->     score sc1 ON s.id = sc1.stu_id AND sc1.c_name = '计算机'
    -> JOIN
    ->     score sc2 ON s.id = sc2.stu_id AND sc2.c_name = '英语';
+-----+--------+------+-------+------------+--------------+------------+----------+
| id  | name   | sex  | birth | department | address      | 计算机成绩 | 英语成绩 |
+-----+--------+------+-------+------------+--------------+------------+----------+
| 901 | 张老大 | 男   |  1985 | 计算机系   | 北京市海淀区 |         98 |       80 |
| 904 | 李四   | 男   |  1990 | 英语系     | 辽宁省阜新市 |         70 |       92 |
| 906 | 王六   | 男   |  1988 | 计算机系   | 湖南省衡阳市 |         90 |       85 |
+-----+--------+------+-------+------------+--------------+------------+----------+
3 rows in set (0.00 sec)

16.将计算机考试成绩按从高到低进行排序
mysql> select grade from score where c_name="计算机" order by grade desc;
+-------+
| grade |
+-------+
|    98 |
|    90 |
|    70 |
|    65 |
+-------+

17.从student表和score表中查询出学生的学号,然后合并查询结果
mysql> SELECT id AS 学号
    -> FROM student
    -> UNION
    -> SELECT stu_id AS 学号
    -> FROM score;
+------+
| 学号 |
+------+
|  901 |
|  902 |
|  903 |
|  904 |
|  905 |
|  906 |
+------+
6 rows in set (0.00 sec)

18.查询姓张或者姓王的同学的姓名、院系和考试科目及成绩
mysql> select student.name 姓名, department 院系, c_name 考试科目, grade
 成绩 from student join score on student.id = score.stu_id where student
.name like "王%";
+------+----------+----------+------+
| 姓名 | 院系     | 考试科目 | 成绩 |
+------+----------+----------+------+
| 王五 | 英语系   | 英语     |   94 |
| 王六 | 计算机系 | 计算机   |   90 |
| 王六 | 计算机系 | 英语     |   85 |
+------+----------+----------+------+
3 rows in set (0.00 sec)

19.查询都是湖南的学生的姓名、年龄、院系和考试科目及成绩
mysql> SELECT
    ->     s.name AS 姓名,
    ->     YEAR(CURDATE()) - s.birth AS 年龄,
    ->     s.department AS 院系,
    ->     sc.c_name AS 考试科目,
    ->     sc.grade AS 成绩
    -> FROM
    ->     student s
    -> JOIN
    ->     score sc ON s.id = sc.stu_id
    -> WHERE
    ->     s.address LIKE '%湖南%';
+------+------+----------+----------+------+
| 姓名 | 年龄 | 院系     | 考试科目 | 成绩 |
+------+------+----------+----------+------+
| 张三 |   35 | 中文系   | 中文     |   95 |
| 王六 |   37 | 计算机系 | 计算机   |   90 |
| 王六 |   37 | 计算机系 | 英语     |   85 |
+------+------+----------+----------+------+

相关文章:

  • 如何调整yarn.nodemanager.vmem-pmem-ratio参数?
  • Flutter深度解析:跨平台框架的架构设计与工程实践
  • 日语Learn,英语再认识(4)
  • 创维CW代工-通刷-晶晨S905L3/L3B-安卓9-线刷固件包及教程
  • 多模态大模型的基础模块
  • ROS2 架构梳理汇总整理
  • 如何让WordPress不同的页面、栏目显示不同的小工具侧边栏
  • ISIS-3 LSDB链路状态数据库同步
  • vue - [Vue warn]: Duplicate keys detected: ‘0‘. This may cause an update error.
  • PDF与Markdown的量子纠缠:一场由VLM导演的文档界奇幻秀
  • C语言复习笔记--函数递归
  • Carsim学习笔记(二)
  • Jmeter:常用线程组设置策略
  • 初识 模版 和 STL
  • docker-compose解决容器有时差的问题
  • 【操作系统笔记】操作系统概述
  • Docker 安装 RabbitMQ
  • MySQL数据库中常用的命令
  • 侯捷 C++ 课程学习笔记:由浅入深,步入C++世界大门
  • 北斗导航 | 基于北斗三号短报文通信的北斗-YOLO融合系统原理,算法公式,系统流程框图,matlab代码,应用场景
  • 公司内部网站创建/网络营销推广公司网站
  • 制作网页时一般使用什么对网页进行布局/图片优化是什么意思
  • 晋中工商局网站开发区分局/新东方在线koolearn
  • wordpress设置背景图案/seo网络优化平台
  • 网站首页做301/网络营销推广外包平台
  • 网站框架设计图/网络推广团队