一. Select 查询命令
讲完了MySQL函数, 终于就到了MySQL的查询了。 查询用的是 select 命令。
- 查询时,有多种形式, 有简单查询,有条件查询,有分组查询,有子查询,有连接查询等多种形式。
- 查询时, 常见的select 命令如下:
select distinct *|字段列表集合 from 表1,表2 ... where 表达式列表 group by 分组字段列表 having 分组字段筛选表达式 order by 排序字段列表 limit offset,count
- 下面,会分别讲解 select语句的。
在讲解之前, 重新创建数据库 yuejl.
创建演示所需要的表, 表user 和表 dept.
一.一 创建并使用数据库yuejl
- 创建数据库,编码为gbk:
create database yuejl character set gbk;
- 使用数据库:
use yuejl;
一.二 创建表 dept 并插入数据
1.创建 表 dept
create table dept( id int(11) primary key auto_increment, name varchar(20), description varchar(100) );
2 .插入数据
insert into dept(name,description) values ('信息部','这是信息部'),('开发部','这是开发部'), ('人事部','这是人事部');
一.三 创建表 user 并插入数据
- 创建表
create table user( id int(11) primary key auto_increment, name varchar(20), sex varchar(3), birthday date, age int(3), deptId int(11), constraint fk_user_deptId foreign key(deptId) references dept(id) );
- 分别插入几条数据
insert into user(name,sex,birthday,age,deptId) values ('两个蝴蝶飞','男','1995-10-01',24,1); insert into user(name,sex,birthday,age,deptId) values ('老蝴蝶','男','1995-10-01',24,2); insert into user(name,sex,birthday,age,deptId) values ('精灵妹','女','1996-10-26',23,1); insert into user(name,sex,birthday,age,deptId) values ('精小妹','女','1994-10-26',23,3); insert into user(name,sex,birthday,age,deptId) values ('岳泽霖','男','1994-2-7',25,1);
接下来,就正式进入到查询 select了。
二. 查询字段
- 有三种形式:
查询单个字段
查询多个字段
查询全部字段
会分别进行介绍。
二.一 查询单个字段
1 .所用命令:
select 单个列名 from 表名。
2 . 举例: 只查询一下,user表中的姓名。 查询时,只显示姓名。
select name from user;
便只显示出 name的 列值集合。
二.二 查询多个字段
1 . 所用命令:
select 列名1,列名2... from 表名
不需要按照列定义时的顺序来。
2 . 举例 如只查询一下,姓名,性别,和年龄
select name,sex,age from user;
展示的顺序,就是用户定义 select 时,列属性列表的顺序。
二.三 查询全部字段
查询全部字段,有两种形式, 一种是像查询多个字段一样,将列名一个个写出来, 另外一个是用 * 来进行表示全部的字段。
二.三.一 写出全部列名
1 . 所用命令:
select 列名1,列名2...列名n from 表名;
不需要按照列定义时的顺序来。
2 .举例, 查询全部的信息
select id,name,birthday,age,sex,deptId from user;
二.三.二 用 * 来省略全部的列名字段
1 .所用命令
select * from 表名;
2 . 举例 查询全部的信息
select * from user;
- 列展示的顺序,就是创建表时,列的创建顺序。
- 在实际的开发中,不建议使用 *的方式来全部展示, 而是用 写出全部列名的形式, 这样展示的顺序便不需要与列创建时的顺序一致了,当改变表的列顺序时,也不会影响程序。 另外,在从数据库中查询出来数据时,也不一定要全部展示, 只展示出数据相应的列名数据即可。
- 但用 * 时,比较快捷,不需要记住 列名,方便查询,常用于生活学习中。
三. 查询时 as 别名的用法
- 在实际生活中,常常会用到很多表一起查询,表名比较长,写起来很复杂, 而且各个表之间的列名有很多都是相同的,如 id,name 等属性,想要很清楚的表示出 哪个列名属于哪个表,或者想换一个更清晰的中文名称进行展示, 可以像生活中那样,给各个表,各个字段起一个别名。
- 别名,可以用在表上面,也可以用在列上面。 用as 关键字, 但as 一般都省略。
select 列名1 [as] 新列名1, 列名2 [as] 新列名2... from 表名 as 新表名。
三.一 表别名
- 如给 user 表起一个别名,叫做 a
select a.name,a.sex from user as a;
- 用数据库管理工具时, a. 后会自动将列名展示出来。
- 也可以省略 as
select a.name,a.sex from user a;
- user 与a 之间,要有空格。
三.二 列别名
- 如将 name,sex 展示时 显示成中文进行展示。
select a.name as '姓名',a.sex as '性别' from user a;
四. 查询时 distinct 去重的用法
- distinct 去重, 可以将查询的结果进行去重。 如果所有的结果都一样,才会将结果当成相同的结果。
四.一 distinct 去重单字段
四.一.一 不用distinct 去重时
不用 distinct 去重时, 查询 age.
select age from user;
发现, age 为 24,24,23,23,25 五个值, 有重复值。
四.一.二 用distinct 去重时
- 查询 age
select distinct age from user;
发现,只剩下 24,23,25 三个值了。 没有重复值。
distinct 达到了去重的目的。
四.二 用distinct 去重多个字段时
- 上面只是单独的去重 age一个字段,现在去重 birthday和sex 两个字段。 当这两个字段的值都一样时,才会去重。
四.二.一 不用 distinct 进行去重时
select u.sex,u.birthday from user u;
- 可以发现,第一条数据和第二条数据 的 性别和生日都是一样, 而第三条数据和第四条数据 只是性别一样,生日是不一样的。
四.二.二 用distinct 进行去重时
select distinct u.sex,u.birthday from user u;
- 会发现,只剩下四条结果。 原来的第一条结果与原来的第二条结果相同,被去重处理