匹配条件

匹配条件

 

基本匹配条件

数值比较

·字段必须是数值类型

 

 

字符比较/匹配空/非空

·字段必须是字符类型

 

 

 

逻辑匹配

多个判断条件时使用

 

 

 

范围匹配/去重显示

匹配范围内的任意一个值即可

 

 

 

匹配条件练习

1)常用的表记录统计函数

查询stu_info表一共有多少条记录(本例中为5条):

mysql> SELECT count(*) FROM stu_info;
+----------+
| count(*) |
+----------+
|        5 |
+----------+
1 row in set (0.00 sec)

计算stu_info表中各学员的平均年龄、最大年龄、最小年龄:

mysql> SELECT avg(age),max(age),min(age) FROM stu_info;
+----------+----------+----------+
| avg(age) | max(age) | min(age) |
+----------+----------+----------+
|  22.6000 |       27 |       20 |
+----------+----------+----------+
1 row in set (0.00 sec)

计算stu_info表中男学员的个数:

mysql> SELECT count(gender) FROM stu_info WHERE gender='boy';
+---------------+
| count(gender) |
+---------------+
|             3 |
+---------------+
1 row in set (0.00 sec)

2)字段值的数值比较

列出stu_info表中年龄为21岁的学员记录:

mysql> SELECT * FROM stu_info WHERE age=21;
+------+--------+-----+
| name | gender | age |
+------+--------+-----+
| Tom  | boy    |  21 |
| Mike | boy    |  21 |
+------+--------+-----+
2 rows in set (0.00 sec)

列出stu_info表中年龄超过21岁的学员记录:

mysql> SELECT * FROM stu_info WHERE age>21;
+-------+--------+-----+
| name  | gender | age |
+-------+--------+-----+
| Jim   | girl   |  24 |
| Jerry | boy    |  27 |
+-------+--------+-----+
2 rows in set (0.00 sec)

列出stu_info表中年龄大于或等于21岁的学员记录:

mysql> SELECT * FROM stu_info WHERE age>=21;
+-------+--------+-----+
| name  | gender | age |
+-------+--------+-----+
| Jim   | girl   |  24 |
| Tom   | boy    |  21 |
| Jerry | boy    |  27 |
| Mike  | boy    |  21 |
+-------+--------+-----+
4 rows in set (0.00 sec)

列出stu_info表中年龄在20岁和24岁之间的学员记录:

mysql> SELECT * FROM stu_info WHERE age BETWEEN 20 and 24;
+------+--------+-----+
| name | gender | age |
+------+--------+-----+
| Jim  | girl   |  24 |
| Tom  | boy    |  21 |
| Lily | girl   |  20 |
| Mike | boy    |  21 |
+------+--------+-----+
4 rows in set (0.00 sec)

3)多个条件的组合

列出stu_info表中年龄小于23岁的女学员记录:

mysql> SELECT * FROM stu_info WHERE age < 23 AND gender='girl';
+------+--------+-----+
| name | gender | age |
+------+--------+-----+
| Lily | girl   |  20 |
+------+--------+-----+
1 row in set (0.00 sec)

列出stu_info表中年龄小于23岁的学员,或者女学员的记录:

mysql> SELECT * FROM stu_info WHERE age < 23 OR gender='girl';
+------+--------+-----+
| name | gender | age |
+------+--------+-----+
| Jim  | girl   |  24 |
| Tom  | boy    |  21 |
| Lily | girl   |  20 |
| Mike | boy    |  21 |
+------+--------+-----+
4 rows in set (0.00 sec)

如果某个记录的姓名属于指定范围内的一个,则将其列出:

mysql> SELECT * FROM stu_info WHERE name IN
    -> ('Jim','Tom','Mickey','Minnie');
+------+--------+-----+
| name | gender | age |
+------+--------+-----+
| Jim  | girl   |  24 |
| Tom  | boy    |  21 |
+------+--------+-----+
2 rows in set (0.00 sec)

4)使用SELECT做数学计算

计算1234与5678的和:

mysql> SELECT 1234+5678;
+-----------+
| 1234+5678 |
+-----------+
|      6912 |
+-----------+
1 row in set (0.00 sec)

计算1234与5678的乘积:

mysql> SELECT 1234*5678;
+-----------+
| 1234*5678 |
+-----------+
|   7006652 |
+-----------+
1 row in set (0.00 sec)

计算1.23456789除以3的结果:

mysql> SELECT 1.23456789/3;
+----------------+
| 1.23456789/3   |
+----------------+
| 0.411522630000 |
+----------------+
1 row in set (0.00 sec)

