2.1 MySQL 基础 (二)- 表操作
#学习内容#
1. MySQL表数据类型
MySQL支持多种类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型。
参考:http://www.runoob.com/mysql/mysql-data-types.html
2. 用SQL语句创建表
创建MySQL数据表的SQL通用语法:
CREATE TABLE table_name (column_name column_type);
语句解释:
表名、表字段名、定义每个表字段
设定列类型 、大小、约束
ALTER TABLE table_name ADD column_name datatype # 添加列
ALTER TABLE table_name ALTER COLUMN column_name datatype # 修改列类型
ALTER TABLE tableName DROP COLUMN columnName # 删除列
alter table user modify column name varchar(50) ;#大小
create table teacher1(
t_id int,
t_name varchar(5),
class_name varchar(6),
days tinyint unsigned,
primary key (t_id) //在定义的末尾注明主键是上述的哪个字段
);
#https://www.cnblogs.com/zhqiang/archive/2017/05/23/6890111.html
设定主键
CREATE TABLE t1(id int not null primary key,name char(20));
3. 用SQL语句向表中添加数据
insert into tablename (first_column,...last_column) values (first_value,...last_value);
语句解释
插入数据:insert into 表名(字段列表) values(值列表)[,(值列表)];
多种添加方式(指定列名;不指定列名)
INSERT INTO table_name VALUES ('value1', 'value2', 'value3', 'value4');
INSERT INTO table_name (column1,column2,column3) VALUES (value1,value2,value3);
- 用SQL语句删除表
DELETE FROM table_name;
DROP TABLE table_name;
TRUNCATE TABLE table_name
语句解释
DROP:删除表数据和表本身。真正意义上的删除表,操作前一定要小心。
DELETE:删除一行或者多行数据,不删除表本身。
TRUNCATE:仅删除表内数据,不删除表本身。
- 用SQL语句修改表
ALTER TABLE table_name_old RENAME TO table_name_new
修改列名
ALTER TABLE 表名 CHANGE 列名 新列名 列类型
修改表中数据
语法:update 表名 set 列名1=值,列名2=值 where 条件;
示例一:update test1 set age='21' where id='1';
删除行
语法:DELETE FROM 表名称 WHERE 列名称 = 值
DELETE FROM Person WHERE LastName = 'Wilson'
删除列
-- 删除列
ALTER TABLE table_name DROP column;
新建列
alter table tablename add(filename1 varchar(11));
新建行
INSERT INTO table_name (column1,column2...) VALUES (value1,value2,...);
#作业#
项目三:超过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:
学生在每个课中不应被重复计算。INSERT INTO courses(student, class) VALUES('A','Math'), ('B','English'), ('C', 'Math'),('D', 'Biology'),('E', 'Math'),('F', 'Computer'),('G', 'Math'),('H', 'Math'),('I', 'Math'),('A', 'Math');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 |
UPDATE salary SET sex = IF(sex = 'm', 'f', 'm');
2.2 MySQL 基础 (三)- 表联结
#学习内容#
MySQL别名
使用MySQL别名来提高查询的可读性。MySQL支持两种别名,称为列别名和表别名。
1)列别名
MySQL列的别名,可以使用AS关键字后跟别名;如果别名包含空格,必须将别名用引号引住。AS关键字可以省略。
2)表别名
表的别名称为表别名。像列别名一样,AS关键字是可选的,所以完全可以省略它。一般在包含INNER JOIN,LEFT JOIN,self join子句和子查询的语句中使用表别名
-- 列别名
SELECT column_name AS alias_name FROM table_name;
-- 表别名
SELECT column_name(s) FROM table_name AS alias_name;
INNER JOIN
LEFT JOIN
CROSS JOIN
自连接
UNION
以上几种方式的区别和联系
参考:https://www.yiibai.com/mysql/left-join.html
#作业#
项目五:组合两张表 (难度:简单)
在数据库中创建表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
--在数据库中创建表1和表2,并各插入三行数据
CREATE TABLE Person(
Personld int(2) primary key,
FirstName VARCHAR(10),
LastName VARCHAR(10)
);
INSERT INTO Person(Personld,FirstName,LastName)
VALUES(1,'A','B');
INSERT INTO Person(Personld,FirstName,LastName)
VALUES(2,'C','D');
INSERT INTO Person(Personld,FirstName,LastName)
VALUES(3,'E','F');
INSERT INTO Person(Personld,FirstName,LastName)
VALUES(4,'G','H');
+----------+-----------+----------+
| Personld | FirstName | LastName |
+----------+-----------+----------+
| 1 | A | B |
| 2 | C | D |
| 3 | E | F |
| 4 | G | H |
+----------+-----------+----------+
4 rows in set (0.00 sec)
CREATE TABLE Address(
Addressld int(4) primary key,
Personld int(2),
City VARCHAR(10),
State VARCHAR(20)
);
INSERT INTO Address(Addressld,Personld,City,State)
VALUES(11,1,'Beijing','China');
INSERT INTO Address(Addressld,Personld,City,State)
VALUES(12,3,'London','US');
INSERT INTO Address(Addressld,Personld,City,State)
VALUES(13,2,'New York','US');
+-----------+----------+-------+----------+
| Addressld | Personld | City | State |
+-----------+----------+-------+----------+
| 11 | 1 | Beijing | China|
| 12 | 3 | London | US|
| 13 | 2 | New York | US |
+-----------+----------+-------+----------+
--编写一个 SQL 查询,满足条件:无论 person 是否有地址信息,都需要基于上述两表提供 person 的以下信息:FirstName, LastName, City, State
--左外连接
SELECT P.FirstName,P.LastName,A.City,A.State FROM Person P LEFT JOIN
Address A ON P.Personld=A.Personld;
+-----------+----------+-------+----------+
| FirstName | LastName | City | State |
+-----------+----------+-------+----------+
| A | B | Beijing| China|
| E | F | London | US|
| C | D | New York |US|
| G | H | NULL | NULL |
+-----------+----------+-------+----------+
4 rows in set (0.00 sec)
参考:https://blog.csdn.net/Guiabbey/article/details/88989779
项目六:删除重复的邮箱(难度:简单)
编写一个 SQL 查询,来删除 email 表中所有重复的电子邮箱,重复的邮箱里只保留 Id 最小 的那个。
±—±--------+
| Id | Email |
±—±--------+
| 1 | [email protected] |
| 2 | [email protected] |
| 3 | [email protected] |
±—±--------+
Id 是这个表的主键。
例如,在运行你的查询语句之后,上面的 Person表应返回以下几行:
±—±-----------------+
| Id | Email |
±—±-----------------+
| 1 | [email protected] |
| 2 | [email protected] |
±—±-----------------+
SELECT e1.* FROM email e1,email e2 WHERE e1.email=e2.email; #表中的重复邮箱
SELECT e1.* FROM email e1,email e2 WHERE e1.email=e2.email AND e1.ID>e2.ID; #找到具有相同电子邮件地址的更大 ID,自身作比较
DELETE e1 FROM email e1,email e2 WHERE e1.email=e2.email AND e1.ID>e2.ID; #查找出的内容删除