mysql sql命令语句

  • Post author:
  • Post category:mysql



MySQL 官网


sql 是对大小写不敏感的

SQL 使用

1,安装,配置

2,navicat安装使用

+,命令行启动/关闭:

1,启动:net start mysql

2,关闭; net stop mysql

-- 函数
-- 查看mysql 版本
select version()
-- null值判断
select column1, ifnull(column2, column2为null时的默认值) from table-name;
-- 转义字符
select * from table-name where column1 like "\_%"; # 查询字段第一个字符为_的数据
-- 指定转义字符 escape
select * from table-name where column1 like "@_%" escape "@";

数据库 数据表语句

-- 显示数据库
show databases;
-- 显示数据表
show tables;
-- 使用数据库
use database-name;
-- 查询数据表结构
show columns from table-name;
-- 查询表的索引
show index from table-name;
-- 查询数据库中所有表的性能和统计信息
show table status from database-name;
-- 查询数据库中匹配的表的性能和统计信息
show table status from database-name like '%some like%';
-- 查询数据库中所有表的性能和统计信息,结果以列的方式打印 
show table status from database-name \G;
-- 显示表结构
desc table-name;
-- 查看创建表的语句
show create table table-name;
-- 创建数据库
create database database-name;
-- 删除数据库
drop database database-name;
-- 创建表
create table if not exists table-name (column_name column_type, column_name column_type, ...);
-- 删除表
drop table if exists table-name;
-- 清空表数据,保留表结构
trancate table table-name;

-- 修改表
alter table table-name add/drop/modify/change column column-name column-type column-约束;
-- 在最前面添加字段
alter table table-name add column-name column-type first;
-- 在某一个字段后面添加字段
alter table table-name add column-name column-type after old-column-name;
-- 默认自增字段从1开始 ,修改自增字段初始值
alter table table-name auto_increment=xx

-- 表名重命名
ALTER TABLE table_name RENAME TO new_table_name;

-- 复制表结构
create table new_table_name like table-name;
-- 复制表内全部数据,新建一个表
create table new_table_name select * from table-name;
-- 复制部分表结构
create table new_tbale_name select column1, column2,... from teble-name where conditon1 = condition2 # 条件不满足时,只有结构复制


数值类型


MySQL支持多种数据类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型

MySQL支持所有标准SQL数值数据类型。

这些类型包括严格数值数据类型(INTEGER、SMALLINT、DECIMAL和NUMERIC),以及近似数值数据类型(FLOAT、REAL和DOUBLE PRECISION)。

关键字INT是INTEGER的同义词,关键字DEC是DECIMAL的同义词。

BIT数据类型保存位字段值,并且支持MyISAM、MEMORY、InnoDB和BDB表。

作为SQL标准的扩展,MySQL也支持整数类型TINYINT、MEDIUMINT和BIGINT。下面的表显示了需要的每个整数类型的存储和范围。

类型 大小 范围(有符号) 范围(无符号) 用途
TINYINT 1 byte (-128,127) (0,255) 小整数值
SMALLINT 2 bytes (-32 768,32 767) (0,65 535) 大整数值
MEDIUMINT 3 bytes (-8 388 608,8 388 607) (0,16 777 215) 大整数值
INT或INTEGER 4 bytes (-2 147 483 648,2 147 483 647) (0,4 294 967 295) 大整数值
BIGINT 8 bytes (-9,223,372,036,854,775,808,9 223 372 036 854 775 807) (0,18 446 744 073 709 551 615) 极大整数值
FLOAT 4 bytes (-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) 0,(1.175 494 351 E-38,3.402 823 466 E+38) 单精度

