【Mysql】基础day2

项目三

1、分组条件过滤&去重设置 :group & 子查询
构建一个course表:
sql语句:

create table courses ( 
student  char(20) NOT NULL ,
class    char(50) NOT NULL
);

insert into courses values('A','Math'),
('B','Engish'),
('C','Math'),
('D','BIology'),
('E','Math'),
('F','Computer'),
('G','Math'),
('H','Math'),
('I','Math'),
('A','Math')
;

表格如下:
在这里插入图片描述
编写一个 SQL 查询,列出所有超过或等于5名学生的课。

  • 思路:

1)对课程进行分组:group by,得到没门课程下对应的学生姓名;
2)对数据进行过滤:having,显示>5的信息,。这里注意去重。

select class from courses 
 group by class
having count(distinct (student))>=5;

结果如下:
在这里插入图片描述

项目四

交换工资(难度:简单)
创建一个 salary 表,如下所示,有m=男性 和 f=女性的值 。

id name sex salary
1 A m 2500
2 B f 1500
3 C m 5500
4 D f 500

交换所有的 f 和 m 值(例如,将所有 f 值更改为 m,反之亦然)。要求使用一个更新查询,并且没有中间临时表。
运行你所编写的查询语句之后,将会得到以下表:

id name sex salary
1 A f 2500
2 B m 1500
3 C f 5500
4 D m 500
select id,name,case sex when 'f' then 'm' else 'f'
end as sex,salary
from salary;

在这里插入图片描述

项目五

组合两张表 (难度:简单)
在数据库中创建表1和表2,并各插入三行数据(自己造)
表1: Person
±------------±--------+
| 列名 | 类型 |
±------------±--------+
| PersonId | int |
| FirstName | varchar |
| LastName | varchar |
±------------±--------+
PersonId 是上表主键

表2: Address
±------------±--------+
| 列名 | 类型 |
±------------±--------+t
| AddressId | int |
| PersonId | int |
| City | varchar |
| State | varchar |
±------------±--------+
AddressId 是上表主键

编写一个 SQL 查询,满足条件:无论 person 是否有地址信息,都需要基于上述两表提供 person 的以下信息:FirstName, LastName, City, State
创建表:

CREATE TABLE Person (
	PersonId INT NOT NULL PRIMARY KEY,
	FirstName VARCHAR (30),
	LastName VARCHAR (30)
);
CREATE TABLE Address (
	AddressId INT NOT NULL PRIMARY KEY,
	PersonId INT NOT NULL,
	City VARCHAR (100),
	State VARCHAR (100)
);


INSERT INTO Person
VALUES
	('1', 'a', 'b');
INSERT INTO Person
VALUES
	('2', 'c', 'd');
INSERT INTO Person
VALUES
	('3', 'a', 'c');
INSERT INTO Address
VALUES
	('1', '1', '北京', 'A');
INSERT INTO Address
VALUES
	('2', '4', '上海', 'B');
INSERT INTO Address
VALUES
	('3', '2', '深圳', 'C');
	

思路:根据题目要求,显示person表所有信息。也就是说,需要以person表为基础表,用左查询,显示右表信息。

select FirstName, LastName, city, state 
from person p 
left join address a
on p.personid=a.personid;

在这里插入图片描述

项目六

删除重复的邮箱

编写一个 SQL 查询,来删除 email 表中所有重复的电子邮箱,重复的邮箱里只保留 Id 最小 的那个。
±—±--------+
| Id | Email |
±—±--------+
| 1 | [email protected] |
| 2 | [email protected] |
| 3 | [email protected] |
±—±--------+
Id 是这个表的主键。
例如,在运行你的查询语句之后,上面的 Person 表应返回以下几行:
±—±-----------------+
| Id | Email |
±—±-----------------+
| 1 | [email protected] |
| 2 | [email protected] |
±—±-----------------+

思路:
1)找到邮箱重复的email,并保留最小的id;
2)子查询—删掉id不在1)中的数据,关键条件是id。

delete from email where id not in
 (
select e.id from 
(select min(id) as id 
 from email 
 group by email)
 e);

猜你喜欢

转载自blog.csdn.net/weixin_40460554/article/details/89033458
今日推荐