1. 设置mysql别名

表别名

查询数据时,如果表名很长,使用起来不方便,此时,就可以为表取一个别名,用这个别名来代替表的名称
SELECT * FROM 表名 [AS] 别名;
注意,为表指定别名,AS关键字可以省略不写

mysql> select * from salary;
+----+------+-----+--------+
| id | name | sex | salary |
+----+------+-----+--------+
|  1 | A    | f   |   2500 |
|  2 | B    | m   |   1500 |
|  3 | C    | f   |   5500 |
|  4 | D    | m   |    500 |
+----+------+-----+--------+
4 rows in set (0.00 sec)

mysql> select * from salary as ss where ss.salary > 2000;
+----+------+-----+--------+
| id | name | sex | salary |
+----+------+-----+--------+
|  1 | A    | f   |   2500 |
|  3 | C    | f   |   5500 |
+----+------+-----+--------+
2 rows in set (0.00 sec)

列别名

在查询数据时,为了使显示的查询结果更加直观,可以为字段取一个别名
SELECT 字段名 [AS] 别名 [,字段名 [AS] 别名,……] FROM 表名;
注意,为字段指定别名,AS关键字可以省略不写。

mysql> select id as user_id, name as user_name, sex as user_sex, salary as user_salary from salary;
+---------+-----------+----------+-------------+
| user_id | user_name | user_sex | user_salary |
+---------+-----------+----------+-------------+
|       1 | A         | f        |        2500 |
|       2 | B         | m        |        1500 |
|       3 | C         | f        |        5500 |
|       4 | D         | m        |         500 |
+---------+-----------+----------+-------------+
4 rows in set (0.00 sec)

2. INNER JOIN、LEFT JOIN、CROSS JOIN、自连接、UNION几种方式区别与联系

inner join:

左右两张表连接字段完全一致
SELECT XXX FROM XXX INNER JOIN XXX ON XXX; 这里 INNER 可以省略

left join:

以左表为全部,去连接右表

cross join:

交叉连接,得到的结果是两个表的乘积,即笛卡尔积.
笛卡尔(Descartes)乘积又叫直积。假设集合A={a,b},集合B={0,1,2},则两个集合的笛卡尔积为{(a,0),(a,1),(a,2),(b,0),(b,1), (b,2)}。可以扩展到多个集合的情况。类似的例子有,如果A表示某学校学生的集合,B表示该学校所有课程的集合,则A与B的笛卡尔积表示所有可能的选课情况。
笛卡尔积算法针对的是表之间数据行的匹配次数,跟内连接还是外连接无关,至于查询结果与你的查询条件有关系。

自连接:

自连接是连接的一种用法,但并不是连接的一种类型,因为他的本质是把一张表当成两张表来使用。

mysql有时在信息查询时需要进行对自身连接(自连接),所以我们需要为表定义别名。

union:

UNION 语句:用于将不同表中相同列中查询的数据展示出来;(不包括重复数据)

{A, B} UNION {B, C} = {A, B, C}

SELECT 列名称 FROM 表名称 UNION SELECT 列名称 FROM 表名称 ORDER BY 列名称;

union all:

UNION ALL 语句:用于将不同表中相同列中查询的数据展示出来;(包括重复数据)

{A, B} UNION ALL {B, C} = {A, B, B, C}

SELECT 列名称 FROM 表名称 UNION ALL SELECT 列名称 FROM 表名称 ORDER BY 列名称;

作业:

项目五:组合两张表 (难度:简单)
在数据库中创建表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 (
personid int not null primary key,
firstname varchar(20) not null,
lastname varchar(20) not null
);
--插入数据
insert into person values (101, 'ming', 'Yao');
insert into person values (102, 'lei', 'Wu');
insert into person values (103, 'zhi', 'Zheng');
--查询结果
mysql> select * from person;
+----------+-----------+----------+
| personid | firstname | lastname |
+----------+-----------+----------+
|      101 | ming      | Yao      |
|      102 | lei       | Wu       |
|      103 | zhi       | Zheng    |
+----------+-----------+----------+
3 rows in set (0.00 sec)
--创建表
create table address (
addressid int not null primary key,
personid int not null,
city varchar(20) not null,
state varchar(20) not null
);
--插入数据
insert into address values (8000, 9999, 'xian', 'UA');
insert into address values (8008, 102, 'beijing', 'AB');
insert into address values (9009, 103, 'hangzhou', 'AC');
--查询结果
mysql> select * from address;
+-----------+----------+----------+-------+
| addressid | personid | city     | state |
+-----------+----------+----------+-------+
|      8000 |     9999 | xian     | UA    |
|      8008 |      102 | beijing  | AB    |
|      9009 |      103 | hangzhou | AC    |
+-----------+----------+----------+-------+
3 rows in set (0.00 sec)

