MYSQL数据库基本操作 - 朽木zidiao

时间:2024-03-02 09:57:29

MYSQL数据库基本操作

1.登录数据库

mysql -u root -p

2.显示数据库

show Databases;

3.选择数据库

use 数据库名称;

4.创建数据库

CREATE DATABASE 数据库名;

5.创建表

CREATE TABLE 表名称(

****

****

);

6.显示选择数据库中的表

show tables;

7.显示数据库表的属性,名称,是否为null,

show columns from 表名称;

8.显示数据库是否存在主键,约束

show index from 表名称;

9.读取数据表

select * from 表名称;

10.初始化表,为表添加数据

INSERT INTO 表名称(字段,字段,字段...) values (值,值,值....);

11.退出数据库

quit  exit;

12.MySQL删除数据库

使用drop 命令删除数据库

drop 命令格式:

  drop database 数据库名称;

MySQL 数据类型

1.数值类型

 

2.日期和时间类型

3.字符串类型

 

 

浮点型(float和double)

 

 

MySQL 创建数据表

语法

CREATE TABLE table_name(column_name column_type);

MySQL删除数据表

语法

DROP TABLE table_name;

MSQ 插入数据

语法

INSERT INTO table_name (field1,filed2.....filedN) VALUES (value1,value2....valueN);

如果数据是字符型,必须使用单引号或者双引号,如:“value”;

MySQL查询数据

MySQL WHERE 字句

我们知道从MySQL表中使用SQL SELECT语句来读取数据

如需有条件地从表中读取数据,可将WHERE字句添加到SELECT语句中

语法:

SELECT field1,field2,...fieldN FROM table_name1,table)name2...

MySQL UPTATE 查询

 如果我们需要修改或更新MySQL中的数据,我们可以使用SQL UPDARE来操作。

语法

实例:

MySQL DELETE 语句

 MySQL LIKE子句

MySQL UNION 操作符

MySQL 排序

MySQL 分组

MySQL连接的使用

 使用MySQL 的JOIN在两个或多个表中查询数据

你可以在select,update和dalete语句中使用Mysql的JOIN来联合多表查询。

JOIN按功能大致分为如下三类:

INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录;

LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的纪录;

RIGTH JOIN(右连接):与LEFT JOIN相反,用于获取右表所有记录,即使左表没有对应的匹配的记录。

MySQL NULL 值处理

我们已经知道MySQL使用SQLSELECT命令及WHERE字句来读取数据表中的数据,但是当提供的查询条件字段为NULL时,该命令可能就无法正常工作。

为了处理这种情况。MySQL提供了三大运算符:

  IS NULL :当列的值是NULL,此运算符返回true

  IS NOT NULL:当列的值不为NULL,运算符返回true

  <=>:比较操作符(不同于=运算符),当比较的两个值为NULL时返回true

关于NULL的条件比较运算符是比较特殊的,你不能使用=NULL或!=NULL 在列中查找NULL值。

在MySQL中,NULL值与任何其它值的比较(即使是NULL)永远返回false 即NULL = NULL 返回false。

MySQL中处理NULL使用IS NULL 和IS NOT NULL 运算符。

MySQL正则表达式

在前面我们了解到MySQL可以通你通过LIKE ...%来进行模糊匹配。

MySQL同样也支持其它正则表达式的匹配,MySQL中使用REGEXP操作符来进行正则表达式匹配。MySQL的正则表达式匹配与这些脚本的类似,下表中的正则模式可应用于REGEXP操作符中。

 MySQL事务

 

 

mysql> use RUNOOB;
Database changed
mysql> CREATE TABLE runoob_transaction_test( id int(5)) engine=innodb;  # 创建数据表
Query OK, 0 rows affected (0.04 sec)
 
mysql> select * from runoob_transaction_test;
Empty set (0.01 sec)
 
mysql> begin;  # 开始事务
Query OK, 0 rows affected (0.00 sec)
 
mysql> insert into runoob_transaction_test value(5);
Query OK, 1 rows affected (0.01 sec)
 
mysql> insert into runoob_transaction_test value(6);
Query OK, 1 rows affected (0.00 sec)
 
mysql> commit; # 提交事务
Query OK, 0 rows affected (0.01 sec)
 
mysql>  select * from runoob_transaction_test;
+------+
| id   |
+------+
| 5    |
| 6    |
+------+
2 rows in set (0.01 sec)
 
mysql> begin;    # 开始事务
Query OK, 0 rows affected (0.00 sec)
 
mysql>  insert into runoob_transaction_test values(7);
Query OK, 1 rows affected (0.00 sec)
 
mysql> rollback;   # 回滚
Query OK, 0 rows affected (0.00 sec)
 
mysql>   select * from runoob_transaction_test;   # 因为回滚所以数据没有插入
+------+
| id   |
+------+
| 5    |
| 6    |
+------+
2 rows in set (0.01 sec)
 
mysql>

MySQL ALTER 命令

当我们需要修改数据表明或修改数据字段,就需要使用到MySQL命令。

 MySQL索引

MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。

打个比方,如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮车。

索引分单列索引和组合索引。单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引。组合索引,即一个索引包含多个列。

创建索引时,你需要确保该索引是应用在 SQL 查询语句的条件(一般作为 WHERE 子句的条件)。

实际上,索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录。

上面都在说使用索引的好处,但过多的使用索引将会造成滥用。因此索引也会有它的缺点:虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。

建立索引会占用磁盘空间的索引文件。

普通索引

创建索引

这是最基本的所有,它没有任何限制,它有一下几种创建方式:

CREATE INDEX indexName ON mytable(username(length)); 

如果是CHAR,VARCHAR类型,length可以小于字段实际长度;如果是BLOB和TEXT类型,必须指定 length。

修改表结构(添加索引)

ALTER table tableName ADD INDEX indexName(columnName)

创建表的时候直接指定

CREATE TABLE mytable(
ID  INT  NOT NULL,
username  VARCHAR(16)  NOT NULL,
INDEX [indexName](username(length))
);

删除索引的语法

DROP INDEX [indexName] ON mytable;

唯一索引

它与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一,它有一下几种创建方式:

创建索引

CREATE UNIQUE INDEX indexName ON mytable(username(length))

修改表结构

ALTER table mytable ADD UNIQUE [indexName](username(length))

创建表的时候直接指定

