数据查询是数据库的核心操作。MYSQL提供了select语句进行数据查询,该语句具有灵活的使用方式和丰富的功能。select语句既可以完成简单的单表查询,也可以完成复杂的连接查询和嵌套查询。
其一般格式为:
select [ all | distinct ] <目标列表达式>[ ,<目标列表达式>]...
from <表名或列名> [ ,<表名或列名>...] | (<select 语句>) [as] <别名>
[where <条件表达式> ]
[group by <列名1> [having] <条件表达式>]
[order by <列名2>[asc|desc] ];
以下以这两个表格为例:
AddressId | PersonId | City | State |
---|---|---|---|
1 | 2 | new york city | new york |
2 | 2 | waston city | waston |
Person | FirstName | LastName |
---|---|---|
1 | John | Allan |
2 | Mike | Li |
目录
一、单表查询
1.选择表中的若干项
①选择表中的若干列
查询语句:
select FirstName,LastName from person;
输出表格:
+-----------+----------+
| FirstName | LastName |
+-----------+----------+
| John | Allan |
| Mike | Li |
+-----------+----------+
2 rows in set (0.00 sec)
②查询全部列
查询语句:
select * from person;
等价于
select PersonId,FirstName,LastName from person;
输出表格:
+----------+-----------+----------+
| PersonId | FirstName | LastName |
+----------+-----------+----------+
| 1 | John | Allan |
| 2| Mike | Li |
+----------+-----------+----------+
2 rows in set (0.00 sec)
③查询经过计算的值
查询语句:
select 2020-PersonId,FirstName from person;
输出表格:
+---------------+-----------+
| 2020-PersonId | FirstName |
+---------------+-----------+
| 2019 | John |
| 2018 | Mike |
+---------------+-----------+
2 rows in set (0.01 sec)
2.选择表中的若干元组
①消除重复的行
不消除:
查询语句:
select PersonId from address;
输出表格:
+----------+
| PersonId |
+----------+
| 2 |
| 2 |
+----------+
2 rows in set (0.00 sec)
消除:
查询语句:
select distinct PersonId from address;
输出表格:
+----------+
| PersonId |
+----------+
| 2 |
+----------+
1 row in set (0.01 sec)
如果想要结果去掉表中的重复行,必须指定distinct。如果没有指定distinct关键词,则默认为all,即保留结果表中取之重复的行。
②查询满足条件的结果
查询条件 | 谓词 |
---|---|
比较 | =,<,>,<=,>=,!=,<>,!>,!<;not+上述比较运算符 |
确定范围 | between and , not between and |
确定集合 | in , not in |
字符匹配 | like , not like |
空值 | is null , is not null |
多重条件 | and , or , not |
Ⅰ.比较大小
查询语句:
select * from person where FirstName='John';
输出表格:
+----------+-----------+----------+
| PersonId | FirstName | LastName |
+----------+-----------+----------+
| 1 | John | Allan |
+----------+-----------+----------+
1 row in set (0.00 sec)
Ⅱ.确定范围
查询语句:
select * from person where PersonId between 1 and 2;
输出表格:
+----------+-----------+----------+
| PersonId | FirstName | LastName |
+----------+-----------+----------+
| 1 | John | Allan |
| 2 | Mike | Li |
+----------+-----------+----------+
2 rows in set (0.00 sec)
Ⅲ.确定集合
查询语句:
select * from person where PersonId in(1,2);
注意:如果数据类型是字符串的话,需要加上单引号。
输出表格:
+----------+-----------+----------+
| PersonId | FirstName | LastName |
+----------+-----------+----------+
| 1 | John | Allan |
| 2 | Mike | Li |
+----------+-----------+----------+
2 rows in set (0.01 sec)
Ⅳ.字符匹配
查询语句:
select * from person where FirstName like '_o%';
输出表格:
+----------+-----------+----------+
| PersonId | FirstName | LastName |
+----------+-----------+----------+
| 1 | John | Allan |
+----------+-----------+----------+
1 row in set (0.00 sec)
谓词like可以用来进行字符匹配。like之后的匹配串可以是一个完整的字符串,亦可以含有通配符%和_;
%(百分号)代表任意长度(长度可以为0)的字符串;_(下划线)代表任意单个字符。
如果用户要查询的字符串本身就含有通配符%和_,这是就要使用ESCAPE‘<换码字符>’。
例如:name like 'DB\_Design' ESCAPE '\'; 其中,ESCAPE'\'表示“\”为换码字符,这样紧跟字符串后面的字符“_”不再具有通配符的意义,转义为普通的"_"字符。
Ⅴ.涉及空值的查询
查询语句:
select * from person where FirstName is not null;
输出表格:
+----------+-----------+----------+
| PersonId | FirstName | LastName |
+----------+-----------+----------+
| 1 | John | Allan |
| 2 | Mike | Li |
+----------+-----------+----------+
2 rows in set (0.00 sec)
Ⅵ.多重条件查询
查询语句:
select * from person where FirstName='John' and PersonId>=1;
输出表格:
+----------+-----------+----------+
| PersonId | FirstName | LastName |
+----------+-----------+----------+
| 1 | John | Allan |
+----------+-----------+----------+
1 row in set (0.00 sec)
3.order by语句
用户可以使用order by子句对查询结果按照一个或多个属性列的升序(asc)或降序(desc)排列,默认值为升序。
查询语句:
select * from person order by PersonId desc;
输出表格:
+----------+-----------+----------+
| PersonId | FirstName | LastName |
+----------+-----------+----------+
| 2 | Mike | Li |
| 1 | John | Allan |
+----------+-----------+----------+
2 rows in set (0.00 sec)
对于空值,排序时显示的顺序由具体系统实现来决定。各个系统的实现可以不同,但保持一致就行。
4.聚集函数
为了进一步方便用户,增强检索功能,sql提供了许多聚集函数。
聚集函数 | 功能 |
---|---|
count(*) | 统计元组个数 |
count([ distinct | all ] <列名>) | 统计一列中值的个数 |
sum([ distinct | all ] <列名>) | 计算一列值的总和(数值型数据) |
avg([ distinct | all ] <列名>) | 统计一列值的平均值(数值型数据) |
max([ distinct | all ] <列名>) | 求一列中的最小值 |
min([ distinct | all ] <列名>) | 求一列中的最大值 |
聚集函数只能用于select子句和group by中的having子句。
操作语句:
select count(*) from person;
输出表格:
+----------+
| count(*) |
+----------+
| 2 |
+----------+
1 row in set (0.00 sec)
查询语句:
select avg(PersonId)from person;
输出表格:
+---------------+
| avg(PersonId) |
+---------------+
| 1.5000 |
+---------------+
1 row in set (0.00 s
5.group by语句
group by子句将查询结果按某一列或多列的值分组,值相等的为一组,分组后聚集函数将作用于每一个组,即每一组都有一个函数值。
查询语句:
select AddressId,count(PersonId) from address group by AddressId;
输出表格:
+-----------+-----------------+
| AddressId | count(PersonId) |
+-----------+-----------------+
| 1 | 1 |
| 2 | 1 |
+-----------+-----------------+
2 rows in set (0.00 sec)
二、连接查询
1.等值与非等值连接查询
查询语句:
select * from person,address where person.PersonId=address.PersonId;
输出表格:
+----------+-----------+----------+-----------+----------+---------------+----------+
| PersonId | FirstName | LastName | AddressId | PersonId | City | State |
+----------+-----------+----------+-----------+----------+---------------+----------+
| 2 | Mike | Li | 1 | 2 | new york city | new york |
| 2 | Mike | Li | 2 | 2 | waston city | waston |
+----------+-----------+----------+-----------+----------+---------------+----------+
2.自身连接
一个与其自身进行连接,成为表的自身连接。
查询语句:
select first.FirstName,second.LastName from person first,person second where first.PersonId=second.PersonId;
输出表格:
+-----------+----------+
| FirstName | LastName |
+-----------+----------+
| John | Allan |
| Mike | Li |
+-----------+----------+
2 rows in set (0.00 sec)
3.外连接(通过join)
外连接也是比较重要的,详情请看 MySql基础(三)--join的用法
4.多表连接
可以进行两表或两表以上的连接
查询语句:
select student,sno,sname,cname,grade from student,sc,course where student.sno=sc.sno and sc.cno=course.cno;
以上就是数据库MySQL中较为简单的数据查询了,完成基本的日常操作是没问题的。