mysql> select firstname, lastname, a.city, a.state
    -> from person
    -> left join address as a on person.personid = a.personid;
+-----------+----------+----------+-------+
| firstname | lastname | city     | state |
+-----------+----------+----------+-------+
| ming      | Yao      | NULL     | NULL  |
| lei       | Wu       | beijing  | AB    |
| zhi       | Zheng    | hangzhou | AC    |
+-----------+----------+----------+-------+
3 rows in set (0.00 sec)
项目六:删除重复的邮箱(难度:简单)
编写一个 SQL 查询,来删除 email 表中所有重复的电子邮箱,重复的邮箱里只保留 Id 最小 的那个。
+----+---------+
| Id | Email   |
+----+---------+
| 1  | a@b.com |
| 2  | c@d.com |
| 3  | a@b.com |
+----+---------+
Id 是这个表的主键。
例如,在运行你的查询语句之后,上面的 email表应返回以下几行:
+----+------------------+
| Id | Email            |
+----+------------------+
| 1  | a@b.com |
| 2  | c@d.com  |
+----+------------------+

#问题分析
a. 删除重复的电子邮箱
b. 需要保留ID最小的那个(删除的ID比留下的那一条ID要大)
c. 考察自连接知识,把一张表当两张表来用。
--code--
mysql> select * from email;
+----+---------+
| ID | Email   |
+----+---------+
|  1 | a@b.com |
|  2 | c@d.com |
|  3 | a@b.com |
+----+---------+
3 rows in set (0.00 sec)

mysql> delete e1
    -> from email as e1, email as e2
    -> where e1.Email = e2.Email
    -> and e1.ID > e2.ID;
Query OK, 1 row affected (0.01 sec)

mysql> select * from email;
+----+---------+
| ID | Email   |
+----+---------+
|  1 | a@b.com |
|  2 | c@d.com |
+----+---------+
2 rows in set (0.00 sec)

--此处补充delete删除单表及多表的用法,之前不知道这个知识点
# 单表删除内容
mysql> select * from students2;
+-----+-------+--------+---------+
| sid | sname | gender | dept_id |
+-----+-------+--------+---------+
|   1 | 555   | 1      |       2 |
|   2 | 555   | 2      |       2 |
|   3 | 555   | 3      |       2 |
|   4 | 555   | 3      |       1 |
|   5 | 555   | 1      |       1 |
+-----+-------+--------+---------+
5 rows in set (0.00 sec)

mysql> delete from students2 where sid=4;
Query OK, 1 row affected (0.05 sec)

mysql> select * from students2;
+-----+-------+--------+---------+
| sid | sname | gender | dept_id |
+-----+-------+--------+---------+
|   1 | 555   | 1      |       2 |
|   2 | 555   | 2      |       2 |
|   3 | 555   | 3      |       2 |
|   5 | 555   | 1      |       1 |
+-----+-------+--------+---------+
4 rows in set (0.00 sec)

# 多表删除内容
mysql> select * from person;
+----------+-----------+----------+
| personid | firstname | lastname |
+----------+-----------+----------+
|      101 | ming      | Yao      |
|      102 | lei       | Wu       |
|      103 | zhi       | Zheng    |
+----------+-----------+----------+
3 rows in set (0.00 sec)

mysql> select * from address;
+-----------+----------+----------+-------+
| addressid | personid | city     | state |
+-----------+----------+----------+-------+
|      8000 |     9999 | xian     | UA    |
|      8008 |      102 | beijing  | AB    |
|      9009 |      103 | hangzhou | AC    |
+-----------+----------+----------+-------+
3 rows in set (0.00 sec)

mysql> delete p1, a1
    -> from person p1 inner join address a1
    -> where p1.personid = a1.personid;
Query OK, 4 rows affected (0.01 sec)

mysql> select * from person;
+----------+-----------+----------+
| personid | firstname | lastname |
+----------+-----------+----------+
|      101 | ming      | Yao      |
+----------+-----------+----------+
1 row in set (0.00 sec)

mysql> select * from address;
+-----------+----------+------+-------+
| addressid | personid | city | state |
+-----------+----------+------+-------+
|      8000 |     9999 | xian | UA    |
+-----------+----------+------+-------+
1 row in set (0.00 sec)

总结

  • 熟悉inner join / left join / cross join / 自连接 、union / union all 几种不同的连接方式
  • 主要学习自连接用法,一张表当两张表用
  • 深入学习delete语句用法

参考文章:

mysql union 操作符 | 菜鸟教程