一:MySQL进阶查询
1.常用查询介绍
(1)按关键字排序
使用 SELECT 语句可以将需要的数据从 MySQL 数据库中查询出来。可以使用 ORDER BY 语句来完成排序,并最终将排序后的结果返回给用户。这个语句的排序不光可以针对某一个字段,也可以针对多个字段
执行以下操作可查询等级在 45 级及以上的用户,并以 level降序排列和 id 降序排列
mysql> select id,name,level from t1 where level>=45 order by level desc, id desc;
//ORDER BY A,B desc 指 A 用升序,B 用降序;
//ORDER BY A asc,B desc 指 A 用升序,B 用降序;
//ORDER BY A desc,B desc 指 A 用降序,B 用降序;
(2)对结果进行分组
通过 SQL 查询出来的结果,还可以对其进行分组,使用 GROUP BY 语句来实现。GROUP BY 从字面上看,是以 BY 后面的内容对查询出的数据进行分组,就是将一个“数据集”划分成若干个“小区域”,然后针对这些个“小区域”进行数据处理。GROUP BY 通常都是结合聚合函数一起使用的,常用的聚合函数包括:计数(COUNT)、求和(SUM)、求平均数(AVG)、最大值(MAX)、最小值(MIN),这些聚合函数的用法在后面函数小节会有更详细的讲解。GROUP BY 分组的时候可以按一个或多个字段对结果进行分组处理
执行以下操作即可统计等级在 45 级及以上,以等级为分组,每个等级有多少人
mysql> select count(name),level from t1 where level>=45 group by level;
查询等级在 45 级及以上,按等级进行分组,并将每个等级的人数按降序排序,具体操作如下所示
mysql> select count(name),level from t1 where level>=45 group by level order by count(name) desc;
(3)限制结果条目
在使用 MySQL SELECT 语句进行查询时,结果集返回的是所有匹配的记录。有时候仅需要返回第一行或者前几行,这时候就需要用到 LIMIT 子句
LIMIT 子句是一种简单的分页方法,它的使用减少了数据结果的返回时间,提高了执行效率,也解决了由于数据量过大从而导致的性能问题。执行以下操作即可查询表的前 3 个用户的信息
mysql> select id,name,level from t1 limit 3;
LIMIT 子句的使用也可以结合 ORDER BY:先进行排序,然后再 LIMIT 限制固定的记录。也就是说 LIMIT 是放在最后的,将处理好的结果集按要求选出几行来。将查询记录按等级 level 降序排列,只取前三条记录
mysql> select id,name,level from t1 order by level desc limit 3;
(4)设置别名
在 MySQL 查询时,当表的名字比较长或者表内某些字段比较长时,为了方便书写或者多次使用相同的表,可以给字段列或表设置别名。使用的时候直接使用别名,简洁明了,增强可读性。执行以下操作即可实现用一条 SQL语句完成在创建表 t3 的时候将 t1 表内的数据写入 t3表
mysql> create table t3 as select * from t1;
mysql>select count(*) from t3;
(5)通配符
通常通配符都是跟 LIKE 一起使用的,并协同 WHERE 子句共同来完成查询任务
%:百分号表示零个、一个或多个字符
_:下划线表示单个字符
name 字段中,开头有一个字符,接着是 es 两个字符,后面再跟着零个、一个或多个字符,从 t1 表中查询这样的数据
mysql> select id,name,level from t1 where name like '_es%';
(6)子查询
查询也被称作内查询或者嵌套查询,是指在一个查询语句里面还嵌套着另一个查询语句。子查询语句是先于主查询语句被执行的,其结果作为外层的条件返回给主查询进行下一步的查询过滤。子查询不仅可以在 SELECT 语句中使用,在 INERT、UPDATE、DELETE中也同样适用。在嵌套的时候,子查询内部还可以再次嵌套新的子查询,也就是说可以多层嵌套
子查询还可以用在 INSERT 语句中。子查询的结果集可以通过 INSERT 语句插入到其他的表中。例如,先清空之前使用的 t2 表,然后通过子查询的方式将 t1 的内容插入到 t2 表中。
mysql> truncate table t2;
mysql> select * from t2;
mysql> insert into t2 select * from t1 where id in (select id from t1);
mysql> select * from t2;
2:NULL值
在 SQL 语句使用过程中,经常会碰到 NULL 这几个字符。通常使用 NULL 来表示缺失 的值,也就是在表中该字段是没有值的。如果在创建表时,限制某些字段不为空,则可以使 用 NOT NULL 关键字,不使用则默认可以为空
创建一个表 test,该表包含不设置 NOT NULL 的字段,然后向表中插入不同的 记录值,其中包括 NULL 值和实际有值的记录,最后通过 SELECT 查询字段中包括 NULL 和不包括 NULL 的记录值
CREATE TABLE test (
id int(10) NOT NULL AUTO_INCREMENT,
name varchar(32) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
level int(10) NOT NULL,
coin int(32),
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
//插入的记录中不包括 coin 字段
mysql> insert into test(name,level) values('aa',10);
//插入的记录中包括 coin 字段
mysql>insert into test(name,level,coin) values('ab',20,100);
//查询 coin 字段为空值的记录
mysql>select * from test where coin is null;
//查询 coin 字段不为空的记录
mysql> select * from test where coin is not null;
NULL值和空值有什么区别:
- 空值的长度为 0,不占用空间的;而 NULL 值的长度是 NULL,是占用空间的。
- IS NULL 或者 IS NOT NULL,是用来判断字段是不是为 NULL 或者不是 NULL,不能查出是不是空值的。
- 空值的判断使用=’’或者<>’’来处理。
- 在通过 count()计算有多少记录数时,如果遇到 NULL 值会自动忽略掉,遇到空值会加入到记录中进行计算。
3:正则表达式
-
^str
以什么开始
str$
以什么结尾
. 匹配任何单个字符包括回车换行
[a-z]
匹配在方阔内的任意字符列表
^[a-z]
匹配以什么字符开头的
[^a-z]
匹配不包含方阔内的任意字符列表
p1|p2|p3
匹配任何模式p1,p2,p3
* 0个或多个前面的元素
+
1个或多个前面的元素
?
0个或1个前面的元素
{n}
前面元素连续出现的n个实例
.{n}
前面元素出现的n个实例
{m,n}
匹配前面元素m到n个实例
在 t1 表中查询包含字符串 shir 与 ey,且两个字符串之间只有一个字符的name 字段并打印对应的id、name 和 level 记录
-
mysql>select id,name,level from t1 where name REGEXP 'shir.ey';
4:运算符
-
(1)算术运算符
-
运算符 描述 + 加法 - 减法 * 乘法 / 除法 % 取余数 (2)比较运算符
-
运算符 作用 = 等于 <=> 安全的等于 <>或者!= 不等于 <= 小于等于 >= 大于等于 > 大于 IS NULL 判断一个值是否为空 IS NOT NULL 判断一个值是否不为空 BETWEEN AND 判断一个值是否落在两个值之间 判断某数字是否在一组数字中,也可判断某字符是否在一组字符中
mysql>SELECT 2 in (1,2,3,4,5),'c' not in ('a','b','c');
- IN 判断一个值是否在对应的列表中,如果是返回 1,否则返回 0
- NOT IN 判断一个值是否不在对应的列表中,如果不是返回 1,否则返回 0。
(3)逻辑运算符
- 逻辑非:NOT 或 !
- 逻辑与:AND 或 &&
- 逻辑或 :R 或 ||
- 逻辑异或:XOR
-
(4)位运算符
-
运算符 作用 & 按位与 | 按位或 ^ 按位异或 ! 取反 << 左移 >> 右移 对数字进行按位与、或和取反运算,具体操作如下所示
-
mysql> SELECT 10 & 15, 10 | 15, 10 ^ 15, 5 &~1;
与运算规则:任何一个值为0,则结果就为0 1 & 1=1 1 & 0=0 0 & 0=0
或运算规则:任何一个值为1,则结果就为1 1 | 1 =1 1| 0 =1 0 | 0=0
-
参与^运算的两个二进制位不同时,结果为 1,相同时,结果为 0。
10 ^ 15:10 的补码为 1010,15 的补码为 1111,按位异或运算之后,结果为 0101
5 &~1:由于位取反运算符‘~’的级别高于位与运算符‘&’,因此先对 1 进行取反操作,结果为 63 个‘1’加一个‘0’,然后再与整数 5 进行与运算,结果为 0100,即整数 4。
5:连接查询
MySQL 的连接查询,通常都是将来自两个或多个表的行结合起来,基于这些表之间的共同字段,进行数据的拼接。首先,要确定一个主表作为结果集,然后将其他表的行有选择性的连接到选定的主表结果集上。使用较多的连接查询包括:内连接、左连接和右连接。
(1)内连接
在刚才创建的 a_t1 和 b_t1 表中使用内连接查询出通过判断 a_id 和 b_id 相等,包含在两个表内的部分
mysql>select a_id,a_name,a_level from a_t1 inner join b_t1 on a_id=b_id;
(2)左连接
从a_t1 和 b_t1 表中,查询出 a_t1 表中所有内容,并且查询出通过 a_id 和 b_id 相等判断出的 b_t1 中的部分
mysql>select * from a_t1 a left join b_t1 b on a.a_id=b.b_id;
(3)右连接
从 a_t1 和 b_t1 表中,查询出在 b_t1 表内的所有记录,并且通过判断 a_id 和 b_id 相等,在 a_t1 表内的部分
mysql>select * from a_t1 a right join b_t1 b on a.a_id=b.b_id;
二:数据库函数
1:数学函数
- abs(x) :返回 x 的绝对值
- rand() :返回 0 到 1 的随机数
- mod(x,y) :返回 x 除以 y 以后的余数
- power(x,y) :返回 x 的 y 次方
- round(x) :返回离 x 最近的整数
- round(x,y) :保留 x 的 y 位小数四舍五入后的值
- truncate(x,y) :返回数字 x 截断为 y 位小数的值
- ceil(x) :返回大于或等于 x 的最小整数
- floor(x) :返回小于或等于 x 的最大整数
- least(x1,x2...) :返回集合中最小的值
- sqrt(x) :返回 x 的平方根
- greatest(x1,x2...) :返回集合中最大的值
2:聚合函数
MySQL 数据库函数中专门有一组函数是特意为库内记录求和或者对表中的数据进行集中概括而设计的,这些函数被称作聚合函数。
- avg() :返回指定列的平均值
- count() :返回指定列中非 NULL 值的个数
- min() :返回指定列的最小值
- max() :返回指定列的最大值
- sum(x) :返回指定列的所有值之和
3:字符串函数
length(x) 返回字符串 x 的长度第
trim() 移除字符串两侧的空白字符或其他预定义字符
concat(x,y) 将提供的参数 x 和 y 拼接成一个字符串
upper(x) 将字符串 x 的所有字母变成大写字母
lower(x) 将字符串 x 的所有字母变成小写字母
left(x,y) 返回字符串 x 的前 y 个字符
right(x,y) 返回字符串 x 的后 y 个字符
repeat(x,y) 将字符串 x 重复 y 次
space(x) 返回 x 个空格
replace(x,y,z) 将字符串 z 替代字符串 x 中的字符串 y
strcmp(x,y) 比较 x 和 y,返回的值可以为-1,0,1
substring(x,y,z) 获取从字符串 x 中的第 y 个位置开始长度为 z 的字符串
reverse(x) 将字符串 x 反转
4:日期时间函数
curdate() 返回当前时间的年月日
curtime() 返回当前时间的时分秒
now() 返回当前时间的日期和时间
month(x) 返回日期 x 中的月份值
week(x) 返回日期 x 是年度第几个星期
hour(x) 返回 x 中的小时值
minute(x) 返回 x 中的分钟值
second(x) 返回 x 中的秒钟值
dayofweek(x) 返回 x 是星期几,1 星期日,2 星期一
dayofmonth(x) 计算日期 x 是本月的第几天
dayofyear(x) 计算日期 x 是本年的第几天