MySQL其他篇

目录:

参考网站

1.1 GROUP BY分组使用返回顶部

  1、Group By介绍

      1. GROUP BY 语句根据一个或多个列对结果集进行分组,在分组的列上我们可以使用 COUNT, SUM, AVG,等函数。
      2. 涉及到的操作符:GROUP BY,HAVING,ORDER BY,INNER JOIN,OUT JOIN,AS,UNION。

  2、Group基本使用

CREATE TABLE  user  (
id int(11) NOT NULL,
name char(10) NOT NULL DEFAULT '',
date datetime NOT NULL,
singin tinyint(4) NOT NULL DEFAULT '' COMMENT '登录次数',
PRIMARY KEY ( id )
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

创建表

INSERT INTO user VALUES
('', '小明', '2016-04-22 15:25:33', ''),
('', '小王', '2016-04-20 15:25:47', ''),
('', '小丽', '2016-04-19 15:26:02', ''),
('', '小王', '2016-04-07 15:26:14', ''),
('', '小明', '2016-04-11 15:26:40', ''),
('', '小明', '2016-04-04 15:26:54', '');

向表中插入数据

mysql> # SELECT name, COUNT(*) FROM   user GROUP BY name;
+------+----------+
| name | COUNT(*) |
+------+----------+
| 小丽 | 1 |
| 小明 | 3 |
| 小王 | 2 |
+------+----------+
3 rows in set (0.01 sec)

统计同名的数据有多少条例1

mysql># SELECT name, SUM(singin) as singin_count FROM  user GROUP BY name WITH ROLLUP;
+------+--------------+
| name | singin_count |
+------+--------------+
| 小丽 | 2 |
| 小明 | 7 |
| 小王 | 7 |
| NULL | 16 |
+------+--------------+
4 rows in set (0.00 sec) # WITH ROLLUP 可以实现在分组统计数据基础上再进行相同的统计(SUM,AVG,COUNT…)。
# 按姓名进行分组,再统计每个人登录的次数,其中记录 NULL 表示所有人的登录次数。

按姓名进行分组,再统计每个人登录的次数例2 with rollup

mysql># SELECT coalesce(name, '总数'), SUM(singin) as singin_count FROM  user GROUP BY name WITH ROLLUP;
+------------------------+--------------+
| coalesce(name, '总数') | singin_count |
+------------------------+--------------+
| 小丽 | 2 |
| 小明 | 7 |
| 小王 | 7 |
| 总数 | 16 |
+------------------------+--------------+
4 rows in set (0.00 sec) #1、我们可以使用 coalesce 来设置一个可以取代 NUll 的名称,coalesce 语法:
#2、select coalesce(a,b,c);
#3、参数说明:如果a==null,则选择b;如果b==null,则选择c;如果a!=null,则选择a;如果a b c 都为null ,则返回为null(没意义)。

按姓名进行分组,再统计每个人登录的次数例3 coalesce 来设置一个可以取代 NUll 的名称

mysql> SELECT name, SUM(singin) as singin_count FROM  user GROUP BY name HAVING COUNT(*) >= 2;
+------+--------------+
| name | singin_count |
+------+--------------+
| 小明 | 7 |
| 小王 | 7 |
+------+--------------+
2 rows in set (0.00 sec)

过滤分组HAVING:例4 查找登录次数大于2的所有用户

#1、创建表
create table student(
id int auto_increment,
name char(32) not null,
score int(10) not null,
course char(32) not null,
primary key (id)); #2、插入数据
insert into student(name,score,course) values('zhangsan',88,'english');
insert into student(name,score,course) values('zhangsan',98,'math');
insert into student(name,score,course) values('lisi',88,'math'); #3、查询
mysql> select *,avg(score) from student group by name;
+----+----------+-------+---------+------------+
| id | name | score | course | avg(score) |
+----+----------+-------+---------+------------+
| 4 | lisi | 88 | math | 88.0000 |
| 1 | zhangsan | 88 | english | 93.0000 |
+----+----------+-------+---------+------------+
2 rows in set (0.00 sec)

按学生分组求各科平均成绩例5

mysql># select *,count(name) from user where datediff(NOW(),date)>10 group by name having count(name)>=2;
+----+------+---------------------+--------+-------------+
| id | name | date | singin | count(name) |
+----+------+---------------------+--------+-------------+
| 1 | 小明 | 2016-04-22 15:25:33 | 1 | 3 |
| 2 | 小王 | 2016-04-20 15:25:47 | 3 | 2 |
+----+------+---------------------+--------+-------------+
2 rows in set (0.00 sec) # 原题:请查找商品表中最近30天至少有20天都有销售记录的商品

10天前注册的用户中同名用户大于或等于2的数据例6

1.2 mysql中NOW(),CURDATE(),CURTIME()的使用返回顶部

mysql> SELECT NOW(),CURDATE(),CURTIME();
+---------------------+------------+-----------+
| NOW() | CURDATE() | CURTIME() |
+---------------------+------------+-----------+
| 2018-03-18 16:28:16 | 2018-03-18 | 16:28:16 |
+---------------------+------------+-----------+
1 row in set (0.00 sec)

例1:NOW(),CURDATE(),CURTIME()作用

#1、创建表
CREATE TABLE goods(
id int auto_increment,
name varchar(50) NOT NULL,
date datetime NOT NULL DEFAULT NOW(),
PRIMARY KEY (id)
); #2、插入一条数据
mysql># INSERT INTO goods(name) VALUES ('tea'); #3、验证时间字段会自动插入
mysql># select * from goods;
+----+------+---------------------+
| id | name | date |
+----+------+---------------------+
| 1 | tea | 2018-03-18 16:37:19 |
+----+------+---------------------+
1 row in set (0.00 sec)

例2:在表中定义时间字段自动添加

1.3 DATEDIFF() 函数返回顶部

mysql># SELECT DATEDIFF('2008-11-30','2008-11-22') AS DiffDate;
+----------+
| DiffDate |
+----------+
| 8 |
+----------+
1 row in set (0.00 sec)

例1:返回两个日期之间的天数

#1、创建表
CREATE TABLE goods(
id int auto_increment,
name varchar(50) NOT NULL,
date datetime NOT NULL DEFAULT NOW(),
PRIMARY KEY (id)
); #2、插数据
INSERT INTO goods(name) VALUES ('tea1');
INSERT INTO goods(name) VALUES ('tea2');
INSERT INTO goods(name,date) VALUES ('tea3','2018-03-02 16:37:19');
INSERT INTO goods(name,date) VALUES ('tea4','2015-05-02 16:37:19'); #3、查询五天前的数据
mysql> select * from goods where datediff(NOW(),date)>5;
+----+------+---------------------+
| id | name | date |
+----+------+---------------------+
| 3 | tea3 | 2018-03-02 16:37:19 |
| 4 | tea4 | 2015-05-02 16:37:19 |
+----+------+---------------------+
2 rows in set (0.00 sec) #4、查询最近五天的新数据
mysql> select * from goods where datediff(NOW(),date)<5;
+----+------+---------------------+
| id | name | date |
+----+------+---------------------+
| 1 | tea1 | 2018-03-18 16:56:42 |
| 2 | tea2 | 2018-03-18 16:56:43 |
+----+------+---------------------+
2 rows in set (0.00 sec)

例2:查询最近5天新数据

1.4 DATE_FORMAT() 以不同格式显示时间返回顶部

select
DATE_FORMAT(NOW(),'%Y-%m-%d'),
DATE_FORMAT(NOW(),'%Y-%m-%d %H:%m:%s'); +-------------------------------+----------------------------------------+
| DATE_FORMAT(NOW(),'%Y-%m-%d') | DATE_FORMAT(NOW(),'%Y-%m-%d %H:%m:%s') |
+-------------------------------+----------------------------------------+
| 2018-03-18 | 2018-03-18 17:03:02 |
+-------------------------------+----------------------------------------+
1 row in set (0.00 sec)

DATE_FORMAT基本使用

1.5 MySQL 正则表达式返回顶部

  1、MySQL中常用正则

模式 描述
^ 匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 '\n' 或 '\r' 之后的位置。
$ 匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性,$ 也匹配 '\n' 或 '\r' 之前的位置。
. 匹配除 "\n" 之外的任何单个字符。要匹配包括 '\n' 在内的任何字符,请使用象 '[.\n]' 的模式。
[...] 字符集合。匹配所包含的任意一个字符。例如, '[abc]' 可以匹配 "plain" 中的 'a'。
[^...] 负值字符集合。匹配未包含的任意字符。例如, '[^abc]' 可以匹配 "plain" 中的'p'。
p1|p2|p3 匹配 p1 或 p2 或 p3。例如,'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 则匹配 "zood" 或 "food"。
* 匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等价于{0,}。
+ 匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}。
{n} n 是一个非负整数。匹配确定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o。
{n,m} m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。

   2、MySQL正则使用举例

    1、查找name字段中以'st'为开头的所有数据:
        mysql> SELECT name FROM person_tbl WHERE name REGEXP '^st';

    2、查找name字段中以'ok'为结尾的所有数据:
        mysql> SELECT name FROM person_tbl WHERE name REGEXP 'ok$';

    3、查找name字段中包含'mar'字符串的所有数据:
        mysql> SELECT name FROM person_tbl WHERE name REGEXP 'mar';

    4、查找name字段中以元音字符开头或以'ok'字符串结尾的所有数据:
        mysql> SELECT name FROM person_tbl WHERE name REGEXP '^[aeiou]|ok$';