输出stu_info表各学员的姓名、15年后的年龄:

mysql> SELECT name,age+15 FROM stu_info;
+-------+--------+
| name  | age+15 |
+-------+--------+
| Jim   |     39 |
| Tom   |     36 |
| Lily  |     35 |
| Jerry |     42 |
| Mike  |     36 |
+-------+--------+
5 rows in set (0.00 sec)

 


高级匹配条件

模糊查询

 where  字段名  like   '通配符'
  -  表示1个字符
 % 表示0~n个字符·示例
列出name值“4个字符”的记录
mysql> select name from userdb.user
where name like "----";

5)使用模糊查询,LIKE

以下划线 _ 匹配单个字符,% 可匹配任意多个字符。

列出stu_info表中姓名以“J”开头的学员记录:

mysql> SELECT * FROM stu_info WHERE name LIKE 'J%';
+-------+--------+-----+
| name  | gender | age |
+-------+--------+-----+
| Jim   | girl   |  24 |
| Jerry | boy    |  27 |
+-------+--------+-----+
2 rows in set (0.00 sec)

列出stu_info表中姓名以“J”开头且只有3个字母的学员记录:

mysql> SELECT * FROM stu_info WHERE name LIKE 'J__';
+------+--------+-----+
| name | gender | age |
+------+--------+-----+
| Jim  | girl   |  24 |
+------+--------+-----+
1 row in set (0.00 sec)

正则表达式

·用法
- where字段名regexp '正则表达式’

-正则元字符^  $  .  []   * l

·示例
―列出name值“以j开头或以y结尾”的记录
mysql> select name from db1.t2
where name regexp '^j | y$' ;

6)使用正则表达式,REGEXP

列出stu_info表中姓名以“J”开头且以“y”结尾的学员记录:

mysql> SELECT * FROM stu_info WHERE name REGEXP '^J.*y$';
+-------+--------+-----+
| name  | gender | age |
+-------+--------+-----+
| Jerry | boy    |  27 |
+-------+--------+-----+
1 row in set (0.00 sec)

效果等同于:

mysql> SELECT * FROM stu_info WHERE name Like 'J%y';
+-------+--------+-----+
| name  | gender | age |
+-------+--------+-----+
| Jerry | boy    |  27 |
+-------+--------+-----+
1 row in set (0.00 sec)

列出stu_info表中姓名以“J”开头或者以“y”结尾的学员记录:

mysql> SELECT * FROM stu_info WHERE name REGEXP '^J|y$';
+-------+--------+-----+
| name  | gender | age |
+-------+--------+-----+
| Jim   | girl   |  24 |
| Lily  | girl   |  20 |
| Jerry | boy    |  27 |
+-------+--------+-----+
3 rows in set (0.00 sec)

效果等同于:

mysql> SELECT * FROM stu_info WHERE name Like 'J%' OR name Like '%y';
+-------+--------+-----+
| name  | gender | age |
+-------+--------+-----+
| Jim   | girl   |  24 |
| Lily  | girl   |  20 |
| Jerry | boy    |  27 |
+-------+--------+-----+
3 rows in set (0.00 sec)

四则运算

运算操作
一字段必须是数值类型

 

 

 


操作查询结果

聚集函数

.MySQL内置数据统计函数

- avg(字段名)  //统计字段平均值

- sum(字段名)  //统计字段之和

- min(字段名)  //统计字段最小值

- max(字段名)  //统计字段最大值

- count(字段名)  //统计字段值个数

mysql> select count("*) from userdb.user;

mysql> select count(name) from userdb.user
        where shell !="/bin/bash” ;


查询结果排序查询结果分组

用法
-SQL查询     order by  字段名  [ asc | desc ];

- asc升序排序
- desc降序排序
通常是数值类型字段
mysql> select  name,uid    from   userdb.user
                order by uid desc;

用法
- SQL查询      group by     字段名;
通常是字符类型字段

mysql> select shell from userdb.user group by shell;
mysql> select shell from userdb.user
   where uid<=1000 group by shell;


查询结果过滤

 

. having用法
- SQL查询     having     条件表达式;
mysql> select name from userdb.user
        having name="bob";
mysql> select name from userdb.user
        where uid> =1000
                         having name="bob";


限制查询结果显示行数

·用法
- SQL查询    limit   数字;  //显示查询结果前多少条记录

- SQL查询    limit   数字1,数字2;  //显示指定范围内的查询记录

一数字1 起始行(0表示第1行)

―数字2总行数

mysql> select name,uid,gid from user limit 3;

mysql> select name.uid,gid from user limit 3,3;

7)按指定的字段排序,ORDER BY