浮点数值
DOUBLE 8 bytes (-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 双精度

浮点数值
DECIMAL 对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2 依赖于M和D的值 依赖于M和D的值 小数值

日期和时间类型

表示时间值的日期和时间类型为DATETIME、DATE、TIMESTAMP、TIME和YEAR。

每个时间类型有一个有效值范围和一个”零”值,当指定不合法的MySQL不能表示的值时使用”零”值。

TIMESTAMP类型有专有的自动更新特性,将在后面描述。

类型 大小

( bytes)
范围 格式 用途
DATE 3 1000-01-01/9999-12-31 YYYY-MM-DD 日期值
TIME 3 ‘-838:59:59’/’838:59:59’ HH:MM:SS 时间值或持续时间
YEAR 1 1901/2155 YYYY 年份值
DATETIME 8 1000-01-01 00:00:00/9999-12-31 23:59:59 YYYY-MM-DD HH:MM:SS 混合日期和时间值
TIMESTAMP 4

1970-01-01 00:00:00/2038

结束时间是第

2147483647

秒,北京时间

2038-1-19 11:14:07

,格林尼治时间 2038年1月19日 凌晨 03:14:07

YYYYMMDD HHMMSS 混合日期和时间值,时间戳

字符串类型

字符串类型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。该节描述了这些类型如何工作以及如何在查询中使用这些类型。

类型 大小 用途
CHAR 0-255 bytes 定长字符串
VARCHAR 0-65535 bytes 变长字符串
TINYBLOB 0-255 bytes 不超过 255 个字符的二进制字符串
TINYTEXT 0-255 bytes 短文本字符串
BLOB 0-65 535 bytes 二进制形式的长文本数据
TEXT 0-65 535 bytes 长文本数据
MEDIUMBLOB 0-16 777 215 bytes 二进制形式的中等长度文本数据
MEDIUMTEXT 0-16 777 215 bytes 中等长度文本数据
LONGBLOB 0-4 294 967 295 bytes 二进制形式的极大文本数据
LONGTEXT 0-4 294 967 295 bytes 极大文本数据


注意

:char(n) 和 varchar(n) 中括号中 n 代表字符的个数,并不代表字节个数,比如 CHAR(30) 就可以存储 30 个字符。

CHAR 和 VARCHAR 类型类似,但它们保存和检索的方式不同。它们的最大长度和是否尾部空格被保留等方面也不同。在存储或检索过程中不进行大小写转换。

BINARY 和 VARBINARY 类似于 CHAR 和 VARCHAR,不同的是它们包含二进制字符串而不要非二进制字符串。也就是说,它们包含字节字符串而不是字符字符串。这说明它们没有字符集,并且排序和比较基于列值字节的数值值。

BLOB 是一个二进制大对象,可以容纳可变数量的数据。有 4 种 BLOB 类型:TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB。它们区别在于可容纳存储范围不同。

有 4 种 TEXT 类型:TINYTEXT、TEXT、MEDIUMTEXT 和 LONGTEXT。对应的这 4 种 BLOB 类型,可存储的最大长度不同,可根据实际情况选择。


-- 插入数据,指定字段插入
insert into table-name (field1, field2, ...) values (value1, value2, ...);
-- 插入数据根据字段顺序插入
insert into table-name values (value1, value2, ...);
-- 插入从其他表内查找到的数据
insert info table-name (field1, field2, ...) select (field1, field2, ...) from table-name2 where condition;
-- 如果表内存在数据忽略插入
insert ignore into table-name values(field1, field2, ...);


-- 查询表内的所有数据
select * from table-name;
-- 查询表内指定字段的数据
select column1, column2 from table-name;
-- 根据条件查找数据;
select * from table-name where id > 10;
select * from table-name where create_time=NOW();
select * from table-name where name like "%张三%";
-- 限制查询数量
select * from table-name limit 10;
select * from table-name where id>100 limit 10;
-- 分页 使用offset -- page_size:每页大小, page_offset:排除前几条数据
select * from table-name limit page_size offset page_offset

-- 查询数据 where查询条件默认不区分大小写
select * from table-name where name="test"; -- 查询出name=TEST/test/Test/teST...
-- 查询数据 指定where条件 大小写
select * from table-name where binary name='test'; -- 值查询处name=test的数据

-- 去重
select distinct column1, distinct column2 from table-name; 


-- 直接处理非表内数据  例如:统计“10,A,B” 内的逗号个数
-- 下面语句的解释:将逗号替换为空字符串 然后统计字符串前后的个数差 就是逗号的个数
select (char_length("10,A,B") - char_length(replace("10,A,B", ",", ""))) as nums


-- 修改指定字段的所有数据
update table-name set column1=value1, column2=value2;
-- 修改符合条件的指定字段的数据
update table-name set column1=value1, column2=value2 where condition=...;
-- 将某个int类型的字段数据修改
update table-name set age=age+1 where name='张三';
-- 替换指定字段指定数据的值
update table-name set column_name=replace(column_name, 'old_column_value', 'new_column_value');

-- 删除表内所有数据
delete from table-name;
-- 删除表内符合条件的数据
delete from table-name where codition=...;
-- 执行的速度上,drop>truncate>delete


-- 模糊匹配like,和 % _ 一起使用
-- % 匹配一个或多个字符
select * from table-name where name like "张%"; -- 查询姓张的所有人的信息
-- _为匹配单个字符
select * from table-name where name like "张_"; -- 查询姓张 名字里只有一个字的所有人的信息
select * from table-name where nema like "_三_"; -- 查询姓名为三个字,并且中间的字为三的所有人的信息


-- 排序, 默认为正序asc排列
select * from table-name order by age;
select * from table-name order by age asc;
-- 排序,根据某个字段倒叙排序
select * from table-name order by age desc;
-- 条件排序
select * from table-name where name like "张%" order by age desc;

-- 多条件 和and
select * from table-name where id=1 and name like "_三_";
-- 多条件 或 or  注意:通过or查询出来的结果是去重后的结果要想不去重就要使用union all链接两侧select查询
select * from table-name where id=1 or name='李四';

-- 拼音排序:如果字符集采用的是 utf8(万国码),需要先对字段进行转码然后排序
select * from table-name order by counvert(column_name usering gbk);

-- group by 指定多个列对结果集进行分组
select age, class from table-name group by class, age;
-- group by...with rollup  对分组数据进行汇总。一般和ifnull(column, default value)配置使用
select ifnull(age, '年龄'), ifnull(class, '班级') from table_name group by class, age with rollup


-- 内连接,获取两个表中字段匹配关系的记录
-- 内连接,查询两个表内某些字段数据一致的信息
select a.column1, a.column2, b.column1 from table-a as a inner join table-b as b on a.name = b.name and a.age = b.age;
-- 内连接,查询符合条件的数据
select a.column1, a.column2, b.column1 from table-a a, table-b b where a.name = b.name;


-- 左连接,获取左表所有记录,即使右表没有对应匹配的记录
-- 左连接,读取左表的所有数据,和右表内字段一直的/即使右表字段无数据
select a.column1. a.column2, b.column1 from table-left a left join table-right b on a.name = b.name;

-- 右连接,用于获取右表所有记录,即使左表没有对应匹配的记录
-- 右链接,读取右表所有数据,和左表匹配的数据/即使坐标字段五数据
select a.column1, b.column1 from table-left a right join table-right b on a.name = b.name;

-- 外连接,获取两个表内所有的记录,没有匹配上的字段为null
select a.colimn1, b.column2 from table-a outer join table-b on tablea.column-a = tableb.colimn-b;



-- 空值处理
select * from table-name where column1 is null;
select * from table-name where column1 is not null;

连接查询

-- 内连接
select column1, column2, from table-1, table2 where table-1.column-x = table-1.column-x;
-- 内连接-等值连接
select a.column1, b.column1 from table-1 a 【inner】 join tatble-2 b on a.column-x=b.column-x;
-- 内连接-非等值连接
select a.column1, b.column1 from table-1 a 【inner】 join table-2 b on a.column-x between b.column-a and b.column-b;
-- 自连接
select a.column1, b.column2 from table-1 a 【inner】 join table-1 b on a.column-a=b.column-a;


-- 外连接
-- 外连接-左连接:左边为主表,没有匹配值的时候显示 NULL
select a.column1, b.column2 from table-1 a left join table-2 b on a.column-a=b.column-b;

-- 外连接-右链接:右边为主表,没有匹配值的时候显示 NULL
select a.column1, b.column2 from table-1 a right join table-2 b on a.column-a=b.column-b;

-- 交叉连接: 只显示匹配的行
select a.column1, b.column2 from table-1 a cross join table-2 b on a.column-a=b.column-b;

-- 子查询: 出现在其他语句(增删改查)中的查询语句
select column1 from (select a.column1, b.column2 from table-1 a cross join table-2 b on a.column-x=b.column-x) as a;
/*
子查询分类--按照结果集的行列数分:
    标量子查询(结果集只有一行一列)
    列子查询(结果集只有一列)
    行子查询(结果集只有一行)
    表子查询(结果集为多行多列)
子查询分类--按照出现的位置分:
    select:
        仅支持标量子查询
    from:
        表子查询
    where/hving:
        标量子查询
        行子查询
        列子查询
    exists:
        表子查询
*/


联合查询

-- 联合查询:将多个查询语句使用 union 连接
select * from table where ... union select * from table where ...;
/*
两条查询语句的查询字段必须一致;
两条查询语句的查询字段数量必须一致;
union  默认去重;
要使结果显示两个表里所有的查询结果,可以使用union  all  
*/


条件判断操作符

操作符 描述 实例
= 等号,检测两个值是否相等,如果相等返回true (A = B) 返回false。
<>, != 不等于,检测两个值是否相等,如果不相等返回true (A != B) 返回 true。
> 大于号,检测左边的值是否大于右边的值, 如果左边的值大于右边的值返回true (A > B) 返回false。
< 小于号,检测左边的值是否小于右边的值, 如果左边的值小于右边的值返回true (A < B) 返回 true。
>= 大于等于号,检测左边的值是否大于或等于右边的值, 如果左边的值大于或等于右边的值返回true (A >= B) 返回false。
<= 小于等于号,检测左边的值是否小于或等于右边的值, 如果左边的值小于或等于右边的值返回true (A <= B) 返回 true。



MySQL 的 WHERE 子句的字符串比较是不区分大小写的。


查询语句指定顺序

  1. FROM, including JOINs
  2. WHERE
  3. GROUP BY
  4. HAVING
  5. WINDOW functions
  6. SELECT
  7. DISTINCT
  8. UNION
  9. ORDER BY
  10. LIMIT and OFFSET

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, "runoob");  -- 输出: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 LCASE('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 的 n 位置截取长度为 len 的子字符串,同 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

这里加一个 group_concat 拼接一组数据

select dept_no, group_concat(emp_no) as employees
from dept_emp 
group by dept_no
-- 分隔符默认为逗号 ,
-- 指定分隔符如下
select dept_no, group_concat(emp_no SEPARATOR "*") as employees
from dept_emp 
group by dept_no

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 CEILING(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 返回数字的自然对数,以 e 为底。

返回 2 的自然对数:

SELECT LN(2);  -- 0.6931471805599453
LOG(x) 或 LOG(base, x) 返回自然对数(以 e 为底的对数),如果带有 base 参数,则 base 为指定带底数。
SELECT LOG(20.085536923188) -- 3
SELECT LOG(2, 4); -- 2
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 MinPrice 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 日期函数

-- 这里加一个 时间比较 ,函数返回根据不同时间计算的差值。
-- 比如timestampdiff(minute,'2021-01-01 10:00:00', '2021-01-01 10:10:39') 返回的是开始时间和结束时间相差10分钟
timestampdiff(second/minute/hour/day/month/year,starttime,endtime)

-- 毫秒级时间戳
select REPLACE(unix_timestamp(current_timestamp(3)),'.','');
-- 秒级时间戳
select UNIX_TIMESTAMP(NOW());
函数名 描述 实例
ADDDATE(d,n) 计算起始日期 d 加上 n 天的日期
SELECT ADDDATE("2017-06-15", INTERVAL 10 DAY);
->2017-06-25
ADDTIME(t,n) n 是一个时间表达式,时间 t 加上时间表达式 n

加 5 秒:

SELECT ADDTIME('2011-11-11 11:11:11', 5);
->2011-11-11 11:11:16 (秒)

添加 2 小时, 10 分钟, 5 秒:

SELECT ADDTIME("2020-06-15 09:34:21", "2:10:5"); 
-> 2020-06-15 11:44:26
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 加上一个时间段后的日期,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 DATE_ADD("2017-06-15", INTERVAL 10 DAY);    
-> 2017-06-25

SELECT DATE_ADD("2017-06-15 09:34:21", INTERVAL 15 MINUTE);
-> 2017-06-15 09:49:21

SELECT DATE_ADD("2017-06-15 09:34:21", INTERVAL -3 HOUR);
->2017-06-15 06:34:21

SELECT DATE_ADD("2017-06-15 09:34:21", INTERVAL -3 HOUR);
->2017-04-15
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) 返回日期当中的月份名称,如 November
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() 返回唯一的连接 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

算术运算符

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

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

比较运算符

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。如果表达式是假,结果返回 0。

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

位运算符

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

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



+,约束

1,主键(非空唯一): primary key

2,无符号: unsigned

3,自动递增: auto_increment

4,查

+查询顺序:

Select *

From

Join

Where

Group

Order

Limit

+,分组

group by 字段名,字段名;

分组后数据筛选:select * from 表名 group by 字段名 ,字段名 having 条件,聚合函数;

+,聚合函数(不能再where后面)

count()

max()

min()

avg()

sum()

+,排序

order by 字段 asc,字段desc;

中文排序;order by convert(字段名 using gbk);

+,获取部分行:

select * from 表名 limit 起始位置(默认从0开始),个数;

+,分页: select * from 表名 limit (n-1)*m,m

+,使用 UNION 对两个查询结果取并集  查询的字段可以不一样,但是查询的字段数量要一样(A和B是两个字段, C和D是两个字段)

select columnA, columnB from table1 union select solumnC, columnD from table2;

1,内连接

select * from 表1 inner join 表2 on 表1.字段=表2.字段 where 条件;

2,左连接(匹配不到的显示null)

select * from 表1 left join 表2 on 表1.字段=表2.字段 where 条件

3,右连接(匹配不到的显示null)

select * from 表1 right join 表2 on 表1.字段=表2.字段 where 条件

4,自关联(表名必须起别名)

select * from 表1 inner join 表1 as 别名 on 表1.字段=别名.字段 where 条件

5,子查询

select * from 表名1 where 字段名1 = (select 字段名2 from 表名2 where 条件);

行子查询:

select * from students where (class,age) in

(select class,age from students where name =’王昭君’);

子查询充当数据源(必须起别名)

select * from

(select * from courses where name in (‘数据库’,’系统测试’)) as temp

inner join scores on

temp.courseno = scores.courseno;

6,备份:

Mysqldump.exe 是备份工具

Mysql的路径 mysqldump -u root -p 数据库名 > 要保存的文件名

7,恢复:

Mysql -u root -p 数据库名 < 要恢复的文件名

8,内置函数:

1,字符串函数:

1,拼接字符串: concat(str1,str2)

2,长度: length(str)

3,截取字符串:

left(str,len)

Right(str,len)

Substring(str,pos,len)

4,删除空格:

Ltrim(str)

Rtrim(str)

5,大小写转换:

Lower(str)

Upper(str)

2,数学函数

四舍五入:   select rounnd(数字,小数位);

x的y次幂:   select pow(x,y);

圆周率:     select pi();

随机数:     select rand();

3,日期时间函数

当前日期: current_date();

当前时间:current_time();

当前日期时间:now();

日期格式化:date_format(date,format)

%Y  返回完整年份

%y  返回简写年份

%m  月份

%d  天

%H  24小时制

%h  12小时制

%i  分钟

%s  秒

9,流程控制

Case 值

when 比较值1 then 结果1

when 比较值2 then 结果2…

else 结果3 end

10,操作日志

show variables like ‘general%’;   查看日志 是否开启

set global general_log =1;      设置开启日志(0是关闭,1是开启)

tail -f var/log/mysql/mysql.log    实时查看数据库日志

11,重置密码

1打开my.ini  修改 找到[mysqld] 插入skip-grant-tables

2重启mysql服务   sudo service mysql restart;

3免密登录服务端

4设置新密码Update user set password=password(‘123456’); flush privileges;

5修改配置文件,删除skip-grant-tables,重启服务端

12,修改密码:

在mysql仓库user表中

Update user set password=password(‘123456’);

flush privileges;

13,事物:是一个操作序列,要么都成功,要么都失败

事物命令要求:服务器引擎是innodb

1,开启事务  begin;

事物操作

2,提交事物  commit;

3,回滚   rollback;    (失败时使用)

14,索引:

作用:提升查询速度,降低更新表的速度

查询:

开启运行时间检测  set profiling=1;

查找第一万条数据  select * from test_index where title=’test10000’;

查看执行时间      show profiles;

为表test_index的title列创建索引   create index title_index on test_index(title(10));

执行查询语句    select * from test_index where title=’test10000’;

查看执行时间      show profiles;

删除索引     drop index 索引名 on 表名;

注意:给某个字段创建索引,相当于给他创建了目录,根据有索引的字段查询时速度要快

创建索引:

方式一新建表

设置主键 唯一 和建表的时候加入key(列)都可以创建索引

方式二已存在的表

创建索引

15,外键

作用:一个表中的某个字段的数据被另一个表的某一个字段约束,字段的值必须在另一个表的字段数据范围之内.

缺点:会降低表更新的效率

16,视图

语法:Create view 视图名 as select语句;

注意:创建视图时,select语句的返回结果不能有重复的字段.

视图的用途就是查询

作用:存在服务端,省流量,重复利用

Show tables;  显示视图

Drop view 视图名;   删除视图

17,自定义函数:

语法格式:

Delimiter 分隔符

Create function 函数名(参数列表)

Returns 返回类型

Begin

Sql 语句

end

Delimiter 分隔符


事务

/*
事务:主要用于处理操作量大,复杂度高的数据
事务的acid属性
    1,原子性:事务时一个不可分割的单位,事务中的操作要么都执行,要么都不执行。
    2,一致性:事务必须使数据库从一个一致性状态到另一个一致性状态。
    3,隔离性:一个事务的执行不能被其他事务干扰。
    4,持久性:事务一旦被提交,对数据库中的数据的修改时永久性的。

在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务

事务默认是自动提交的。
像insert/update/delete 都是隐式事务

*/
-- 查看事务开启状态
show varailes like "%autocommit%";
-- 修改事务状态
set autocommit on/off;


变量

/*
设置的全局变量在数据库重启后回复默认值/重置
*/
-- 系统变量
-- 查看所有系统变量
show global variables
show global variables like '%user%'
-- 设置变量
set global 系统变量名= 值
-- 查询系统变量的值
select @@global.系统变量名
select @@global.autocommit;


-- 会话变量,在当前会话有效
-- 会话变量可以省略sission
show  variables
show  variables like '%user%'
-- 设置变量
set session 会话变量名= 值
-- 查询会话变量的值
select @@session.会话变量名
select @@session.autocommit;
select @@autocommit;


-- 自定义变量
 -- 用户变量,对当前会话有效
 -- 声明用户变量并初始化
set @用户变量名=值;
set @用户变量名:=值;
select @用户变量名:=值;
-- 赋值
set @用户变量名=值;
set @用户变量名:=值;
select @用户变量名:=值;
select 字段 into 变量名 from 表;
-- 查询
select @用户变量名

 -- 局部变量,仅在begin end中有效
  -- 定义
declare 变量名 数据类型;
declare 变量名 数据类型 default 值;
  -- 赋值
select 字段 into 局部变量名 from 表;
  -- 查询
select 变量名

存储过程

-- 存储过程
/* 格式

delimiter $
create procedure 存储过程名(参数模式 参数名 参数类型)
begin 
    存储过程体(一组合法的sql语句)
end $


-- 参数模式:
    in: 指定该参数可以作为输入;
    out: 指定该参数可以作为输出;
    inout: 指定该参数可以作为输入输出。

-- 存储过程体 可以是一条或者多条sql语句;
-- 每条sql语句后都加 ;号;
-- 存储过程结尾使用 delimiter重写过的结尾标记。

*/

-- 删除存储过程
drop procedure 存储过程名;

-- 查看存储过程
show create procedure 存储过程名;

-- ----------------------------------------------------
-- 调用存储过程
call 存储过程名(实参列表);
delimiter ; # 恢复结尾标记

-- 不带参数的存储过程
delimiter $
create procedure testa() 
begin 
insert into test0(`name`, `age`) values('a', 1),('b', 2); 
end $

call testa();

-- ----------------------------------------------------

-- 带输入参数的存储过程
delimiter $
create procedure testb(in user_age int) 
begin 
select * from test0 where age > user_age;
end $

call testb(10);

-- ----------------------------------------------------

-- 存储过程中使用变量
delimiter $
create procedure testc(in age int) 
begin 
declare result varchar(20) default '';  # 声明并初始化变量
select count(*) into result  # 使用into给变量赋值
from test0 
where test0.age > age;
select if(result > 0, '有', '没有');  # 调用变量 查询输出结构
end $

call testc(100);

-- ----------------------------------------------------

-- 存储过程中使用out参数
delimiter $
create procedure testd(out age int) 
begin 
select count(*) into age  # 使用into给变量赋值
from test0 
where test0.age > 10;
end $

-- 调用带输入参数的存储过程
call testd(@test_variable0); # 使用@+变量名设置一个新的变量,用户接受数据
select @test_variable0;  # 查询变量数据信息

-- ----------------------------------------------------

-- inout类型参数存储过程
delimiter $
create procedure teste(inout a int, inout b int)
begin
	set a=a*10;
	set b=b*10;
end $

-- 先设置全局变量,使用全局变量调用存储过程,最后查询
set @a=2;
set @b=3;
call teste(@a, @b);
select @a a, @b b;


if(条件,满足的结构,不满足的结果)


-- case语句 可以嵌套在其他语句中 也可以直接使用

-- 使用方式一 case后面跟参数/表达式 when 后面直接填值
case 变量/表达式/字段
when 要判断的值 then 返回的值
when 要判断的值 then 返回的值
...
else 返回的值
end

-- 使用方式二 case后面不带参数,when 后面跟条件
case
when 要判断的条件 then 返回的值
when 要判断的条件 then 返回的值
...
else 返回的值
end



-- case在存储过程中使用
delimiter $
create procedure testf(in input_num int)
begin
	case
	when input_num between 90 and 100 then select 'A';
	when input_num between 80 and 90 then select 'B';
	when input_num between 70 and 80 then select 'C';
	when input_num between 60 and 70 then select 'D';
	else select 'xx';
	end case;
end $

call testf(90)
drop procedure testf



-- if 在存储过程中使用
delimiter $
create procedure testg(in input_num int)
begin
	if input_num = 0 then select input_num;
	elseif input_num > 0 then select 1;
	elseif input_num < 0 then select -1;
	else select -2;
	end if;
end $

call testg(0)



-- 循环
delimiter $
create procedure testh(in input_num int)
begin
	declare i int default 0;
	while input_num >=i do
		insert into test0 values(default, concat('jack', input_num), input_num);
		set input_num=input_num-1;
	end while;
end $

call testh(5)


-- 循环内判断
delimiter $
create procedure testi(in input_num int)
begin
	declare i int default 0;
	a:while input_num >=i do
		if input_num - i > 50 then leave a;
		end if;
		insert into test0 values(default, concat('jack', input_num), input_num);
		set input_num=input_num-1;
	end while a;
end $

call testi(90)

函数

-- 函数
-- 创建函数
create function 函数名(参数名 参数类型, 参数名 参数类型) returns 返回值类型
begin
	函数体
	return 返回值;
end
-- 调用函数
select 函数名(参数);


-- 创建不带变量的函数
delimiter $
create function func1() returns int
begin
	declare result int default 0;
	select count(*) into result 
	from test0
	where test0.age > 10;
	return result;
end $

select func1()

-- 创建带变量的函数
delimiter $
create function func2(uname varchar(20)) returns int
begin
set @result=0;
select test0.age into @result
from test0
where test0.name = uname;
return @result;
end $

-- 调用函数
select func2('zhangsan')
-- 删除函数
drop function func2



/*
创建函数时报错
这是我们开启了bin-log, 我们就必须指定我们的函数是否是
1 DETERMINISTIC 确定性的
2 NO SQL 没有SQl语句,当然也不会修改数据
3 READS SQL DATA 只是读取数据,当然也不会修改数据
4 MODIFIES SQL DATA 要修改数据
5 CONTAINS SQL 包含了SQL语句
解决方法:
select @@global.log_bin_trust_function_creators
set global log_bin_trust_function_creators=TRUE;
*/


类型转换

CAST函数语法规则是:Cast(字段名 as 转换的类型 ),其中类型可以为:

CHAR[(N)] 字符型

DATE 日期型

DATETIME 日期和时间型

DECIMAL float型

SIGNED int

TIME 时间型

-- 插入卡片数量
delimiter $
create procedure insert_activity_card_detail(in userid int, in card int)
begin
INSERT INTO activity_card_detail
VALUES (default, userid, 60, concat('card_', cast(card as char)), CURRENT_TIMESTAMP(), 1, card, CURRENT_TIMESTAMP(), 0);
end $

替换同一张表里的两个字段的数据

update your_table as a, your_table as b
set a.field1= b.field2, a.field2= b.field1
where a.actor_id = b.actor_id

需求:统计每隔10分钟的数据量

-- UNIX_TIMESTAMP 将时间转为时间戳,
-- 该时间戳对一个时间值(每10分钟就是 10*60,每5分钟就是 5*60)取模,得到的余数就是比最终要获得的时间值多的秒数,
-- 用时间戳减去时间值的余数就是每X分钟的时间值了, 
-- 然后使用FROM_UNIXTIME 将时间戳转换为格式化字符串时间

select FROM_UNIXTIME(UNIX_TIMESTAMP(bind_phone_time) - UNIX_TIMESTAMP(bind_phone_time) % (10 * 60)) as aaa, count(1) 
from share_activity_invitee
group by aaa
order by aaa desc

下面来看下区别


select 
UNIX_TIMESTAMP(bind_phone_time) '时间戳', 
UNIX_TIMESTAMP(bind_phone_time) % (10 * 60) '时间戳对一个时间段取模(取余数)', 
UNIX_TIMESTAMP(bind_phone_time) - (UNIX_TIMESTAMP(bind_phone_time) % (10 * 60)) '最终要获得的每隔X分钟的时间',
FROM_UNIXTIME(UNIX_TIMESTAMP(bind_phone_time) - (UNIX_TIMESTAMP(bind_phone_time) % (10 * 60))) '格式化时间'
from 
share_activity_invitee


部分数据来源:

MySQL 教程 | 菜鸟教程