CREATE TABLE mytable(
ID INT NOT NULL,
username BARCHAR(16) NOT NULL,
UNIQUE [indexName](username(length));

 MySQL临时表

MySQL 临时表在我们需要保存一些临时数据时是非常有用的。临时表只在当前连接可见,当关闭连接时,Mysql会自动删除表并释放所有空间。

临时表在MySQL 3.23版本中添加,如果你的MySQL版本低于 3.23版本就无法使用MySQL的临时表。不过现在一般很少有再使用这么低版本的MySQL数据库服务了。

MySQL临时表只在当前连接可见,如果你使用PHP脚本来创建MySQL临时表,那每当PHP脚本执行完成后,该临时表也会自动销毁。

如果你使用了其他MySQL客户端程序连接MySQL数据库服务器来创建临时表,那么只有在关闭客户端程序时才会销毁临时表,当然你也可以手动销毁。

创建临时表和删除临时表

mysql> CREATE TEMPORARY TABLE SalesSummary (
    -> product_name VARCHAR(50) NOT NULL
    -> , total_sales DECIMAL(12,2) NOT NULL DEFAULT 0.00
    -> , avg_unit_price DECIMAL(7,2) NOT NULL DEFAULT 0.00
    -> , total_units_sold INT UNSIGNED NOT NULL DEFAULT 0
);
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO SalesSummary
    -> (product_name, total_sales, avg_unit_price, total_units_sold)
    -> VALUES
    -> (\'cucumber\', 100.25, 90, 2);

mysql> SELECT * FROM SalesSummary;
+--------------+-------------+----------------+------------------+
| product_name | total_sales | avg_unit_price | total_units_sold |
+--------------+-------------+----------------+------------------+
| cucumber     |      100.25 |          90.00 |                2 |
+--------------+-------------+----------------+------------------+
1 row in set (0.00 sec)
mysql> DROP TABLE SalesSummary;
mysql>  SELECT * FROM SalesSummary;
ERROR 1146: Table \'RUNOOB.SalesSummary\' doesn\'t exist

MySQL复制表

如果我们需要完全的复制MySQL的数据表,包括表的结构,索引,默认值等。 如果仅仅使用CREATE TABLE ... SELECT 命令,是无法实现的。

本章节将为大家介绍如何完整的复制MySQL数据表,步骤如下:

  • 使用 SHOW CREATE TABLE 命令获取创建数据表(CREATE TABLE) 语句,该语句包含了原数据表的结构,索引等。
  • 复制以下命令显示的SQL语句,修改数据表名,并执行SQL语句,通过以上命令 将完全的复制数据表结构。
  • 如果你想复制表的内容,你就可以使用 INSERT INTO ... SELECT 语句来实现。

实例

尝试以下实例来复制表 runoob_tbl 。

步骤一:

获取数据表的完整结构。

mysql> SHOW CREATE TABLE runoob_tbl \G;
*************************** 1. row ***************************
       Table: runoob_tbl
Create Table: CREATE TABLE `runoob_tbl` (
  `runoob_id` int(11) NOT NULL auto_increment,
  `runoob_title` varchar(100) NOT NULL default \'\',
  `runoob_author` varchar(40) NOT NULL default \'\',
  `submission_date` date default NULL,
  PRIMARY KEY  (`runoob_id`),
  UNIQUE KEY `AUTHOR_INDEX` (`runoob_author`)
) ENGINE=InnoDB 
1 row in set (0.00 sec)

ERROR:
No query specified

步骤二:

修改SQL语句的数据表名,并执行SQL语句

mysql> CREATE TABLE `clone_tbl` (
  -> `runoob_id` int(11) NOT NULL auto_increment,
  -> `runoob_title` varchar(100) NOT NULL default \'\',
  -> `runoob_author` varchar(40) NOT NULL default \'\',
  -> `submission_date` date default NULL,
  -> PRIMARY KEY  (`runoob_id`),
  -> UNIQUE KEY `AUTHOR_INDEX` (`runoob_author`)
-> ) ENGINE=InnoDB;
Query OK, 0 rows affected (1.80 sec)

步骤三:

执行完第二步骤后,你将在数据库中创建新的克隆表 clone_tbl。 如果你想拷贝数据表的数据你可以使用 INSERT INTO... SELECT 语句来实现。

mysql> INSERT INTO clone_tbl (runoob_id,
    ->                        runoob_title,
    ->                        runoob_author,
    ->                        submission_date)
    -> SELECT runoob_id,runoob_title,
    ->        runoob_author,submission_date
    -> FROM runoob_tbl;
Query OK, 3 rows affected (0.07 sec)
Records: 3  Duplicates: 0  Warnings: 0

MySQL元数据

你可能想知道MySQL以下三种信息:

  • 查询结果信息: SELECT, UPDATE 或 DELETE语句影响的记录数。
  • 数据库和数据表的信息: 包含了数据库及数据表的结构信息。
  • MySQL服务器信息: 包含了数据库服务器的当前状态,版本号等。

在MySQL的命令提示符中,我们可以很容易的获取以上服务器信息。 但如果使用Perl或PHP等脚本语言,你就需要调用特定的接口函数来获取。 接下来我们会详细介绍。

MySQL序列使用

MySQL 序列是一组整数:1, 2, 3, ...,由于一张数据表只能有一个字段自增主键, 如果你想实现其他字段也实现自动增加,就可以使用MySQL序列来实现。

本章我们将介绍如何使用MySQL的序列。

使用 AUTO_INCREMENT

MySQL 中最简单使用序列的方法就是使用 MySQL AUTO_INCREMENT 来定义列。

实例

以下实例中创建了数据表 insect, insect 表中 id 无需指定值可实现自动增长。

mysql> CREATE TABLE insect
    -> (
    -> id INT UNSIGNED NOT NULL AUTO_INCREMENT,
    -> PRIMARY KEY (id),
    -> name VARCHAR(30) NOT NULL, # type of insect
    -> date DATE NOT NULL, # date collected
    -> origin VARCHAR(30) NOT NULL # where collected
);
Query OK, 0 rows affected (0.02 sec)
mysql> INSERT INTO insect (id,name,date,origin) VALUES
    -> (NULL,\'housefly\',\'2001-09-10\',\'kitchen\'),
    -> (NULL,\'millipede\',\'2001-09-10\',\'driveway\'),
    -> (NULL,\'grasshopper\',\'2001-09-10\',\'front yard\');
Query OK, 3 rows affected (0.02 sec)
Records: 3  Duplicates: 0  Warnings: 0
mysql> SELECT * FROM insect ORDER BY id;
+----+-------------+------------+------------+
| id | name        | date       | origin     |
+----+-------------+------------+------------+
|  1 | housefly    | 2001-09-10 | kitchen    |
|  2 | millipede   | 2001-09-10 | driveway   |
|  3 | grasshopper | 2001-09-10 | front yard |
+----+-------------+------------+------------+
3 rows in set (0.00 sec)

重置序列

如果你删除了数据表中的多条记录,并希望对剩下数据的AUTO_INCREMENT列进行重新排列,那么你可以通过删除自增的列,然后重新添加来实现。 不过该操作要非常小心,如果在删除的同时又有新记录添加,有可能会出现数据混乱。操作如下所示:

mysql> ALTER TABLE insect DROP id;
mysql> ALTER TABLE insect
    -> ADD id INT UNSIGNED NOT NULL AUTO_INCREMENT FIRST,
    -> ADD PRIMARY KEY (id);

设置序列的开始值

一般情况下序列的开始值为1,但如果你需要指定一个开始值100,那我们可以通过以下语句来实现:

mysql> CREATE TABLE insect
    -> (
    -> id INT UNSIGNED NOT NULL AUTO_INCREMENT,
    -> PRIMARY KEY (id),
    -> name VARCHAR(30) NOT NULL, 
    -> date DATE NOT NULL,
    -> origin VARCHAR(30) NOT NULL
)engine=innodb auto_increment=100 charset=utf8;

或者你也可以在表创建成功后,通过以下语句来实现:

mysql> ALTER TABLE t AUTO_INCREMENT = 100;

MySQL处理重复数据

有些 MySQL 数据表中可能存在重复的记录,有些情况我们允许重复数据的存在,但有时候我们也需要删除这些重复的数据。

本章节我们将为大家介绍如何防止数据表出现重复数据及如何删除数据表中的重复数据。


防止表中出现重复数据

你可以在 MySQL 数据表中设置指定的字段为 PRIMARY KEY(主键) 或者 UNIQUE(唯一) 索引来保证数据的唯一性。

如果你想设置表中字段 first_name,last_name 数据不能重复,你可以设置双主键模式来设置数据的唯一性, 如果你设置了双主键,那么那个键的默认值不能为 NULL,可设置为 NOT NULL。如下所示:

CREATE TABLE person_tbl
(
   first_name CHAR(20) NOT NULL,
   last_name CHAR(20) NOT NULL,
   sex CHAR(10),
   PRIMARY KEY (last_name, first_name)
);

如果我们设置了唯一索引,那么在插入重复数据时,SQL 语句将无法执行成功,并抛出错。

INSERT IGNORE INTO 与 INSERT INTO 的区别就是 INSERT IGNORE 会忽略数据库中已经存在的数据,如果数据库没有数据,就插入新的数据,如果有数据的话就跳过这条数据。这样就可以保留数据库中已经存在数据,达到在间隙中插入数据的目的。

以下实例使用了 INSERT IGNORE INTO,执行后不会出错,也不会向数据表中插入重复数据:

1 mysql> INSERT IGNORE INTO person_tbl (last_name, first_name)
2     -> VALUES( \'Jay\', \'Thomas\');
3 Query OK, 1 row affected (0.00 sec)
4 mysql> INSERT IGNORE INTO person_tbl (last_name, first_name)
5     -> VALUES( \'Jay\', \'Thomas\');
6 Query OK, 0 rows affected (0.00 sec)

NSERT IGNORE INTO 当插入数据时,在设置了记录的唯一性后,如果插入重复数据,将不返回错误,只以警告形式返回。 而 REPLACE INTO 如果存在 primary 或 unique 相同的记录,则先删除掉。再插入新记录。

另一种设置数据的唯一性方法是添加一个 UNIQUE 索引,如下所示:

1 CREATE TABLE person_tbl
2 (
3    first_name CHAR(20) NOT NULL,
4    last_name CHAR(20) NOT NULL,
5    sex CHAR(10),
6    UNIQUE (last_name, first_name)
7 );

统计重复数据

以下我们将统计表中 first_name 和 last_name的重复记录数:

1 mysql> SELECT COUNT(*) as repetitions, last_name, first_name
2     -> FROM person_tbl
3     -> GROUP BY last_name, first_name
4     -> HAVING repetitions > 1;

以上查询语句将返回 person_tbl 表中重复的记录数。 一般情况下,查询重复的值,请执行以下操作:

  • 确定哪一列包含的值可能会重复。
  • 在列选择列表使用COUNT(*)列出的那些列。
  • 在GROUP BY子句中列出的列。
  • HAVING子句设置重复数大于1。

过滤重复数据

如果你需要读取不重复的数据可以在 SELECT 语句中使用 DISTINCT 关键字来过滤重复数据。

1 mysql> SELECT DISTINCT last_name, first_name
2     -> FROM person_tbl;

删除重复数据

如果你想删除数据表中的重复数据,你可以使用以下的SQL语句:

mysql> CREATE TABLE tmp SELECT last_name, first_name, sex FROM person_tbl  GROUP BY (last_name, first_name, sex);
mysql> DROP TABLE person_tbl;
mysql> ALTER TABLE tmp RENAME TO person_tbl;

当然你也可以在数据表中添加 INDEX(索引) 和 PRIMAY KEY(主键)这种简单的方法来删除表中的重复记录。方法如下:

mysql> ALTER IGNORE TABLE person_tbl
    -> ADD PRIMARY KEY (last_name, first_name);

MySQL导出导入数据

一、将数据导入到指定的数据库

第一种导入方式:

(linux下和Windows 下语法是一样的,只是路劲的书写方式不同而已)

 1、创建一个空数据库

 2、进入MySQL安装目录bin下

 3、导入命令 mysql  -uroot –p密码 数据库名 <  要导入的表数据(d:\bbs.sql)(将选定的表导入到指定的数据库)

 mysql   -uroot  –padmin  databaseName  <d:\dump.sql         (window)

 mysql   -uroot  –padmin databaseName <  /dump.sql        (Linux

  

               (将备份的整个数据库导入)

             4、导入命令: mysql -u用户名    -p密码    <  要导入的数据库数据

         mysql   -uroot  -padmin       <  d:\dump.sql        (window) 

         mysql   -uroot  -padmin       <  /dump.sql        (linux)  

         (将备份出来的数据库导入,这里没有写数据库名,也可以写但要求是要写同样的名称)

二、从数据库导出数据

第二种方式 使用 : select   into  outfile  :SQL命令如下

(这种格式也是在linux下,window修改路劲书写方式)

   // 将你选中的数据导出到这个指定的目录下
 select  * into  outfile  \'/tmp/bump.txt\'                         
    //  属性使用 逗号分开
 fields terminated  by \',\'                                              
   //    
 optionally   enclosed  by \' " \'                                    
   //  一行结束的标志位换行符
 lines   terminated  by \'\n\'       
   //  这是你要导出的数据库表                               
 from  linuxtest.test2  ; 

MySQL运算符

MySQL的运算符及运算符的优先级,MySQL主要有以下几种运算符:

  算术运算符

  比较运算符

  逻辑运算符

  位运算符

算术运算符

MySQL 支持的算术运算符包括:

运算符作用
+ 加法
- 减法
* 乘法
/ 或 DIV 除法
% 或 MOD 取余

在除法运算和模运算中,如果除数为0,将是非法除数,返回结果为NULL

1、加

mysql> select 1+2;
+-----+
| 1+2 |
+-----+
|   3 |
+-----+

2、减

mysql> select 1-2;
+-----+
| 1-2 |
+-----+
|  -1 |
+-----+

3.乘

mysql> select 2*3;
+-----+
| 2*3 |
+-----+
|   6 |
+-----+

4.除

mysql> select 2/3;
+--------+
| 2/3    |
+--------+
| 0.6667 |
+--------+

5、商

mysql> select 10 DIV 4;
+----------+
| 10 DIV 4 |
+----------+
|        2 |
+----------+

6、取余

mysql> select 10 MOD 4;
+----------+
| 10 MOD 4 |
+----------+
|        2 |
+----------+

比较运算符

SELECT 语句中的条件语句经常要使用比较运算符。通过这些比较运算符,可以判断表中的哪些记录是符合条件的。比较结果为真,则返回 1,为假则返回 0,比较结果不确定则返回 NULL。

符号描述备注
= 等于  
<>, != 不等于  
> 大于  
< 小于  
<= 小于等于  
>= 大于等于  
BETWEEN 在两值之间 >=min&&<=max
NOT BETWEEN 不在两值之间  
IN 在集合中  
NOT IN 不在集合中  
<=> 严格比较两个NULL值是否相等 两个操作码均为NULL时,其所得值为1;而当一个操作码为NULL时,其所得值为0
LIKE 模糊匹配  
REGEXP 或 RLIKE 正则式匹配  
IS NULL 为空  
IS NOT NULL 不为空

1.等于

mysql> select 2=3;
+-----+
| 2=3 |
+-----+
|   0 |
+-----+


mysql> select NULL = NULL;
+-------------+
| NULL = NULL |
+-------------+
|        NULL |
+-------------+

2.不等于

mysql> select 2<>3;
+------+
| 2<>3 |
+------+
|    1 |
+------+

3.安全等于

= 的区别在于当两个操作码均为 NULL 时,其所得值为 1 而不为 NULL,而当一个操作码为 NULL 时,其所得值为 0而不为 NULL。

mysql> select 2<=>3;
+-------+
| 2<=>3 |
+-------+
|     0 |
+-------+


mysql> select null=null;
+-----------+
| null=null |
+-----------+
|      NULL |
+-----------+

        
mysql> select null<=>null;
+-------------+
| null<=>null |
+-------------+
|           1 |
+-------------+

4.小于

mysql> select 2<3;
+-----+
| 2<3 |
+-----+
|   1 |
+-----+

5.小于等于

mysql> select 2<=3;
+------+
| 2<=3 |
+------+
|    1 |
+------+

6.大于

mysql> select 2>3;
+-----+
| 2>3 |
+-----+
|   0 |
+-----+

7.大于等于

mysql> select 2>=3;
+------+
| 2>=3 |
+------+
|    0 |
+------+

8.BETWEEN

mysql> select 5 between 1 and 10;
+--------------------+
| 5 between 1 and 10 |
+--------------------+
|                  1 |
+--------------------+

9.IN

mysql> select 5 in (1,2,3,4,5);
+------------------+
| 5 in (1,2,3,4,5) |
+------------------+
|                1 |
+------------------+

10.NOT IN

mysql> select 5 not in (1,2,3,4,5);
+----------------------+
| 5 not in (1,2,3,4,5) |
+----------------------+
|                    0 |
+----------------------+

11. IS NULL

mysql> select null is NULL;
+--------------+
| null is NULL |
+--------------+
|            1 |
+--------------+

mysql> select \'a\' is NULL;
+-------------+
| \'a\' is NULL |
+-------------+
|           0 |
+-------------+

12.IS NOT NULL

mysql> select null IS NOT NULL;
+------------------+
| null IS NOT NULL |
+------------------+
|                0 |
+------------------+

        
mysql> select \'a\' IS NOT NULL;
+-----------------+
| \'a\' IS NOT NULL |
+-----------------+
|               1 |
+-----------------+

13.LIKE

mysql> select \'12345\' like \'12%\';
+--------------------+
| \'12345\' like \'12%\' |
+--------------------+
|                  1 |
+--------------------+

mysql> select \'12345\' like \'12_\';
+--------------------+
| \'12345\' like \'12_\' |
+--------------------+
|                  0 |
+--------------------+

14.REGEXP

mysql> select \'beijing\' REGEXP \'jing\';
+-------------------------+
| \'beijing\' REGEXP \'jing\' |
+-------------------------+
|                       1 |
+-------------------------+

mysql> select \'beijing\' REGEXP \'xi\';
+-----------------------+
| \'beijing\' REGEXP \'xi\' |
+-----------------------+
|                     0 |
+-----------------------+

逻辑运算符

逻辑运算符用来判断表达式的真假。如果表达式是真,结果返回 1。如果表达式是假,结果返回 0。

运算符号作用
NOT 或 ! 逻辑非
AND 逻辑与
OR 逻辑或
XOR 逻辑异或

1.与

mysql> select 2 and 0;
+---------+
| 2 and 0 |
+---------+
|       0 |
+---------+

        
mysql> select 2 and 1;   
+---------+     
| 2 and 1 |      
+---------+      
|       1 |      
+---------+

2.或

mysql> select 2 or 0;
+--------+
| 2 or 0 |
+--------+
|      1 |
+--------+

mysql> select 2 or 1;
+--------+
| 2 or 1 |
+--------+
|      1 |
+--------+

mysql> select 0 or 0;
+--------+
| 0 or 0 |
+--------+
|      0 |
+--------+

mysql> select 1 || 0;
+--------+
| 1 || 0 |
+--------+
|      1 |
+--------+

3.非

mysql> select not 1;
+-------+
| not 1 |
+-------+
|     0 |
+-------+

mysql> select !0;
+----+
| !0 |
+----+
|  1 |
+----+

4.异或

mysql> select 1 xor 1;
+---------+
| 1 xor 1 |
+---------+
|       0 |
+---------+

mysql> select 0 xor 0;
+---------+
| 0 xor 0 |
+---------+
|       0 |
+---------+

mysql> select 1 xor 0;
+---------+
| 1 xor 0 |
+---------+
|       1 |
+---------+

mysql> select null or 1;
+-----------+
| null or 1 |
+-----------+
|         1 |
+-----------+

mysql> select 1 ^ 0;
+-------+
| 1 ^ 0 |
+-------+
|     1 |
+-------+

位运算符

位运算符是在二进制数上进行计算的运算符。位运算会先将操作数变成二进制数,进行位运算。然后再将计算结果从二进制数变回十进制数。

运算符号作用
& 按位与
| 按位或
^ 按位异或
! 取反
<< 左移
>> 右移

1.按位与

mysql> select 3&5;
+-----+
| 3&5 |
+-----+
|   1 |
+-----+

2.按位或

mysql> select 3|5;
+-----+
| 3|5 |
+-----+
|   7 |
+-----+

3.按位异或

mysql> select 3^5;
+-----+
| 3^5 |
+-----+
|   6 |
+-----+

4.按位取反

mysql> select ~18446744073709551612;
+-----------------------+
| ~18446744073709551612 |
+-----------------------+
|                     3 |
+-----------------------+

5.按位右移

mysql> select 3>>1;
+------+
| 3>>1 |
+------+
|    1 |
+------+

6.按位左移

mysql> select 3<<1;
+------+
| 3<<1 |
+------+
|    6 |
+------+

 

 

MySQL 函数

MySQL 有很多内置的函数,以下列出了这些函数的说明。


MySQL 字符串函数

函数描述实例
ASCII(s) 返回字符串 s 的第一个字符的 ASCII 码。

返回 CustomerName 字段第一个字母的 ASCII 码:

SELECT ASCII(CustomerName) AS NumCodeOfFirstChar
FROM Customers;
CHAR_LENGTH(s) 返回字符串 s 的字符数

返回字符串 RUNOOB 的字符数

SELECT CHAR_LENGTH("RUNOOB") AS LengthOfString;
CHARACTER_LENGTH(s) 返回字符串 s 的字符数

返回字符串 RUNOOB 的字符数

SELECT CHARACTER_LENGTH("RUNOOB") AS LengthOfString;
CONCAT(s1,s2...sn) 字符串 s1,s2 等多个字符串合并为一个字符串

合并多个字符串

SELECT CONCAT("SQL ", "Runoob ", "Gooogle ", "Facebook") AS ConcatenatedString;
CONCAT_WS(x, s1,s2...sn) 同 CONCAT(s1,s2,...) 函数,但是每个字符串直接要加上 x,x 可以是分隔符

合并多个字符串,并添加分隔符:

SELECT CONCAT_WS("-", "SQL", "Tutorial", "is", "fun!")AS ConcatenatedString;
FIELD(s,s1,s2...) 返回第一个字符串 s 在字符串列表(s1,s2...)中的位置

返回字符串 c 在列表值中的位置:

SELECT FIELD("c", "a", "b", "c", "d", "e");
FIND_IN_SET(s1,s2) 返回在字符串s2中与s1匹配的字符串的位置

返回字符串 c 在指定字符串中的位置:

SELECT FIND_IN_SET("c", "a,b,c,d,e");
FORMAT(x,n) 函数可以将数字 x 进行格式化 "#,###.##", 将 x 保留到小数点后 n 位,最后一位四舍五入。

格式化数字 "#,###.##" 形式:

SELECT FORMAT(250500.5634, 2);     -- 输出 250,500.56
INSERT(s1,x,len,s2) 字符串 s2 替换 s1 的 x 位置开始长度为 len 的字符串

从字符串第一个位置开始的 6 个字符替换为 runoob:

SELECT INSERT("google.com", 1, 6, "runnob");  -- 输出:runoob.com
LOCATE(s1,s) 从字符串 s 中获取 s1 的开始位置

获取 b 在字符串 abc 中的位置:

SELECT LOCATE(\'st\',\'myteststring\');  -- 5

返回字符串 abc 中 b 的位置:

SELECT LOCATE(\'b\', \'abc\') -- 2
LCASE(s) 将字符串 s 的所有字母变成小写字母

字符串 RUNOOB 转换为小写:

SELECT LOWER(\'RUNOOB\') -- runoob
LEFT(s,n) 返回字符串 s 的前 n 个字符

返回字符串 runoob 中的前两个字符:

SELECT LEFT(\'runoob\',2) -- ru
LOWER(s) 将字符串 s 的所有字母变成小写字母

字符串 RUNOOB 转换为小写:

SELECT LOWER(\'RUNOOB\') -- runoob
LPAD(s1,len,s2) 在字符串 s1 的开始处填充字符串 s2,使字符串长度达到 len

将字符串 xx 填充到 abc 字符串的开始处:

SELECT LPAD(\'abc\',5,\'xx\') -- xxabc
LTRIM(s) 去掉字符串 s 开始处的空格

去掉字符串 RUNOOB开始处的空格:

SELECT LTRIM("    RUNOOB") AS LeftTrimmedString;-- RUNOOB
MID(s,n,len) 从字符串 s 的 start 位置截取长度为 length 的子字符串,同 SUBSTRING(s,n,len)

从字符串 RUNOOB 中的第 2 个位置截取 3个 字符:

SELECT MID("RUNOOB", 2, 3) AS ExtractString; -- UNO
POSITION(s1 IN s) 从字符串 s 中获取 s1 的开始位置

返回字符串 abc 中 b 的位置:

SELECT POSITION(\'b\' in \'abc\') -- 2
REPEAT(s,n) 将字符串 s 重复 n 次

将字符串 runoob 重复三次:

SELECT REPEAT(\'runoob\',3) -- runoobrunoobrunoob
REPLACE(s,s1,s2) 将字符串 s2 替代字符串 s 中的字符串 s1

将字符串 abc 中的字符 a 替换为字符 x:

SELECT REPLACE(\'abc\',\'a\',\'x\') --xbc
REVERSE(s) 将字符串s的顺序反过来

将字符串 abc 的顺序反过来:

SELECT REVERSE(\'abc\') -- cba
RIGHT(s,n) 返回字符串 s 的后 n 个字符

返回字符串 runoob 的后两个字符:

SELECT RIGHT(\'runoob\',2) -- ob
RPAD(s1,len,s2) 在字符串 s1 的结尾处添加字符串 s2,使字符串的长度达到 len

将字符串 xx 填充到 abc 字符串的结尾处:

SELECT RPAD(\'abc\',5,\'xx\') -- abcxx
RTRIM(s) 去掉字符串 s 结尾处的空格

去掉字符串 RUNOOB 的末尾空格:

SELECT RTRIM("RUNOOB     ") AS RightTrimmedString;   -- RUNOOB
SPACE(n) 返回 n 个空格

返回 10 个空格:

SELECT SPACE(10);
STRCMP(s1,s2) 比较字符串 s1 和 s2,如果 s1 与 s2 相等返回 0 ,如果 s1>s2 返回 1,如果 s1<s2 返回 -1

比较字符串:

SELECT STRCMP("runoob", "runoob");  -- 0
SUBSTR(s, start, length) 从字符串 s 的 start 位置截取长度为 length 的子字符串

从字符串 RUNOOB 中的第 2 个位置截取 3个 字符:

SELECT SUBSTR("RUNOOB", 2, 3) AS ExtractString; -- UNO
SUBSTRING(s, start, length) 从字符串 s 的 start 位置截取长度为 length 的子字符串

从字符串 RUNOOB 中的第 2 个位置截取 3个 字符:

SELECT SUBSTRING("RUNOOB", 2, 3) AS ExtractString; -- UNO
SUBSTRING_INDEX(s, delimiter, number) 返回从字符串 s 的第 number 个出现的分隔符 delimiter 之后的子串。
如果 number 是正数,返回第 number 个字符左边的字符串。
如果 number 是负数,返回第(number 的绝对值(从右边数))个字符右边的字符串。
SELECT SUBSTRING_INDEX(\'a*b\',\'*\',1) -- a
SELECT SUBSTRING_INDEX(\'a*b\',\'*\',-1)    -- b
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(\'a*b*c*d*e\',\'*\',3),\'*\',-1)    -- c
TRIM(s) 去掉字符串 s 开始和结尾处的空格

去掉字符串 RUNOOB 的首尾空格:

SELECT TRIM(\'    RUNOOB    \') AS TrimmedString;
UCASE(s) 将字符串转换为大写

将字符串 runoob 转换为大写:

SELECT UCASE("runoob"); -- RUNOOB
UPPER(s) 将字符串转换为大写

将字符串 runoob 转换为大写:

SELECT UPPER("runoob"); -- RUNOOB

MySQL 数字函数

函数名描述实例
ABS(x) 返回 x 的绝对值  

返回 -1 的绝对值:

SELECT ABS(-1) -- 返回1
ACOS(x) 求 x 的反余弦值(参数是弧度)
SELECT ACOS(0.25);
ASIN(x) 求反正弦值(参数是弧度)
SELECT ASIN(0.25);
ATAN(x) 求反正切值(参数是弧度)
SELECT ATAN(2.5);
ATAN2(n, m) 求反正切值(参数是弧度)
SELECT ATAN2(-0.8, 2);
AVG(expression) 返回一个表达式的平均值,expression 是一个字段

返回 Products 表中Price 字段的平均值:

SELECT AVG(Price) AS AveragePrice FROM Products;
CEIL(x) 返回大于或等于 x 的最小整数 
SELECT CEIL(1.5) -- 返回2
CEILING(x) 返回大于或等于 x 的最小整数 
SELECT CEIL(1.5) -- 返回2
COS(x) 求余弦值(参数是弧度)
SELECT COS(2);
COT(x) 求余切值(参数是弧度)
SELECT COT(6);
COUNT(expression) 返回查询的记录总数,expression 参数是一个字段或者 * 号

返回 Products 表中 products 字段总共有多少条记录:

SELECT COUNT(ProductID) AS NumberOfProducts FROM Products;
DEGREES(x) 将弧度转换为角度  
SELECT DEGREES(3.1415926535898) -- 180
n DIV m 整除,n 为被除数,m 为除数

计算 10 除于 5:

SELECT 10 DIV 5;  -- 2
EXP(x) 返回 e 的 x 次方  

计算 e 的三次方:

SELECT EXP(3) -- 20.085536923188
FLOOR(x) 返回小于或等于 x 的最大整数  

小于或等于 1.5 的整数:

SELECT FLOOR(1.5) -- 返回1
GREATEST(expr1, expr2, expr3, ...) 返回列表中的最大值

返回以下数字列表中的最大值:

SELECT GREATEST(3, 12, 34, 8, 25); -- 34

返回以下字符串列表中的最大值:

SELECT GREATEST("Google", "Runoob", "Apple");   -- Runoob
LEAST(expr1, expr2, expr3, ...) 返回列表中的最小值

返回以下数字列表中的最小值:

SELECT LEAST(3, 12, 34, 8, 25); -- 3

返回以下字符串列表中的最小值:

SELECT LEAST("Google", "Runoob", "Apple");   -- Apple
LN 返回数字的自然对数

返回 2 的自然对数:

SELECT LN(2);  -- 0.6931471805599453
LOG(x) 返回自然对数(以 e 为底的对数)  
SELECT LOG(20.085536923188) -- 3
LOG10(x) 返回以 10 为底的对数  
SELECT LOG10(100) -- 2
LOG2(x) 返回以 2 为底的对数

返回以 2 为底 6 的对数:

SELECT LOG2(6);  -- 2.584962500721156
MAX(expression) 返回字段 expression 中的最大值

返回数据表 Products 中字段 Price 的最大值:

SELECT MAX(Price) AS LargestPrice FROM Products;
MIN(expression) 返回字段 expression 中的最小值

返回数据表 Products 中字段 Price 的最小值:

SELECT MIN(Price) AS LargestPrice FROM Products;
MOD(x,y) 返回 x 除以 y 以后的余数 

5 除于 2 的余数:

SELECT MOD(5,2) -- 1
PI() 返回圆周率(3.141593)  
SELECT PI() --3.141593
POW(x,y) 返回 x 的 y 次方 

2 的 3 次方:

SELECT POW(2,3) -- 8
POWER(x,y) 返回 x 的 y 次方 

2 的 3 次方:

SELECT POWER(2,3) -- 8
RADIANS(x) 将角度转换为弧度  

180 度转换为弧度:

SELECT RADIANS(180) -- 3.1415926535898
RAND() 返回 0 到 1 的随机数  
SELECT RAND() --0.93099315644334
ROUND(x) 返回离 x 最近的整数
SELECT ROUND(1.23456) --1
SIGN(x) 返回 x 的符号,x 是负数、0、正数分别返回 -1、0 和 1 
SELECT SIGN(-10) -- (-1)
SIN(x) 求正弦值(参数是弧度)  
SELECT SIN(RADIANS(30)) -- 0.5
SQRT(x) 返回x的平方根  

25 的平方根:

SELECT SQRT(25) -- 5
SUM(expression) 返回指定字段的总和

计算 OrderDetails 表中字段 Quantity 的总和:

SELECT SUM(Quantity) AS TotalItemsOrdered FROM OrderDetails;
TAN(x) 求正切值(参数是弧度)
SELECT TAN(1.75);  -- -5.52037992250933
TRUNCATE(x,y) 返回数值 x 保留到小数点后 y 位的值(与 ROUND 最大的区别是不会进行四舍五入)
SELECT TRUNCATE(1.23456,3) -- 1.234

MySQL 日期函数

函数名描述实例
ADDDATE(d,n) 计算起始日期 d 加上 n 天的日期
SELECT ADDDATE("2017-06-15", INTERVAL 10 DAY);
->2017-06-25
ADDTIME(t,n) 时间 t 加上 n 秒的时间
SELECT ADDTIME(\'2011-11-11 11:11:11\', 5)
->2011-11-11 11:11:16 (秒)
CURDATE() 返回当前日期
SELECT CURDATE();
-> 2018-09-19
CURRENT_DATE() 返回当前日期
SELECT CURRENT_DATE();
-> 2018-09-19
CURRENT_TIME 返回当前时间
SELECT CURRENT_TIME();
-> 19:59:02
CURRENT_TIMESTAMP() 返回当前日期和时间
SELECT CURRENT_TIMESTAMP()
-> 2018-09-19 20:57:43
CURTIME() 返回当前时间
SELECT CURTIME();
-> 19:59:02
DATE() 从日期或日期时间表达式中提取日期值
SELECT DATE("2017-06-15");    
-> 2017-06-15
DATEDIFF(d1,d2) 计算日期 d1->d2 之间相隔的天数
SELECT DATEDIFF(\'2001-01-01\',\'2001-02-02\')
-> -32
DATE_ADD(d,INTERVAL expr type) 计算起始日期 d 加上一个时间段后的日期
SELECT ADDDATE(\'2011-11-11 11:11:11\',1)
-> 2011-11-12 11:11:11    (默认是天)

SELECT ADDDATE(\'2011-11-11 11:11:11\', INTERVAL 5 MINUTE)
-> 2011-11-11 11:16:11 (TYPE的取值与上面那个列出来的函数类似)
DATE_FORMAT(d,f) 按表达式 f的要求显示日期 d
SELECT DATE_FORMAT(\'2011-11-11 11:11:11\',\'%Y-%m-%d %r\')
-> 2011-11-11 11:11:11 AM
DATE_SUB(date,INTERVAL expr type) 函数从日期减去指定的时间间隔。

Orders 表中 OrderDate 字段减去 2 天:

SELECT OrderId,DATE_SUB(OrderDate,INTERVAL 2 DAY) AS OrderPayDate
FROM Orders
DAY(d) 返回日期值 d 的日期部分
SELECT DAY("2017-06-15");  
-> 15
DAYNAME(d) 返回日期 d 是星期几,如 Monday,Tuesday
SELECT DAYNAME(\'2011-11-11 11:11:11\')
->Friday
DAYOFMONTH(d) 计算日期 d 是本月的第几天
SELECT DAYOFMONTH(\'2011-11-11 11:11:11\')
->11
DAYOFWEEK(d) 日期 d 今天是星期几,1 星期日,2 星期一,以此类推
SELECT DAYOFWEEK(\'2011-11-11 11:11:11\')
->6
DAYOFYEAR(d) 计算日期 d 是本年的第几天
SELECT DAYOFYEAR(\'2011-11-11 11:11:11\')
->315
EXTRACT(type FROM d) 从日期 d 中获取指定的值,type 指定返回的值。
type可取值为:
  • MICROSECOND
  • SECOND
  • MINUTE
  • HOUR
  • DAY
  • WEEK
  • MONTH
  • QUARTER
  • YEAR
  • SECOND_MICROSECOND
  • MINUTE_MICROSECOND
  • MINUTE_SECOND
  • HOUR_MICROSECOND
  • HOUR_SECOND
  • HOUR_MINUTE
  • DAY_MICROSECOND
  • DAY_SECOND
  • DAY_MINUTE
  • DAY_HOUR
  • YEAR_MONTH
SELECT EXTRACT(MINUTE FROM \'2011-11-11 11:11:11\') 
-> 11
FROM_DAYS(n) 计算从 0000 年 1 月 1 日开始 n 天后的日期
SELECT FROM_DAYS(1111)
-> 0003-01-16
HOUR(t) 返回 t 中的小时值
SELECT HOUR(\'1:2:3\')
-> 1
LAST_DAY(d) 返回给给定日期的那一月份的最后一天
SELECT LAST_DAY("2017-06-20");
-> 2017-06-30
LOCALTIME() 返回当前日期和时间
SELECT LOCALTIME()
-> 2018-09-19 20:57:43
LOCALTIMESTAMP() 返回当前日期和时间
SELECT LOCALTIMESTAMP()
-> 2018-09-19 20:57:43
MAKEDATE(year, day-of-year) 基于给定参数年份 year 和所在年中的天数序号 day-of-year 返回一个日期
SELECT MAKEDATE(2017, 3);
-> 2017-01-03
MAKETIME(hour, minute, second) 组合时间,参数分别为小时、分钟、秒
SELECT MAKETIME(11, 35, 4);
-> 11:35:04
MICROSECOND(date) 返回日期参数所对应的毫秒数
SELECT MICROSECOND("2017-06-20 09:34:00.000023");
-> 23
MINUTE(t) 返回 t 中的分钟值
SELECT MINUTE(\'1:2:3\')
-> 2
MONTHNAME(d) 返回日期当中的月份名称,如 Janyary
SELECT MONTHNAME(\'2011-11-11 11:11:11\')
-> November
MONTH(d) 返回日期d中的月份值,1 到 12
SELECT MONTH(\'2011-11-11 11:11:11\')
->11
NOW() 返回当前日期和时间
SELECT NOW()
-> 2018-09-19 20:57:43
PERIOD_ADD(period, number) 为 年-月 组合日期添加一个时段
SELECT PERIOD_ADD(201703, 5);   
-> 201708
PERIOD_DIFF(period1, period2) 返回两个时段之间的月份差值
SELECT PERIOD_DIFF(201710, 201703);
-> 7
QUARTER(d) 返回日期d是第几季节,返回 1 到 4
SELECT QUARTER(\'2011-11-11 11:11:11\')
-> 4
SECOND(t) 返回 t 中的秒钟值
SELECT SECOND(\'1:2:3\')
-> 3
SEC_TO_TIME(s) 将以秒为单位的时间 s 转换为时分秒的格式
SELECT SEC_TO_TIME(4320)
-> 01:12:00
STR_TO_DATE(string, format_mask) 将字符串转变为日期
SELECT STR_TO_DATE("August 10 2017", "%M %d %Y");
-> 2017-08-10
SUBDATE(d,n) 日期 d 减去 n 天后的日期
SELECT SUBDATE(\'2011-11-11 11:11:11\', 1)
->2011-11-10 11:11:11 (默认是天)
SUBTIME(t,n) 时间 t 减去 n 秒的时间
SELECT SUBTIME(\'2011-11-11 11:11:11\', 5)
->2011-11-11 11:11:06 (秒)
SYSDATE() 返回当前日期和时间
SELECT SYSDATE()
-> 2018-09-19 20:57:43
TIME(expression) 提取传入表达式的时间部分
SELECT TIME("19:30:10");
-> 19:30:10
TIME_FORMAT(t,f) 按表达式 f 的要求显示时间 t
SELECT TIME_FORMAT(\'11:11:11\',\'%r\')
11:11:11 AM
TIME_TO_SEC(t) 将时间 t 转换为秒
SELECT TIME_TO_SEC(\'1:12:00\')
-> 4320
TIMEDIFF(time1, time2) 计算时间差值
SELECT TIMEDIFF("13:10:11", "13:10:10");
-> 00:00:01
TIMESTAMP(expression, interval) 单个参数时,函数返回日期或日期时间表达式;有2个参数时,将参数加和
SELECT TIMESTAMP("2017-07-23",  "13:10:11");
-> 2017-07-23 13:10:11
TO_DAYS(d) 计算日期 d 距离 0000 年 1 月 1 日的天数
SELECT TO_DAYS(\'0001-01-01 01:01:01\')
-> 366
WEEK(d) 计算日期 d 是本年的第几个星期,范围是 0 到 53
SELECT WEEK(\'2011-11-11 11:11:11\')
-> 45
WEEKDAY(d) 日期 d 是星期几,0 表示星期一,1 表示星期二
SELECT WEEKDAY("2017-06-15");
-> 3
WEEKOFYEAR(d) 计算日期 d 是本年的第几个星期,范围是 0 到 53
SELECT WEEKOFYEAR(\'2011-11-11 11:11:11\')
-> 45
YEAR(d) 返回年份
SELECT YEAR("2017-06-15");
-> 2017
YEARWEEK(date, mode) 返回年份及第几周(0到53),mode 中 0 表示周天,1表示周一,以此类推
SELECT YEARWEEK("2017-06-15");
-> 201724

MySQL 高级函数

函数名描述实例
BIN(x) 返回 x 的二进制编码

15 的 2 进制编码:

SELECT BIN(15); -- 1111
BINARY(s) 将字符串 s 转换为二进制字符串
SELECT BINARY "RUNOOB";
-> RUNOOB
CASE expression
    WHEN condition1 THEN result1
    WHEN condition2 THEN result2
   ...
    WHEN conditionN THEN resultN
    ELSE result
END
CASE 表示函数开始,END 表示函数结束。如果 condition1 成立,则返回 result1, 如果 condition2 成立,则返回 result2,当全部不成立则返回 result,而当有一个成立之后,后面的就不执行了。
SELECT CASE 
  WHEN 1 > 0
  THEN \'1 > 0\'
  WHEN 2 > 0
  THEN \'2 > 0\'
  ELSE \'3 > 0\'
  END
->1 > 0
CAST(x AS type) 转换数据类型

字符串日期转换为日期:

SELECT CAST("2017-08-29" AS DATE);
-> 2017-08-29
COALESCE(expr1, expr2, ...., expr_n) 返回参数中的第一个非空表达式(从左向右)
SELECT COALESCE(NULL, NULL, NULL, \'runoob.com\', NULL, \'google.com\');
-> runoob.com
CONNECTION_ID() 返回服务器的连接数
SELECT CONNECTION_ID();
-> 4292835
CONV(x,f1,f2) 返回 f1 进制数变成 f2 进制数
SELECT CONV(15, 10, 2);
-> 1111
CONVERT(s USING cs) 函数将字符串 s 的字符集变成 cs
SELECT CHARSET(\'ABC\')
->utf-8    

SELECT CHARSET(CONVERT(\'ABC\' USING gbk))
->gbk
CURRENT_USER() 返回当前用户
SELECT CURRENT_USER();
-> guest@%
DATABASE() 返回当前数据库名
SELECT DATABASE();   
-> runoob
IF(expr,v1,v2) 如果表达式 expr 成立,返回结果 v1;否则,返回结果 v2。
SELECT IF(1 > 0,\'正确\',\'错误\')    
->正确
IFNULL(v1,v2) 如果 v1 的值不为 NULL,则返回 v1,否则返回 v2。
SELECT IFNULL(null,\'Hello Word\')
->Hello Word
ISNULL(expression) 判断表达式是否为 NULL
SELECT ISNULL(NULL);
->1
LAST_INSERT_ID() 返回最近生成的 AUTO_INCREMENT 值
SELECT LAST_INSERT_ID();
->6
NULLIF(expr1, expr2) 比较两个字符串,如果字符串 expr1 与 expr2 相等 返回 NULL,否则返回 expr1
SELECT NULLIF(25, 25);
->
SESSION_USER() 返回当前用户
SELECT SESSION_USER();
-> guest@%
SYSTEM_USER() 返回当前用户
SELECT SYSTEM_USER();
-> guest@%
USER() 返回当前用户
SELECT USER();
-> guest@%
VERSION() 返回数据库的版本号
SELECT VERSION()
-> 5.6.34

需求:将数据库中每分钟一条的数据表,从 9:30 取到 22:00 ,以半小时为单位汇总,并输出 Excel。

数据表字段:id(序号)、incount(计数)、cdate(数据时间)

表名:m_temp

难点:时间处理

解决办法:使用 DATE_FORMAT、CONCAT、Date、Hour、Minute、Floor 函数将时间处理成半小时,在将这段时间的数据查询时 输出 cdate 统一变为  09:30,然后在 group by cdate ,用 sum(incount)求和。

1.处理时间:

示例:2018-08-21 09:30:00   至 2018-08-21 22:00:00

第一个半小时 09:30 至 10:00

将这段时间的数据查询时 输出 cdate 统一变为 09:30,然后在 group by cdate ,sum(incount)

将分钟取出 /30  , 0-29 分结果为 0 ,30-59分结果为 1 再乘以 30 分钟即变为 00 或者 30

date(cdate),取出年月日;

hour(cdate),取出小时;

minute(cdate),取出分钟;

计算(minute(cdate))/30 )*30,结果为 0 或30;

floor( (minute(cdate))/30 )*30), 处理成整数;

concat(date(cdate),\' \',hour(cdate),\':\',floor( (minute(cdate))/30 )*30) ,按照日期格式进行拼接

DATE_FORMAT( concat(date(cdate),\' \',hour(cdate),\':\',floor( minute(cdate)/30 )*30+12) ,\'%Y-%m-%d %H:%i\') ,转换成date类型

完整 SQL:

select sum(incount),dataStartTime from (
select incount, DATE_FORMAT( concat(date(cdate),\' \',hour(cdate),\':\',floor( minute(cdate)/30 )*30+12) ,\'%Y-%m-%d %H:%i\')  as dataStartTime   
 from m_temp WHERE cdate>=\'2018-08-21 09:30\' and cdate<=\'2018-08-21 22:00\'  ORDER BY dataStartTime
) a
group by DATE_FORMAT( dataStartTime ,\'%Y-%m-%d %H:%i\')
into outfile(\'c:/2018-08-21Data.xls\');