MySql_11 表中数据的查询
首先我们准备一点数据
1、创建数据库cms
| 1 | CREATE DATABASE IF NOT EXISTS cms DEFAULT CHARACTER SET utf8; | 
2、创建管理员表cms_admin并插入几条数据
| 1 | CREATE TABLE cms_admin( | 
| 1 | INSERT cms_admin(username,password,email,role) VALUES('admin','admin','admin@qq.com',2); | 
3、创建分类表cms_cate并插入数据
| 1 | CREATE TABLE cms_cate( | 
| 1 | INSERT cms_cate(cateName,cateDesc) VALUES('国内新闻','聚焦当今最热的国内新闻'), | 
4、创建新闻表cms_news并插入数据
| 1 | CREATE TABLE cms_news( | 
| 1 | INSERT cms_news(title,content,pubTime,cId,aId) VALUES('亚航客机失联搜救尚无线索 未发求救信号','马来西亚亚洲航空公司一架搭载155名乘客的客机28日早晨从印度尼西亚飞往新加坡途中与空中交通控制塔台失去联系,下落不明。',1419818808,1,2), | 
5、创建省份表provinces并插入数据
| 1 | CREATE TABLE provinces( | 
| 1 | INSERT provinces(proName) VALUES('北京'), | 
6、创建用户表cms_user并插入数据
| 1 | CREATE TABLE cms_user( | 
| 1 | INSERT cms_user(username,password,regTime,proId) | 
数据准备结束
1、查询记录
单标查询的完整语句:
| 1 | SELECT select_expr [, select_expr ...] | 
2、查询表达式
- 每一个表达式表示想要的一列,必须至少有一列,多个列之间以逗号分隔
- *表示所有列,- tbl_name.*可以表示命名表的所有列
- 查询表达式可以使用[AS]alias_name为其赋予别名
比如我们只查询cms_admin表中的id和username:
| 1 | mysql> SELECT id,username FROM cms_admin; | 
测试给表名起别名,一般为表名缩写,建议不超过2个字母:
| 1 | mysql> SELECT id,username FROM cms_admin AS a; | 
此时我们的表名+字段名的写法就可以用别名来写:
| 1 | SELECT cms_admin.id, cms_admin.username FROM cms_admin; | 
测试给字段起别名:
| 1 | mysql> SELECT id AS '编号',username AS '用户名',email AS '邮箱',role '角色' FROM cms_admin; | 
3.WHERE 条件
| 查询条件 | 符号 | 
|---|---|
| 比较 | +、<、<=、>、>=、!=、<>、!>、!<、<=> | 
| 指定范围 | BETWEEN AND、NOT BETWEEN AND | 
| 指定集合 | IN、NOT IN | 
| 匹配字符 | LIKE、NOT LIKE | 
| 是否为控制 | IS NULL、IS NOT NULL | 
| 多个查询条件 | AND、OR | 
然后我们单个测试一下:
| 1 | mysql> # 查询编号为1的用户 | 
<=>与=是同样的意思,但是<=>可以检测值为NULL的字段,我们先加入一个可以为空的age字段,然后插入一条数据,分别用两种方式查询一下:
| 1 | mysql> ALTER TABLE cms_user ADD age TINYINT UNSIGNED DEFAULT 18; | 
我们还有另一种方式来检测是否为空:
| 1 | SELECT * FROM cms_user WHERE age IS NULL; | 
如果我们查询编号在3~10之间的学员可以这样使用:
| 1 | mysql> SELECT * FROM cms_user WHERE id BETWEEN 3 AND 10; | 
相反的如果想查出不在3~10之间的数据可以这样写:
| 1 | SELECT * FROM cms_user WHERE id NOT BETWEEN 3 AND 10; | 
查询指定数据(集合)的方法:
| 1 | mysql> SELECT * FROM cms_user WHERE id IN(1,3,5,7,9,11,13,100); | 
模糊查询:
- %:代表0个1个或多个任意字符
- _:代表1个任意字符
查询名字在包含张的用户
| 1 | mysql> SELECT * FROM cms_user WHERE username LIKE '%张%'; | 
查询用户名为三位的用户:
| 1 | mysql> SELECT * FROM cms_user WHERE username LIKE '___'; | 
多条件查询 :
查询用户名为sing且密码为sing的用户:
| 1 | mysql> SELECT * FROM cms_user WHERE username='sing' AND password='sing'; | 
4、GROUP BY查询结果分组
按照用户所属省份分组:
| 1 | mysql> SELECT * FROM cms_user GROUP BY proId; | 
| 1 | # 如果出现以下错误: | 
由上面的查询结果可以看出,把我们查询的结果分为了5组,但是并不知道每组有多少数据,现在我们增加一个字段性别sex,并给各条数据赋值后按性别查询分组:
| 1 | mysql> ALTER TABLE cms_user ADD sex ENUM('男','女','保密'); | 
我们可以使用一下命令来实现多字段分组:
| 1 | mysql> SELECT * FROM cms_user GROUP BY sex,proId; | 
此时首先会以sex分为三组,然后在每个组内按proId分组,但是我们怎么显示每个分组的数量?
GROUP_CONCAT
| 1 | mysql> SELECT id,sex,GROUP_CONCAT(username) FROM cms_user GROUP BY sex; | 
我们通过GROUP_CONCAT+字段名可以看到详细的用户名组;
聚合函数
- COUNT() 不统计NULL值
- MAX()
- MIN()
- AVG()
- SUM()
更新一下我们的年龄字段,然后使用这些函数测试
| 1 | UPDATE cms_user SET age=11 WHERE id=1; | 
| 1 | mysql> SELECT id,sex,GROUP_CONCAT(username), | 
先得我们得到分组的详情,然后我们配合使用WITH ROLLUP来进行筛选输出:
| 1 | mysql> SELECT id,sex, | 
我们可以看到最后一行,id为以上列表中最大的一条,totalUsers为以上列表中的总和,max_age为以上列表的最大值,min_age为以上列表的最小值,sum_age为以上列表的总和。
5、HAVING子句
通过HAVING子句对分组结果进行二次筛选(只能配合分组使用,否则无效)。
查询性别,用户名详情,组中总人数,最大年龄,年龄总和:
| 1 | mysql> SELECT sex,GROUP_CONCAT(username) AS users, | 
此时查询出三组,然后保密一组人数为2,我们用HAVING条件过滤掉组中人数大于2的:
| 1 | mysql> SELECT sex,GROUP_CONCAT(username) AS users, | 
再查询一下,组中人数大于2,且最大年龄最大年龄小于60:
| 1 | mysql> SELECT sex,GROUP_CONCAT(username) AS users, | 
6、ORDER BY 排序
降序排列DESC,默认的是升序ASC
| 1 | mysql> SELECT * FROM cms_user ORDER BY id DESC; | 
又年龄升序,id降序:
| 1 | mysql> SELECT * FROM cms_user ORDER BY age ASC,id DESC; | 
实现随机提取记录:
| 1 | mysql> SELECT * FROM cms_user ORDER BY RAND(); | 
6、LIMIT限制查询结果显示条数
1、LIMIT 显示条数(对于查询结果进行限制)
查询表中前3条记录
| 1 | mysql> SELECT * FROM cms_user LIMIT 3; | 
2、LIMIT 偏移量,显示条数
通过该命令可以实现分页,偏移量从0开始,例如,去第五条开始的五条数据:
| 1 | mysql> SELECT * FROM cms_user LIMIT 5,5; | 
到此,查询语句基本完成。
最后演示一下查询的全部条件语句:
| 1 | SELECT id,sex,age,GROUP_CONCAT(username), |