MySQL从零开始 9-表数据查找之select语句以及where,order by, group by子句的使用

 数据库使用的大多数操作就是查找,所以熟悉select操作是非常重要的。

 在讲解select之前,我们先要创建一个表来支撑我们的查找,创建脚本如下,大家直接复制粘贴到命令行即可。

create table student (
id int not null default 1,
name varchar(20) not null default '',
chinese float not null default 0.0 comment '语文成绩',
english float not null default 0.0 comment '英语成绩',
math float not null default 0.0 comment '数学成绩'
);

insert into student values(1, '李白', 89,78, 90);
insert into student values(2, '唐僧', 67,98, 56);
insert into student values(3, '孙悟空', 87,78, 77);
insert into student values(4, '老妖婆', 88,98, 90);
insert into student values(5, '红孩儿', 82,84, 67);
insert into student values(6, '如来佛祖', 55,85, 45);
insert into student values(7, '菩萨', 75,65, 30);

1. select基本操作

 select基本语法如下:

select [distinct] * from tableName [where condition];

 ’*’星号表示通配符,泛指所有列,但是效率较低,建议要查找哪一列就将该列显示的声明出来。from后面的是要查找的表名。

-- 查找所有数据
mysql> select * from student;
+----+----------+---------+---------+------+
| id | name     | chinese | english | math |
+----+----------+---------+---------+------+
|  1 | 李白     |    89.0 |    78.0 | 90.0 |
|  2 | 唐僧     |    67.0 |    98.0 | 56.0 |
|  3 | 孙悟空   |    87.0 |    78.0 | 77.0 |
|  4 | 老妖婆   |    88.0 |    98.0 | 90.0 |
|  5 | 红孩儿   |    82.0 |    84.0 | 67.0 |
|  6 | 如来佛祖 |    55.0 |    85.0 | 45.0 |
|  7 | 菩萨     |    75.0 |    65.0 | 30.0 |
+----+----------+---------+---------+------+
7 rows in set (0.00 sec)

 可选项[distinct]表示如果查询结果有重复数据,会在显示中取出重复行(只在本次查询结果显示中去除重复行,并不删除数据)。

mysql> select distinct english from student;
+---------+
| english |
+---------+
|    78.0 |
|    98.0 |
|    84.0 |
|    85.0 |
|    65.0 |
+---------+
5 rows in set (0.00 sec)

 可以看到,显示结果中重复的数据只显示一次,总共显示了五行。

 在select中可以对指定的列使用表达式进行数据运算,和distinct一样,作用效果只是本次显示,并不改变实际数据。

 使用as关键字可以对列名进行别名操作,使本次显示使用别名进行显示。

-- 在所有学生分数上加上10分(查询所有学生的总分再加10分)
mysql> select name, (chinese+math+english)+10 as total from student;
+----------+-------+
| name     | total |
+----------+-------+
| 李白     | 267.0 |
| 唐僧     | 231.0 |
| 孙悟空   | 252.0 |
| 老妖婆   | 286.0 |
| 红孩儿   | 243.0 |
| 如来佛祖 | 195.0 |
| 菩萨     | 180.0 |
+----------+-------+
7 rows in set (0.00 sec)

 select语句也可以使用where显示的声明查询条件。

-- 将所有姓唐的学生成绩增加60%(查询总分再增加60%)
-- '%'为正则表达式的通配符,like为模糊查询
mysql> select name, (chinese+math+english)*1.6 as total from student where name like '唐%';
+------+-------+
| name | total |
+------+-------+
| 唐僧 | 353.6 |
+------+-------+
1 row in set (0.06 sec)

 在where中使用like进行模糊查询以及正则表达式,可以起到事半功倍的效果。

2. where子句

 在大量的数据中进行我们想要数据的查询需要制定条件,所以我们使用where进行查询条件的指定。

 在where中,我们经常使用如下运算符进行辅助查询:

where子句中的运算符

 接下来看一些查询的例子:

-- 查询姓李的学生的成绩
mysql> select * from student where name like '李%';
+----+------+---------+---------+------+
| id | name | chinese | english | math |
+----+------+---------+---------+------+
|  1 | 李白 |    89.0 |    78.0 | 90.0 |
+----+------+---------+---------+------+
1 row in set (0.00 sec)


-- 查询英语成绩大于90分的同学
+----+--------+---------+---------+------+
| id | name   | chinese | english | math |
+----+--------+---------+---------+------+
|  2 | 唐僧   |    67.0 |    98.0 | 56.0 |
|  4 | 老妖婆 |    88.0 |    98.0 | 90.0 |
+----+--------+---------+---------+------+
2 rows in set (0.02 sec)


-- 查询总分大于200分并且数学成绩小于语文成绩的姓唐的学生
mysql> select * from student where (math+english+chinese) > 200 and math < chinese and name like '唐%';
+----+------+---------+---------+------+
| id | name | chinese | english | math |
+----+------+---------+---------+------+
|  2 | 唐僧 |    67.0 |    98.0 | 56.0 |
+----+------+---------+---------+------+
1 row in set (0.00 sec)


-- 查询英语分数在80 - 90 之间的同学
mysql> select * from student where english>=80 and english<=90; --方法1
mysql> select * from student where english between 80 and 90; -- 方法2 between是闭区间
+----+----------+---------+---------+------+
| id | name     | chinese | english | math |
+----+----------+---------+---------+------+
|  5 | 红孩儿   |    82.0 |    84.0 | 67.0 |
|  6 | 如来佛祖 |    55.0 |    85.0 | 45.0 |
+----+----------+---------+---------+------+
2 rows in set (0.00 sec)


