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), |