MySQL表数据类型
数字型,字符型,日期型
用SQL语句创建表
create table <表名>
(<列名1> <数据类型> <该列所需约束>,
<列名1> <数据类型> <该列所需约束>,
<列名1> <数据类型> <该列所需约束>,
<列名1> <数据类型> <该列所需约束>,
.
.
<该表的约束1> ,<该表的约束2>,....)
interger:用来存储整数的列的数据类型(数字型)
char:用来指定存储定长字符串的列的数据类型(字符型)
varchar:用来指定存储可变字符串的列的数据类型(字符串类型)
主键
primary key <列名>
用SQL语句向表中添加数据
insert into <表名> (列1,列2,列3) values (值1,值2,值3);
用SQL语句删除表
drop:删除数据库和表等对象
delete:删除表中部分数据
truncate:删除表中全部数据
用SQL语句修改表
修改列名
alter table <表名> change <列名> <新列名>;
修改表中数据
delete from <表名>
where <条件>;
新建列
alter table <列名> add column <列的定义>;
#作业#
项目三:超过5名学生的课(难度:简单)
创建如下所示的courses 表 ,有: student (学生) 和 class (课程)。 例如,表: ±--------±-----------+ | student | class | ±--------±-----------+ | A | Math | | B | English | | C | Math | | D | Biology | | E | Math | | F | Computer | | G | Math | | H | Math | | I | Math | | A | Math | ±--------±-----------+
编写一个 SQL 查询,列出所有超过或等于5名学生的课。 应该输出: ±--------+ | class | ±--------+ | Math | ±--------+ Note: 学生在每个课中不应被重复计算。
create table courses
( student varchar(225) not null,
calss varchar(225) not null);
insert into courses values (‘A’,‘Math’);
insert into courses values (‘B’,‘English’);
insert into courses values (‘C’,‘Math’);
insert into courses values (‘D’,‘Biology’);
insert into courses values (‘E’,‘Math’);
insert into courses values (‘F’,‘Computer’);
insert into courses values (‘G’,‘Math’);
insert into courses values (‘H’,‘Math’);
insert into courses values (‘I’,‘Math’);
insert into courses values (‘A’,‘Math’);
commit;
select calss
from courses
group by calss
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
create table salary
(id integer not null,
name char(225) not null,
sex char(225) not null,
salary integer not null);
insert into salary values (1,'A','m',2500);
insert into salary values (2,'B','f',1500);
insert into salary values (3,'C','m',5500);
insert into salary values (4,'D','f',500);
commit;
update salary set sex=if(sex='f','m','f');
select *
from salary;
项目五:有趣的电影 (难度:简单)
某城市开了一家新的电影院,吸引了很多人过来看电影。该电影院特别注意用户体验,专门有个 LED显示板做电影推荐,上面公布着影评和相关电影描述。
作为该电影院的信息部主管,您需要编写一个 SQL查询,找出所有影片描述为非 boring (不无聊) 的并且 id 为奇数 的影片,结果请按等级 rating 排列。
例如,下表 cinema:
±--------±----------±-------------±----------+ | id | movie | description | rating | ±--------±----------±-------------±----------+ | 1 | War | great 3D | 8.9 | | 2 | Science | fiction | 8.5 | | 3 | irish | boring | 6.2 | | 4 | Ice song | Fantacy | 8.6 | | 5 | House card| Interesting| 9.1 | ±--------±----------±-------------±----------+ 对于上面的例子,则正确的输出是为:
±--------±----------±-------------±----------+ | id | movie | description | rating | ±--------±----------±-------------±----------+ | 5 | House card| Interesting| 9.1 | | 1 | War | great 3D | 8.9 | ±--------±----------±-------------±----------+
create table cinema
(id integer not null,
movie varchar(225) not null,
description varchar(225) not null,
rating varchar(225) not null);
insert into cinema values (1,'War','great3D','8.9');
insert into cinema values (2,'Science','fiction','8.5');
insert into cinema values (3,'irish','boring','6.2');
insert into cinema values (4,'Ice song','Fantacy','8.5');
insert into cinema values (5,'House card','interesting','9.1');
commit;
select *
from cinema
where id % 2=1 and description !='boring'
order by rating desc;
2.2 MySQL 基础 (三)- 表联结**#学习内容#**
MySQL别名
INNER JOIN
select <表1别名>.<列名>,<表2别名>.<列名>......
from <表1> as <表1别名> inner join <表2> as <表2别名>
on <表1别名>.<联结条件>=<表2别名>.<联结条件>;
LEFT JOIN
select <表1别名>.<列名>,<表2别名>.<列名>......
from <表1> as <表1别名> left outer join <表2> as <表2别名>
on <表1别名>.<联结条件>=<表2别名>.<联结条件>;
CROSS JOIN
select <表1别名>.<列名>,<表2别名>.<列名>......
from <表1> as <表1别名> cross join <表2> as <表2别名>
UNION
select <列名> <列名>
from <表1>
union
select <列名> <列名>
from <表2>
#作业#
项目六:组合两张表 (难度:简单)
在数据库中创建表1和表2,并各插入三行数据(自己造) 表1: Person ±------------±--------+ | 列名 | 类型 | ±------------±--------+ | PersonId | int | | FirstName | varchar | | LastName | varchar | ±------------±--------+ PersonId 是上表主键
表2: Address ±------------±--------+ | 列名 | 类型 | ±------------±--------+ | AddressId | int | | PersonId | int | | City | varchar | | State | varchar | ±------------±--------+ AddressId 是上表主键
编写一个 SQL 查询,满足条件:无论 person 是否有地址信息,都需要基于上述两表提供 person 的以下信息:FirstName, LastName, City, State
create table Person
(Personld integer not null,
Firstname varchar(225) not NULL,
Lastname varchar(225) not null,
primary key (Personld));
create table Address
(Addressld integer not null,
Personld integer not null,
City varchar(225) not null,
State varchar(225) not null,
primary key (Addressld));
select P.Firstname,P.Lastname,A.City,A.State
from Person as P inner join Address as A
on P.Personld=A.Personld;
项目七:删除重复的邮箱(难度:简单)
编写一个 SQL 查询,来删除 email 表中所有重复的电子邮箱,重复的邮箱里只保留 **Id ***最小 *的那个。 ±—±--------+ | Id | Email | ±—±--------+ | 1 | a@b.com | | 2 | c@d.com | | 3 | a@b.com | ±—±--------+ Id 是这个表的主键。 例如,在运行你的查询语句之后,上面的 Person表应返回以下几行: ±—±-----------------+ | Id | Email | ±—±-----------------+ | 1 | a@b.com | | 2 | c@d.com | ±—±-----------------+
create table email
(id integer not null,
Email varchar(225) not null,
primary key (id));
insert into email values (1,'a@b.com');
insert into email values (2,'c@d.com');
insert into email values (3,'a@b.com');
commit;
select *
from email
group by Email
having id not in (3);
项目八:从不订购的客户 (难度:简单)
某网站包含两个表,Customers 表和 Orders 表。编写一个 SQL 查询,找出所有从不订购任何东西的客户。
Customers 表:
±—±------+ | Id | Name | ±—±------+ | 1 | Joe | | 2 | Henry | | 3 | Sam | | 4 | Max | ±—±------+ Orders 表:
±—±-----------+ | Id | CustomerId | ±—±-----------+ | 1 | 3 | | 2 | 1 | ±—±-----------+ 例如给定上述表格,你的查询应返回:
±----------+ | Customers | ±----------+ | Henry | | Max | ±----------+
create table Customers
(id int not null,
name varchar(225) not null,
primary key (id));
insert into Customers values (1,'Joe');
insert into Customers values (2,'Henry');
insert into Customers values (3,'Sam');
insert into Customers values (4,'Max');
commit;
create table Orders
(id int not null,
Customerld int not null,
primary key (id));
insert into Orders values (1,3);
insert into Orders values (2,1);
commit;
select name
from Customers left outer join Orders
on Customers.id=Orders.Customerld
where Orders.Customerld is null;
项目九:超过经理收入的员工(难度:简单)
Employee 表包含所有员工,他们的经理也属于员工。每个员工都有一个 Id,此外还有一列对应员工的经理的 Id。
±—±------±-------±----------+ | Id | Name | Salary | ManagerId | ±—±------±-------±----------+ | 1 | Joe | 70000 | 3 | | 2 | Henry | 80000 | 4 | | 3 | Sam | 60000 | NULL | | 4 | Max | 90000 | NULL | ±—±------±-------±----------+ 给定 Employee 表,编写一个 SQL 查询,该查询可以获取收入超过他们经理的员工的姓名。在上面的表格中,Joe 是唯一一个收入超过他的经理的员工。
±---------+ | Employee | ±---------+ | Joe | ±---------+
create table Employee
(id int not null,
name varchar(225) not null,
Salary int not null,
Managerld int null,
primary key (id));
insert into Employee values (1,'Joe',70000,3);
insert into Employee values (2,'Henry',80000,4);
insert into Employee values (3,'Sam',60000,null);
insert into Employee values (4,'Max',90000,null);
commit;
select name Employee
from Employee as a
where Salary>(select Salary
from Employee
where id=a.Managerld);