列出stu_info表的所有记录,按年龄排序:

mysql> SELECT * FROM stu_info ORDER BY age;
+-------+--------+-----+
| name  | gender | age |
+-------+--------+-----+
| Lily  | girl   |  20 |
| Tom   | boy    |  21 |
| Jim   | girl   |  24 |
| Jerry | boy    |  27 |
+-------+--------+-----+
4 rows in set (0.00 sec)

因默认为升序(Ascend)排列,所以上述操作等效于:

mysql> SELECT * FROM stu_info ORDER BY age ASC;
+-------+--------+-----+
| name  | gender | age |
+-------+--------+-----+
| Lily  | girl   |  20 |
| Tom   | boy    |  21 |
| Jim   | girl   |  24 |
| Jerry | boy    |  27 |
+-------+--------+-----+
4 rows in set (0.00 sec)

若要按降序(Descend)排列,则将ASC改为DESC即可:

mysql> SELECT * FROM stu_info ORDER BY age DESC;
+-------+--------+-----+
| name  | gender | age |
+-------+--------+-----+
| Jerry | boy    |  27 |
| Jim   | girl   |  24 |
| Tom   | boy    |  21 |
| Lily  | girl   |  20 |
+-------+--------+-----+
4 rows in set (0.00 sec)

8)限制查询结果的输出条数,LIMIT

查询stu_info表的所有记录,只列出前3条:

mysql> SELECT * FROM stu_info LIMIT 3;
+------+--------+-----+
| name | gender | age |
+------+--------+-----+
| Jim  | girl   |  24 |
| Tom  | boy    |  21 |
| Lily | girl   |  20 |
+------+--------+-----+
3 rows in set (0.00 sec)

列出stu_info表中年龄最大的3条学员记录:

mysql> SELECT * FROM stu_info GROUP BY age DESC LIMIT 3;
+-------+--------+-----+
| name  | gender | age |
+-------+--------+-----+
| Jerry | boy    |  27 |
| Jim   | girl   |  24 |
| Tom   | boy    |  21 |
+-------+--------+-----+
3 rows in set (0.00 sec)

9)分组查询结果,GROUP BY

针对stu_info表,按性别分组,分别统计出男、女学员的人数:

mysql> SELECT gender,count(gender) FROM stu_info GROUP BY gender;
+--------+---------------+
| gender | count(gender) |
+--------+---------------+
| boy    |             3 |
| girl   |             2 |
+--------+---------------+
2 rows in set (0.00 sec)

列出查询字段时,可以通过AS关键字来指定显示别名,比如上述操作可改为:

mysql> SELECT gender AS '性别',count(gender) AS '人数'
    -> FROM stu_info GROUP BY gender;
+--------+--------+
| 性别   | 人数   |
+--------+--------+
| boy    |      3 |
| girl   |      2 |
+--------+--------+
2 rows in set (0.00 sec)

查询综合练习题,按要求写出对应查询语句。

1、添加记录编号字段id 在所有字段上方,字段值可以自动增长。

2、显示uid 是四位数的用户的用户名和uid号。

3、显示名字是以字母r 开头 且是以字母d结尾的用户名和uid号。

4、查看gid 小于10的用户使用shell的种类。

5、查看shell不是/bin/bash用户中uid号最大用户名及uid号。

6、统计uid是3位数的用户的个数。

参考答案

1、添加记录编号字段id 在所有字段上方,字段值可以自动增长。

alter  table  userdb.userlist  add  id  int(2) primary key  auto_increment  first;

2、显示uid 是四位数的用户的用户名和uid号。

select  name,uid  from userdb.userlist where uid >=1000 and uid<=9999; 或 select  name,uid  from userdb.userlist where uid  between  1000  and  9999; 或  select  name,uid  from userdb.userlist where uid regexp ‘^....$’;

3、显示名字是以字母r 开头 且是以字母d结尾的用户名和uid号。

select name,uid  from userdb.userlist where  name regexp ‘^r.*d$’;或select user from mysql.user where user regexp '^r' and user regexp 'd$';

4、查看gid 小于10的用户使用shell的种类。

select shell from userdb.userlist where uid<10 group by shell;或Select distinct shell from userdb.userlist where uid<10; 

5、查看shell不是/bin/bash用户中uid号最大用户名及uid号。

select name,uid  from userdb.userlist where shell!=”/bin/bash” order by uid desc limit 1;

6、统计uid是3位数的用户的个数。

select count(name) from userdb.userlist where uid >=100 and uid<=999
posted @ 2022-02-19 18:15  东山有耳  阅读(219)  评论(0)    收藏  举报