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);
  1. 用SQL语句删除表
DELETE FROM table_name;
DROP TABLE table_name;
TRUNCATE TABLE table_name

语句解释

DROP:删除表数据和表本身。真正意义上的删除表,操作前一定要小心。
DELETE:删除一行或者多行数据,不删除表本身。
TRUNCATE:仅删除表内数据,不删除表本身。

  1. 用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:
学生在每个课中不应被重复计算。
MySQL任务3INSERT 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');
MySQL任务3select 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

MySQL任务3MySQL任务3MySQL任务3UPDATE 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;  #查找出的内容删除

相关文章:

  • 2021-07-08
  • 2021-06-08
  • 2021-06-21
  • 2021-07-29
  • 2021-07-19
  • 2021-09-13
  • 2021-06-17
  • 2021-04-28
猜你喜欢
  • 2021-07-30
  • 2021-08-01
  • 2021-05-13
  • 2022-01-19
  • 2021-12-10
  • 2021-11-18
相关资源
相似解决方案