本文共 14069 字,大约阅读时间需要 46 分钟。
SQL查询及匹配条件
1建立测试表
1)在test库中创建stu_info表
以root用户登入MySQL服务器:
1.[root@dbsvr1 ~]# mysql -u root -p
2.Enter password:
打开test库:
1.mysql> USE test;
创建stu_info表,包括name、gender、age三个字段:
1.mysql> CREATE TABLE stu_info(
2.-> name varchar(12) NOT NULL,
3.-> gender enum('boy','girl') DEFAULT 'boy',
4.-> age int(3) NOT NULL
5.-> );
6.Query OK, 0 rows affected (0.03 sec)
确认表结构:
1.mysql> DESC stu_info;
2.+--------+--------------------+------+-----+---------+-------+
3.| Field | Type | Null | Key | Default | Extra |
4.+--------+--------------------+------+-----+---------+-------+
5.| name | varchar(12) | NO | | NULL | |
6.| gender | enum('boy','girl') | YES | | boy | |
7.| age | int(3) | NO | | NULL | |
8.+--------+--------------------+------+-----+---------+-------+
9.3 rows in set (0.01 sec)
2)插入记录
1.mysql> INSERT INTO stu_info VALUES
2.-> ('Jim','girl',24),
3.-> ('Tom','boy',21),
4.-> ('Lily','girl',20),
5.-> ('Jerry','boy',27),
6.-> ('Mike','boy',21)
7.-> ;
8.Query OK, 5 rows affected (0.00 sec)
9.Records: 5 Duplicates: 0 Warnings: 0
确认stu_info表的所有记录内容:
1.mysql> SELECT * FROM stu_info;
2.+-------+--------+-----+
3.| name | gender | age |
4.+-------+--------+-----+
5.| Jim | girl | 24 |
6.| Tom | boy | 21 |
7.| Lily | girl | 20 |
8.| Jerry | boy | 27 |
9.| Mike | boy | 21 |
10.+-------+--------+-----+
11.5 rows in set (0.00 sec)
2)常用的表记录统计函数
查询stu_info表一共有多少条记录(本例中为5条):
1.mysql> SELECT count(*) FROM stu_info; 、、查询表中一共有多少条记录
2.+----------+
3.| count(*) |
4.+----------+
5.| 5 |
6.+----------+
7.1 row in set (0.00 sec)
计算stu_info表中各学员的平均年龄、最大年龄、最小年龄:
1.mysql> SELECT avg(age),max(age),min(age) FROM stu_info; 、、计算平均、最大、最小
2.+----------+----------+----------+
3.| avg(age) | max(age) | min(age) |
4.+----------+----------+----------+
5.| 22.6000 | 27 | 20 |
6.+----------+----------+----------+
7.1 row in set (0.03 sec)
计算stu_info表中男学员的个数:
1.mysql> SELECT count(gender) FROM stu_info WHERE gender='boy';
2.+---------------+
3.| count(gender) |
4.+---------------+
5.| 3 |
6.+---------------+
3)字段值的数值比较
列出stu_info表中年龄为21岁的学员记录:
1.mysql> SELECT * FROM stu_info WHERE age=21;
2.+------+--------+-----+
3.| name | gender | age |
4.+------+--------+-----+
5.| Tom | boy | 21 |
6.| Mike | boy | 21 |
7.+------+--------+-----+
8.2 rows in set (0.00 sec)
列出stu_info表中年龄超过21岁的学员记录:
1.mysql> SELECT * FROM stu_info WHERE age>21;
2.+-------+--------+-----+
3.| name | gender | age |
4.+-------+--------+-----+
5.| Jim | girl | 24 |
6.| Jerry | boy | 27 |
7.+-------+--------+-----+
8.2 rows in set (0.00 sec)
列出stu_info表中年龄大于或等于21岁的学员记录:
1.mysql> SELECT * FROM stu_info WHERE age>=21;
2.+-------+--------+-----+
3.| name | gender | age |
4.+-------+--------+-----+
5.| Jim | girl | 24 |
6.| Tom | boy | 21 |
7.| Jerry | boy | 27 |
8.| Mike | boy | 21 |
9.+-------+--------+-----+
10.4 rows in set (0.00 sec)
列出stu_info表中年龄在20岁和24岁之间的学员记录:
1.mysql> SELECT * FROM stu_info WHERE age BETWEEN 20 and 24;
2.+------+--------+-----+
3.| name | gender | age |
4.+------+--------+-----+
5.| Jim | girl | 24 |
6.| Tom | boy | 21 |
7.| Lily | girl | 20 |
8.| Mike | boy | 21 |
9.+------+--------+-----+
10.4 rows in set (0.00 sec)
4)多个条件的组合
列出stu_info表中年龄小于23岁的女学员记录:
1.mysql> SELECT * FROM stu_info WHERE age < 23 AND gender='girl';
2.+------+--------+-----+
3.| name | gender | age |
4.+------+--------+-----+
5.| Lily | girl | 20 |
6.+------+--------+-----+
7.1 row in set (0.00 sec)
列出stu_info表中年龄小于23岁的学员,或者女学员的记录:
1.mysql> SELECT * FROM stu_info WHERE age < 23 OR gender='girl';
2.+------+--------+-----+
3.| name | gender | age |
4.+------+--------+-----+
5.| Jim | girl | 24 |
6.| Tom | boy | 21 |
7.| Lily | girl | 20 |
8.| Mike | boy | 21 |
9.+------+--------+-----+
10.4 rows in set (0.00 sec)
如果某个记录的姓名属于指定范围内的一个,则将其列出:
1.mysql> SELECT * FROM stu_info WHERE name IN
2.-> ('Jim','Tom','Mickey','Minnie');
3.+------+--------+-----+
4.| name | gender | age |
5.+------+--------+-----+
6.| Jim | girl | 24 |
7.| Tom | boy | 21 |
8.+------+--------+-----+
9.2 rows in set (0.00 sec)
5)使用SELECT做数学计算
计算1234与5678的和:
1.mysql> SELECT 1234+5678;
2.+-----------+
3.| 1234+5678 |
4.+-----------+
5.| 6912 |
6.+-----------+
7.1 row in set (0.00 sec)
计算1234与5678的乘积:
1.mysql> SELECT 1234*5678;
2.+-----------+
3.| 1234*5678 |
4.+-----------+
5.| 7006652 |
6.+-----------+
7.1 row in set (0.00 sec)
计算1.23456789除以3的结果:
1.mysql> SELECT 1.23456789/3;
2.+----------------+
3.| 1.23456789/3 |
4.+----------------+
5.| 0.411522630000 |
6.+----------------+
7.1 row in set (0.00 sec)
输出stu_info表各学员的姓名、15年后的年龄:
1.mysql> SELECT name,age+15 FROM stu_info;
2.+-------+--------+
3.| name | age+15 |
4.+-------+--------+
5.| Jim | 39 |
6.| Tom | 36 |
7.| Lily | 35 |
8.| Jerry | 42 |
9.| Mike | 36 |
10.+-------+--------+
11.5 rows in set (0.00 sec)
6)使用模糊查询,LIKE引领
以下划线 _ 匹配单个字符,% 可匹配任意多个字符。
列出stu_info表中姓名以“J”开头的学员记录:
1.mysql> SELECT * FROM stu_info WHERE name LIKE 'J%'; //like 引领模糊查询
2.+-------+--------+-----+
3.| name | gender | age |
4.+-------+--------+-----+
5.| Jim | girl | 24 |
6.| Jerry | boy | 27 |
7.+-------+--------+-----+
8.2 rows in set (0.00 sec)
列出stu_info表中姓名以“J”开头且只有3个字母的学员记录:
1.mysql> SELECT * FROM stu_info WHERE name LIKE 'J__';
2.+------+--------+-----+
3.| name | gender | age |
4.+------+--------+-----+
5.| Jim | girl | 24 |
6.+------+--------+-----+
7)使用正则表达式,REGEXP引领
列出stu_info表中姓名以“J”开头且以“y”结尾的学员记录:
1.mysql> SELECT * FROM stu_info WHERE name REGEXP '^J.*y$';
2.+-------+--------+-----+
3.| name | gender | age |
4.+-------+--------+-----+
5.| Jerry | boy | 27 |
6.+-------+--------+-----+
7.1 row in set (0.00 sec)
效果等同于:
1.mysql> SELECT * FROM stu_info WHERE name Like 'J%y';
2.+-------+--------+-----+
3.| name | gender | age |
4.+-------+--------+-----+
5.| Jerry | boy | 27 |
6.+-------+--------+-----+
7.1 row in set (0.00 sec)
出stu_info表中姓名以“J”开头或者以“y”结尾的学员记录:
1.mysql> SELECT * FROM stu_info WHERE name REGEXP '^J|y$';
2.+-------+--------+-----+
3.| name | gender | age |
4.+-------+--------+-----+
5.| Jim | girl | 24 |
6.| Lily | girl | 20 |
7.| Jerry | boy | 27 |
8.+-------+--------+-----+
9.3 rows in set (0.00 sec)
效果等同于:
1.mysql> SELECT * FROM stu_info WHERE name Like 'J%' OR name Like '%y';
2.+-------+--------+-----+
3.| name | gender | age |
4.+-------+--------+-----+
5.| Jim | girl | 24 |
6.| Lily | girl | 20 |
7.| Jerry | boy | 27 |
8.+-------+--------+-----+
8)按指定的字段排序,ORDER BY
列出stu_info表的所有记录,按年龄排序:
1.mysql> SELECT * FROM stu_info order BY age;
2.+-------+--------+-----+
3.| name | gender | age |
4.+-------+--------+-----+
5.| Lily | girl | 20 |
6.| Tom | boy | 21 |
7.| Jim | girl | 24 |
8.| Jerry | boy | 27 |
9.+-------+--------+-----+
10.4 rows in set (0.00 sec)
因默认为升序(Ascend)排列,所以上述操作等效于:
1.mysql> SELECT * FROM stu_info order BY age ASC;
2.+-------+--------+-----+
3.| name | gender | age |
4.+-------+--------+-----+
5.| Lily | girl | 20 |
6.| Tom | boy | 21 |
7.| Jim | girl | 24 |
8.| Jerry | boy | 27 |
9.+-------+--------+-----+
10.4 rows in set (0.00 sec)
若要按降序(Descend)排列,则将ASC改为DESC即可:
1.mysql> SELECT * FROM stu_info order BY age DESC;
2.+-------+--------+-----+
3.| name | gender | age |
4.+-------+--------+-----+
5.| Jerry | boy | 27 |
6.| Jim | girl | 24 |
7.| Tom | boy | 21 |
8.| Lily | girl | 20 |
9.+-------+--------+-----+
10.4 rows in set (0.00 sec)
9)限制查询结果的输出条数,LIMIT
查询stu_info表的所有记录,只列出前3条:
1.mysql> SELECT * FROM stu_info LIMIT 3;
2.+------+--------+-----+
3.| name | gender | age |
4.+------+--------+-----+
5.| Jim | girl | 24 |
6.| Tom | boy | 21 |
7.| Lily | girl | 20 |
8.+------+--------+-----+
9.3 rows in set (0.00 sec)
列出stu_info表中年龄最大的3条学员记录:
1.mysql> SELECT * FROM stu_info order BY age DESC LIMIT 3;
2.+-------+--------+-----+
3.| name | gender | age |
4.+-------+--------+-----+
5.| Jerry | boy | 27 |
6.| Jim | girl | 24 |
7.| Tom | boy | 21 |
8.+-------+--------+-----+
9.3 rows in set (0.00 sec)
10)分组查询结果,GROUP BY
针对stu_info表,按性别分组,分别统计出男、女学员的人数:
1.mysql> SELECT gender,count(gender) FROM stu_info GROUP BY gender;
2.+--------+---------------+
3.| gender | count(gender) |
4.+--------+---------------+
5.| boy | 3 |
6.| girl | 2 |
7.+--------+---------------+
8.2 rows in set (0.00 sec)
列出查询字段时,可以通过AS关键字来指定显示别名,比如上述操作可改为:
1.mysql> SELECT gender AS '性别',count(gender) AS '人数'
2.-> FROM stu_info GROUP BY gender;
3.+--------+--------+
4.| 性别 | 人数 |
5.+--------+--------+
6.| boy | 3 |
7.| girl | 2 |
8.+--------+--------+
9.2 rows in set (0.00 sec)
2.基于前面的yg_info表,完成相关查询操作
1)确认yg_info表的所有记录,以方便对比查询效果
1.mysql> SELECT * FROM yg_info;
2.+--------+-----------+--------+--------------+-----------+--------------+----------+-----------+
3.| 编号 | 姓名 | 性别 | 入职时间 | 部门 | 电子邮箱 | QQ号码 | 月工资 |
4.+--------+-----------+--------+--------------+-----------+--------------+----------+-----------+
5.| 1 | 张翠山 | 男 | 2010-12-01 | 武当派 | zcs@wdp.com | 50000 | 15000.00 |
6.| 2 | 殷素素 | 女 | 2010-12-25 | 武当派 | yss@wdp.com | 50000 | 12000.00 |
7.| 3 | 张无忌 | 男 | 2013-12-03 | 明教 | zwj@mj.com | 50000 | 18000.00 |
8.| 4 | 郭靖 | 男 | 2008-08-15 | 桃花岛 | gj@thd.com | 50000 | 20000.00 |
9.| 5 | 黄蓉 | 女 | 2008-08-15 | 桃花岛 | hr@thd.com | 50000 | 24000.00 |
10.+--------+-----------+--------+--------------+-----------+--------------+----------+-----------+
11.5 rows in set (0.00 sec)
2)列出yg_info表中月工资低于20000且姓张的员工
1.mysql> SELECT 编号,姓名,性别,部门,月工资 FROM yg_info
2.-> WHERE 月工资<20000 AND 姓名 LIKE '张%';
3.+--------+-----------+--------+-----------+-----------+
4.| 编号 | 姓名 | 性别 | 部门 | 月工资 |
5.+--------+-----------+--------+-----------+-----------+
6.| 1 | 张翠山 | 男 | 武当派 | 15000.00 |
7.| 3 | 张无忌 | 男 | 明教 | 18000.00 |
8.+--------+-----------+--------+-----------+-----------+
9.2 rows in set (0.00 sec)
3)分别统计yg_info表中男、女员工的人数
1.mysql> SELECT 性别,count(性别) AS '人数' FROM yg_info GROUP BY 性别;
2.+--------+--------+
3.| 性别 | 人数 |
4.+--------+--------+
5.| 男 | 3 |
6.| 女 | 2 |
7.+--------+--------+
8.2 rows in set (0.00 sec)
4)其他查询条件操作练习
列出yg_info表中所有员工记录,只看姓名、性别、部门、入职时间、QQ号码:
1.mysql> SELECT 姓名,性别,部门,入职时间,QQ号码 FROM yg_info;
2.+-----------+--------+-----------+--------------+----------+
3.| 姓名 | 性别 | 部门 | 入职时间 | QQ号码 |
4.+-----------+--------+-----------+--------------+----------+
5.| 张翠山 | 男 | 武当派 | 2010-12-01 | 50000 |
6.| 殷素素 | 女 | 武当派 | 2010-12-25 | 50000 |
7.| 张无忌 | 男 | 明教 | 2013-12-03 | 50000 |
8.| 郭靖 | 男 | 桃花岛 | 2008-08-15 | 50000 |
9.| 黄蓉 | 女 | 桃花岛 | 2008-08-15 | 50000 |
10.+-----------+--------+-----------+--------------+----------+
11.5 rows in set (0.00 sec)
列出其中2010年12月20日之后入职的员工记录:
1.mysql> SELECT 姓名,性别,部门,入职时间,QQ号码 FROM yg_info
2.-> WHERE 入职时间>='2010-12-20';
3.+-----------+--------+-----------+--------------+----------+
4.| 姓名 | 性别 | 部门 | 入职时间 | QQ号码 |
5.+-----------+--------+-----------+--------------+----------+
6.| 殷素素 | 女 | 武当派 | 2010-12-25 | 50000 |
7.| 张无忌 | 男 | 明教 | 2013-12-03 | 50000 |
8.+-----------+--------+-----------+--------------+----------+
9.2 rows in set (0.00 sec)
列出其中2010年12月20日之后入职的女员工记录:
1.mysql> SELECT 姓名,性别,部门,入职时间,QQ号码 FROM yg_info
2.-> WHERE 入职时间>='2010-12-20' AND 性别='女';
3.+-----------+--------+-----------+--------------+----------+
4.| 姓名 | 性别 | 部门 | 入职时间 | QQ号码 |
5.+-----------+--------+-----------+--------------+----------+
6.| 殷素素 | 女 | 武当派 | 2010-12-25 | 50000 |
7.+-----------+--------+-----------+--------------+----------+
8.1 row in set (0.00 sec)
5)综合练习1——为武当派的所有员工提薪20%
查看修改前的记录:
1.mysql> SELECT 编号,姓名,性别,部门,月工资 FROM yg_info
2.-> WHERE 部门='武当派';
3.+--------+-----------+--------+-----------+-----------+
4.| 编号 | 姓名 | 性别 | 部门 | 月工资 |
5.+--------+-----------+--------+-----------+-----------+
6.| 1 | 张翠山 | 男 | 武当派 | 15000.00 |
7.| 2 | 殷素素 | 女 | 武当派 | 12000.00 |
8.+--------+-----------+--------+-----------+-----------+
9.2 rows in set (0.00 sec)
月工资增加20%,更新操作:
1.mysql> UPDATE yg_info SET 月工资=月工资*1.20
2.-> WHERE 部门='武当派';
3.Query OK, 2 rows affected (0.01 sec)
4.Rows matched: 2 Changed: 2 Warnings: 0
确认更新后的结果:
1.mysql> SELECT 编号,姓名,性别,部门,月工资 FROM yg_info
2.-> WHERE 部门='武当派';
3.+--------+-----------+--------+-----------+-----------+
4.| 编号 | 姓名 | 性别 | 部门 | 月工资 |
5.+--------+-----------+--------+-----------+-----------+
6.| 1 | 张翠山 | 男 | 武当派 | 18000.00 |
7.| 2 | 殷素素 | 女 | 武当派 | 14400.00 |
8.+--------+-----------+--------+-----------+-----------+
9.2 rows in set (0.00 sec)
6)综合练习2——将武当派的所有员工并入明教
查看修改前的记录:
1.mysql> SELECT 姓名,性别,入职时间,部门 FROM yg_info
2.-> WHERE 部门 REGEXP '武当派|明教';
3.+-----------+--------+--------------+-----------+
4.| 姓名 | 性别 | 入职时间 | 部门 |
5.+-----------+--------+--------------+-----------+
6.| 张翠山 | 男 | 2010-12-01 | 武当派 |
7.| 殷素素 | 女 | 2010-12-25 | 武当派 |
8.| 张无忌 | 男 | 2013-12-03 | 明教 |
9.+-----------+--------+--------------+-----------+
10.3 rows in set (0.00 sec)
修改武当派所有员工的所属“部门”,更新操作:
1.mysql> UPDATE yg_info SET 部门='明教'
2.-> WHERE 部门='武当派';
3.Query OK, 2 rows affected (0.00 sec)
4.Rows matched: 2 Changed: 2 Warnings: 0
确认更新后的结果:
1.mysql> SELECT 姓名,性别,入职时间,部门 FROM yg_info
2.-> WHERE 部门 REGEXP '武当派|明教';
3.+-----------+--------+--------------+--------+
4.| 姓名 | 性别 | 入职时间 | 部门 |
5.+-----------+--------+--------------+--------+
6.| 张翠山 | 男 | 2010-12-01 | 明教 |
7.| 殷素素 | 女 | 2010-12-25 | 明教 |
8.| 张无忌 | 男 | 2013-12-03 | 明教 |
9.+-----------+--------+--------------+--------+
10.3 rows in set (0.00 sec)
7)综合练习3——替换桃花岛所有员工的电子邮箱后缀,改为jianghu.com
替换操作可使用REPLACE(字段,OLD,NEW)函数。
查看修改前的记录:
1.mysql> SELECT 姓名,性别,部门,电子邮箱 FROM yg_info WHERE 部门='桃花岛';
2.+--------+--------+-----------+--------------+
3.| 姓名 | 性别 | 部门 | 电子邮箱 |
4.+--------+--------+-----------+--------------+
5.| 郭靖 | 男 | 桃花岛 | gj@thd.com |
6.| 黄蓉 | 女 | 桃花岛 | hr@thd.com |
7.+--------+--------+-----------+--------------+
8.2 rows in set (0.00 sec)
替换邮箱后缀,更新操作:
1.mysql> UPDATE yg_info SET 电子邮箱=REPLACE(电子邮箱,'thd.com','jianghu.com')
2.-> WHERE 部门='桃花岛';
3.Query OK, 2 rows affected (0.00 sec)
4.Rows matched: 2 Changed: 2 Warnings: 0
确认更新后的结果:
1.mysql> SELECT 姓名,性别,部门,电子邮箱 FROM yg_info
2.-> WHERE 部门='武当派';
3.+--------+--------+-----------+----------------+
4.| 姓名 | 性别 | 部门 | 电子邮箱 |
5.+--------+--------+-----------+----------------+
6.| 郭靖 | 男 | 桃花岛 | gj@jianghu.com |
7.| 黄蓉 | 女 | 桃花岛 | hr@jianghu.com |
8.+--------+--------+-----------+----------------+
9.2 rows in set (0.00 sec)
本文转自Jx战壕 51CTO博客,原文链接:http://blog.51cto.com/xujpxm/1384780,如需转载请自行联系原作者