数据库基本操作10-查询语句

1.6 查询语句

1
语法:select [选项] 列名 [from 表名] [where 条件]  [group by 分组] [order by 排序][having 条件] [limit 限制]

1.6.1 字段表达式

1
2
3
4
5
6
7
8
9
10
11
12
13
mysql> select '锄禾日当午';
+------------+
| 锄禾日当午 |
+------------+
| 锄禾日当午 |
+------------+

mysql> select 10*10;
+-------+
| 10*10 |
+-------+
| 100 |
+-------+

通过as给字段取别名

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mysql>  select '锄禾日当午' as content;
+------------+
| content |
+------------+
| 锄禾日当午 |
+------------+
1 row in set (0.00 sec)

mysql> select 10*10 as result;
+--------+
| result |
+--------+
| 100 |
+--------+
1 row in set (0.00 sec)

多学一招:as可以省略

1
2
3
4
5
6
7
mysql> select 10*10  result;
+--------+
| result |
+--------+
| 100 |
+--------+
1 row in set (0.00 sec)

1.6.2 from子句

from:来自,from后面跟的是数据源。数据源可以有多个。返回笛卡尔积。

插入测试表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
mysql> create table t1(
-> id int,
-> name varchar(10)
-> );
Query OK, 0 rows affected (0.05 sec)

mysql> create table t2(
-> field1 varchar(10),
-> field2 varchar(10)
-> );
Query OK, 0 rows affected (0.00 sec)

mysql> insert into t1 values (1,'tom'),(2,'berry');
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0

mysql> insert into t2 values ('333','333'),('444','444');
Query OK, 2 rows affected (0.02 sec)
Records: 2 Duplicates: 0 Warnings: 0

测试多个数据源

1
2
3
4
5
6
7
8
9
10
mysql> select * from t1,t2;              # 返回笛卡尔积
+------+-------+--------+--------+
| id | name | field1 | field2 |
+------+-------+--------+--------+
| 1 | tom | 333 | 333 |
| 2 | berry | 333 | 333 |
| 1 | tom | 444 | 444 |
| 2 | berry | 444 | 444 |
+------+-------+--------+--------+
4 rows in set (0.00 sec)

1.6.3 dual表

dual表是一个伪表。在有些特定情况下,没有具体的表的参与,但是为了保证select语句的完整又必须要一个表名,这时候就使用伪表。

1
2
3
4
5
6
mysql> select 10*10 as result from dual;  #dual表是用来保证select语句的完整性。
+--------+
| result |
+--------+
| 100 |
+--------+

1.6.4 where子句

where后面跟的是条件,在数据源中进行筛选。返回条件为真记录

MySQL支持的运算符

  1. > 大于
  2. <小于
  3. >=
  4. <=
  5. =
  6. !=
  7. and 与
  8. or 或
  9. not 非
1
2
mysql> select * from stu where stusex='男';		# 查找性别是男的记录
mysql> select * from stu where stuage>=20; # 查找年龄不低于20的记录

思考:如下代码输出什么

1
2
select * from stu where 1      # 返回所有数据库
select * from stu where 0 #返回空记录

思考:如何查找北京和上海的学生

1
2
3
4
5
6
7
8
9
mysql> select * from stu where stuaddress='上海' or stuaddress='北京';
+--------+---------+--------+--------+---------+------------+------+------+
| stuNo | stuName | stuSex | stuAge | stuSeat | stuAddress | ch | math |
+--------+---------+--------+--------+---------+------------+------+------+
| s25301 | 张秋丽 | 男 | 18 | 1 | 北京 | 80 | NULL |
| s25302 | 李文才 | 男 | 31 | 3 | 上海 | 77 | 76 |
| s25303 | 李斯文 | 女 | 22 | 2 | 北京 | 55 | 82 |
| s25320 | Tom | 男 | 24 | 8 | 北京 | 65 | 67 |
+--------+---------+--------+--------+---------+------------+------+------+

1.6.5 in | not in

上面的查询上海和北京的学生的SQL可以通过in语句来实现

1
mysql> select * from stu where stuaddress in ('北京','上海');

练习:

1、查找学号是s25301,s25302,s25303的学生

1
mysql> select * from stu where stuno in ('s25301','s25302','s25303');

2、查找年龄是18,19,20的学生