-- 查询数学成绩为89,90,91的同学
mysql> select * from student where math=89 or math=90 or math=91; -- 方法1
mysql> select * from student where math in(89,90,91);--方法2,推荐使用这种方法
+----+--------+---------+---------+------+
| id | name   | chinese | english | math |
+----+--------+---------+---------+------+
|  1 | 李白   |    89.0 |    78.0 | 90.0 |
|  4 | 老妖婆 |    88.0 |    98.0 | 90.0 |
+----+--------+---------+---------+------+
2 rows in set (0.03 sec)

 最后还要注意的一点是,where不能对别名进行条件限制,即where子句中不能出现别名。

3. order by子句

 order by子句对查询结果进行排序,并且其要位于select语句最尾部,语法如下:

select colName1, ... from tableName [where conditon...] order by colName, ... asc|desc

 asc表示升序排序,desc表示降序排序。order by 默认显示升序排序。

-- 对数学成绩进行排序
mysql> select * from student order by math;
+----+----------+---------+---------+------+
| id | name     | chinese | english | math |
+----+----------+---------+---------+------+
|  7 | 菩萨     |    75.0 |    65.0 | 30.0 |
|  6 | 如来佛祖 |    55.0 |    85.0 | 45.0 |
|  2 | 唐僧     |    67.0 |    98.0 | 56.0 |
|  5 | 红孩儿   |    82.0 |    84.0 | 67.0 |
|  3 | 孙悟空   |    87.0 |    78.0 | 77.0 |
|  1 | 李白     |    89.0 |    78.0 | 90.0 |
|  4 | 老妖婆   |    88.0 |    98.0 | 90.0 |
+----+----------+---------+---------+------+
7 rows in set (0.03 sec)

-- 降序排序
mysql> select * from student order by math desc;
+----+----------+---------+---------+------+
| id | name     | chinese | english | math |
+----+----------+---------+---------+------+
|  1 | 李白     |    89.0 |    78.0 | 90.0 |
|  4 | 老妖婆   |    88.0 |    98.0 | 90.0 |
|  3 | 孙悟空   |    87.0 |    78.0 | 77.0 |
|  5 | 红孩儿   |    82.0 |    84.0 | 67.0 |
|  2 | 唐僧     |    67.0 |    98.0 | 56.0 |
|  6 | 如来佛祖 |    55.0 |    85.0 | 45.0 |
|  7 | 菩萨     |    75.0 |    65.0 | 30.0 |
+----+----------+---------+---------+------+
7 rows in set (0.00 sec)

 order by可以对别名进行排序。

-- 对总分进行排序后,按从高到低输出
mysql> select id, name, math+english+chinese as total from student order by total desc;
+----+----------+-------+
| id | name     | total |
+----+----------+-------+
|  4 | 老妖婆   | 276.0 |
|  1 | 李白     | 257.0 |
|  3 | 孙悟空   | 242.0 |
|  5 | 红孩儿   | 233.0 |
|  2 | 唐僧     | 221.0 |
|  6 | 如来佛祖 | 185.0 |
|  7 | 菩萨     | 170.0 |
+----+----------+-------+
7 rows in set (0.00 sec)

4. group by子句

 group by对列进行分组,按照指定的列将数据进行分组在进行查询,语法和order by一样。

select column1, column2, .. from table group by column;

 在进行group by演示之前,我们向student表中添加性别这一列。

mysql> alter table student add gender varchar(1);
Query OK, 0 rows affected (1.52 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> update student set gender='男' where id in(1,2,3,5,6);
Query OK, 5 rows affected (0.14 sec)
Rows matched: 5  Changed: 5  Warnings: 0

mysql> update student set gender='女' where id in(4,7);
Query OK, 2 rows affected (0.10 sec)
Rows matched: 2  Changed: 2  Warnings: 0

mysql> select * from student;
+----+----------+---------+---------+------+--------+
| id | name     | chinese | english | math | gender |
+----+----------+---------+---------+------+--------+
|  1 | 李白     |    89.0 |    78.0 | 90.0 | 男     |
|  2 | 唐僧     |    67.0 |    98.0 | 56.0 | 男     |
|  3 | 孙悟空   |    87.0 |    78.0 | 77.0 | 男     |
|  4 | 老妖婆   |    88.0 |    98.0 | 90.0 | 女     |
|  5 | 红孩儿   |    82.0 |    84.0 | 67.0 | 男     |
|  6 | 如来佛祖 |    55.0 |    85.0 | 45.0 | 男     |
|  7 | 菩萨     |    75.0 |    65.0 | 30.0 | 女     |
+----+----------+---------+---------+------+--------+
7 rows in set (0.00 sec)

 看下面的例子:

-- 查询男女生人数,count()函数之后会讲解
mysql> select count(*) from student group by gender;
+----------+
| count(*) |
+----------+
|        2 |
|        5 |
+----------+
2 rows in set (0.00 sec)

 group by一般还会与having搭配使用,having后面跟着限制条件,对group by的结果进一步过滤,相当于where子句。

猜你喜欢

转载自blog.csdn.net/weixin_40739833/article/details/80711875