05: MySQL高级查询的更多相关文章

  1. 第四章 MySQL高级查询(二)

    第四章 MySQL高级查询(二) 一.EXISTS子查询 在执行create 或drop语句之前,可以使用exists语句判断该数据库对像是否存在,返回值是true或false.除此之外,exists ...

  2. 第三章 MySQL高级查询(一)

    第三章 MySQL高级查询(一) 一.SQL语言的四个分类 1.       DML(Data Manipulation Language)(数据操作语言):用来插入,修改和删除表中的数据,如INSE ...

  3. MySQL 高级查询操作

    目录 MySQL 高级查询操作 一.预告 二.简单查询 三.显示筛选 四.存储过程 五.查询语句 1.作为变量 2.函数调用 3.写入数据表 备注 附表一 附表二 相关文献 博客提示 MySQL 高级 ...

  4. python进阶09 MySQL高级查询

    python进阶09 MySQL高级查询 一.筛选条件 # 比较运算符 # 等于:= 不等于:!= 或<> 大于:> 小于:< 大于等于>= 小于等于:<= #空: ...

  5. MySQL高级查询与编程作业目录 (作业笔记)

    MySQL高级查询与编程笔记 • [目录] 第1章 数据库设计原理与实战 >>> 第2章 数据定义和操作 >>> 2.1.4 使用 DDL 语句分别创建仓库表.供应 ...

  6. MySQL高级查询与编程笔记 • 【目录】

    章节 内容 实践练习 MySQL高级查询与编程作业目录(作业笔记) 第1章 MySQL高级查询与编程笔记 • [第1章 数据库设计原理与实战] 第2章 MySQL高级查询与编程笔记 • [第2章 数据 ...

  7. 2.mysql高级查询

    01.SQL高级查询_排序     1.排序语句:order by 排序字段名  asc(默认的-升序) / desc(降序);     2.例如:查询所有服装类商品,将查询结果以价格升序排序:   ...

  8. Day3 MySql高级查询

    DQL高级查询 多表查询(关联查询.连接查询) 1.笛卡尔积 emp表15条记录,dept表4条记录. 连接查询的笛卡尔积为60条记录. 2.内连接 不区分主从表,与连接顺序无关.两张表均满足条件则出 ...

  9. MySQL高级查询 & 事务机制

    1.基础查询where 高级条件查询Where子句 SELECT empno,ename,sal,hiredate FROM t_tmp WHERE deptno=10 AND (sal+IFNULL ...

随机推荐

  1. ubuntu 添加用户到已存在的组

    sudo adduser 用户名 组名   sudo minicom –s 配置 minicom访问ttyUSB0没权限,发现属于dialout 组 james@james-OptiPlex-380: ...

  2. the internal array pointer

    The foreach construct provides an easy way to iterate over arrays. foreach works only on arrays and ...

  3. Python 字典 setdefault() 方法

    描述 Python 字典 setdefault() 方法和 get() 方法类似,返回指定键的值,如果键不在字典中,将会添加键并将值设置为一个指定值,默认为None. get() 和 setdefau ...

  4. 2018/04/03 每日一个Linux命令 之 lastb/last

    今天还在想暴力破解一个服务器是怎么完成的....... -- lastb功能说明:列出登录系统失败的用户相关信息. -- 单独执行 lastb 时候,它会读取/var/log 下的 btmp 文件,输 ...

  5. 2018/03/25 每日一个Linux命令 之 df

    Linux df命令用于显示目前在Linux系统上的文件系统的磁盘使用情况统计. 就像在windows下打开我的电脑一样会统计各个磁盘一样的情况 主要用于查看磁盘空间占用情况 -- [@hong:~] ...

  6. MySQL中死锁

    1 .死锁的概念 是指两个或两个以上的事务在执行过程中,因争夺资源而造成的一种互相等待的现象.若无外力作用,事务都将无法推进下去,解决死锁的最简单问题是不要有等待,任何的等待都转换为回滚,并且事务重新 ...

  7. (c++) int 转 string,char*,const char*和string的相互转换

    一.int 和string的相互转换 1 int 转化为 string c++ //char *itoa( int value, char *string,int radix); // 原型说明: / ...

  8. [原创]nginx添加module之threads

    一.安装nginx yum安装nginx 折叠源码 1 2 3 4 5 6 7 8 9 10 11 12 # 添加nginx源 rpm -ivh http://nginx.org/packages/c ...

  9. java注解使用

    1:定义注解 package chapter20.one; import java.lang.annotation.ElementType; import java.lang.annotation.R ...

  10. python中operator.itemgetter函数

    operator模块提供的itemgetter函数用于获取对象的哪些维的数据,参数为一些序号(即需要获取的数据在对象中的序号),下面看例子. k = [,,] b = ) print(b(k)) #输 ...