查询数据
完整的查询指令是:Select select选项 字段列表 from 数据源 where 条件 group by 分组 having 条件 order by 排序 limit 限制;
其中where之前的部分称之为查询主句,where之后部分称之为查询五子句。下面将介绍下查询主句:
select选项
"select选项"表示系统该如何对待查询得到的结果,它分为两类:
1、All:默认的,表示保存所有的记录
2、Distinct:去重,去除重复的记录,只保留一条(所有的字段都相同情况下)
mysql> select all * from copy_table;
+------+
| name |
+------+
| good |
| b |
| c |
| d |
| good |
| b |
| c |
| d |
| a |
| b |
| c |
| d |
| a |
| b |
| c |
| d |
+------+
16 rows in set (0.19 sec)
mysql> select distinct * from copy_table;
+------+
| name |
+------+
| good |
| b |
| c |
| d |
| a |
+------+
5 rows in set (0.11 sec)
字段列表
前面学过*代表所有字段,同时单个表查询字段数据不难,但有的时候需要从多张表获取数据(多表获取数据方式待讲),在获取数据的时候,可能存在不同表中有同名的字段,这个时候需要将同名的字段命名成不同名的,此时可以利用别名(alias)实现(alias缩写为as,可忽略):
基本语法:字段名 [as] 别名
mysql> select distinct name name1,name as name2 from copy_table;
+-------+-------+
| name1 | name2 |
+-------+-------+
| good | good |
| b | b |
| c | c |
| d | d |
| a | a |
+-------+-------+
5 rows in set (0.00 sec)
From数据源
from是为前面的查询提供数据,数据源只要是一个符合二维表结构的数据即可。
单表数据:from 表名
多表数据:从多张表获取数据,基本语法:from 表1,表2... [where 条件]
注意: 如果不加条件直接进行查询,则会出现以下效果,这种结果我们称之为 笛卡尔乘积.笛卡尔乘积公式 : A表中数据条数 * B表中数据条数 = 笛卡尔乘积.
mysql> select * from student;
+----+------+
| id | name |
+----+------+
| 1 | 小明 |
| 2 | 小可 |
| 3 | 小艾 |
| 4 | 小新 |
+----+------+
4 rows in set (0.35 sec)
mysql> select * from teacher;
+------+------+
| name | age |
+------+------+
| 小明 | 26 |
| 小可 | 28 |
| 小艾 | 22 |
+------+------+
3 rows in set (0.00 sec)
mysql> select * from student,teacher;
+----+------+------+------+
| id | name | name | age |
+----+------+------+------+
| 1 | 小明 | 小明 | 26 |
| 1 | 小明 | 小可 | 28 |
| 1 | 小明 | 小艾 | 22 |
| 2 | 小可 | 小明 | 26 |
| 2 | 小可 | 小可 | 28 |
| 2 | 小可 | 小艾 | 22 |
| 3 | 小艾 | 小明 | 26 |
| 3 | 小艾 | 小可 | 28 |
| 3 | 小艾 | 小艾 | 22 |
| 4 | 小新 | 小明 | 26 |
| 4 | 小新 | 小可 | 28 |
| 4 | 小新 | 小艾 | 22 |
+----+------+------+------+
12 rows in set (0.00 sec)
结果:两张表的记录数相乘,字段数拼接
本质:从第一张表取出一条记录,去拼凑第二张表的所有记录,保留所有结果。得到的结果为笛卡尔积,这个结果除了给数据库造成压力,没有其他意义,应该尽量避免出现笛卡尔积。
动态数据
From后面跟的数据不是一个实体表,而是一个从表中查询出来得到的二维结果表(子查询)
基本语法:from (select 字段列表 from 表)as 别名; 备注:[as] 别名;不仅可以跟字段做别名,还可以跟表做别名,同理[as] 别名中as可忽略。
-- [as] 别名;不仅可以跟字段做别名,还可以跟表做别名,as可忽略
mysql> select all * from (select name from student) as name_student;
+------+
| name |
+------+
| 小明 |
| 小可 |
| 小艾 |
| 小新 |
+------+
4 rows in set (0.00 sec)