1
mysql> select * from stu where stuage in(18,19,20);

3、查找不是北京和上海的学生

1
mysql> select * from stu where stuaddress not in ('北京','上海');

1.6.6 between…and|not between…and

查找某个范围的记录

1、查找年龄在18~20之间的学生

1
2
3
mysql> select * from stu where stuage>=18 and stuage<=20;   # 方法一

mysql> select * from stu where stuage between 18 and 20; # 方法二

2、查找年龄不在18~20之间的学生

1
2
3
4
5
mysql> select * from stu where stuage<18 or stuage>20;		#方法一

mysql> select * from stu where not (stuage>=18 and stuage<=20);

mysql> select * from stu where stuage not between 18 and 20;

1.6.7 is null | is not null

脚下留心:查询一个为空的字段不能用等于,必须用is null

查找缺考的学生

1
2
3
4
5
6
7
mysql> select * from stu where ch is null or math is null; # 查找缺考的人
+--------+----------+--------+--------+---------+------------+------+------+
| stuNo | stuName | stuSex | stuAge | stuSeat | stuAddress | ch | math |
+--------+----------+--------+--------+---------+------------+------+------+
| s25301 | 张秋丽 | 男 | 18 | 1 | 北京 | 80 | NULL |
| s25304 | 欧阳俊雄 | 男 | 28 | 4 | 天津 | NULL | 74 |
+--------+----------+--------+--------+---------+------------+------+------+

查找参加考试的学生

1
mysql> select * from stu where ch is not null and math is not null;

1.6.8 聚合函数

  1. sum() 求和
  2. avg() 求平均值
  3. max() 求最大值
  4. min() 求最小值
  5. count() 求记录数
1
2
3
4
5
6
7
8
9
10
#求语文总分、语文平均分、语文最高分、语文最低分、总人数

mysql> select sum(ch) '语文总分',avg(ch) '语文平均分', max(ch) '语文最高分',min(ch) '语文最低分',count(*) '总人数' from stu;
+----------+------------+------------+------------+--------+
| 语文总分 | 语文平均分 | 语文最高分 | 语文最低分 | 总人数 |

+----------+------------+------------+------------+--------+
| 597 | 74.6250 | 88 | 55 | 9 |
+----------+------------+------------+------------+--------+
1 row in set (0.00 sec)

1.6.9 通配符

  1. _ [下划线] 表示任意一个字符
  2. % 表示任意字符

练习

1、满足“T_m”的有(A、C)

A:Tom B:Toom C:Tam D:Tm E:Tmo

2、满足“T_m_”的有(B、C )

A:Tmom B:Tmmm C:T1m2 D:Tmm E:Tm

3、满足“张%”的是(A、B、C、D)

A:张三 B:张三丰 C:张牙舞爪 D:张 E:小张

4、满足“%诺基亚%”的是(A、B、C、D)

A:诺基亚2100 B:2100诺基亚 C:把我的诺基亚拿过来 D:诺基亚

1.6.10 模糊查询(like)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 查找姓张的同学
mysql> select * from stu where stuname like '张%';
+--------+---------+--------+--------+---------+------------+------+------+
| stuNo | stuName | stuSex | stuAge | stuSeat | stuAddress | ch | math |
+--------+---------+--------+--------+---------+------------+------+------+
| s25301 | 张秋丽 | 男 | 18 | 1 | 北京 | 80 | NULL |
+--------+---------+--------+--------+---------+------------+------+------+
1 row in set (0.00 sec)
#例题
mysql> select * from stu where stuname like 'T_m';
+--------+---------+--------+--------+---------+------------+------+------+
| stuNo | stuName | stuSex | stuAge | stuSeat | stuAddress | ch | math |
+--------+---------+--------+--------+---------+------------+------+------+
| s25320 | Tom | 男 | 24 | 8 | 北京 | 65 | 67 |
+--------+---------+--------+--------+---------+------------+------+------+
1 row in set (0.00 sec)

-------------本文结束感谢您的阅读-------------

本文标题:数据库基本操作10-查询语句

文章作者:Wuman

发布时间:2018年09月16日 - 12:09

最后更新:2018年09月16日 - 12:09

原始链接:http://yoursite.com/2018/09/16/数据库基本操作10-查询语句/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。