基本概念
MySQL 是最流行的关系型数据库管理系统。
常用名词:
数据库: 数据库是一些关联表的集合。
数据表: 表是数据的矩阵。在一个数据库中的表看起来像一个简单的电子表格。
列: 一列(数据元素) 包含了相同类型的数据, 例如邮政编码的数据。
行:一行(=元组,或记录)是一组相关的数据,例如一条用户订阅的数据。
冗余:存储两倍数据,冗余降低了性能,但提高了数据的安全性。
主键:主键是唯一的。一个数据表中只能包含一个主键。你可以使用主键来查询数据。
外键:外键用于关联两个表。
复合键:复合键(组合键)将多个列作为一个索引键,一般用于复合索引。
索引:使用索引可快速访问数据库表中的特定信息。索引是对数据库表中一列或多列的值进行排序的一种结构。类似于书籍的目录。
参照完整性: 参照的完整性要求关系中不允许引用不存在的实体。与实体完整性是关系模型必须满足的完整性约束条件,目的是保证数据的一致性。
安装/操作
建议安装在centos中, 可视化操作可以使用Navicat Premium。
网上教程很多,新手不建议使用docker安装。
// 安装
yum -y install mariadb mariadb-server # centos7版本
yum -y install mysql mysql-server #centos7以下版本
// 启动
service mysqld start #开启 centos7以下版本
chkconfig mysqld on #设置开机自启
//或者
systemctl start mariadb #centos7
systemctl enable mariadb
//设置密码
//mysql admin -u root -p123 password '1234' #修改root用户密码
//进入mysql库修改user表
mysql>use mysql;
mysql>update user set password=password('你的密码') where user='root';
mysql>flush privileges;
// 登录
-- mysql -u root -p 1234 #本地登录,指定用户名和密码,用户为root@127.0.0.1
-- mysql -u root P 端口号 -h ip地址 -p 密码 #远程登录,
//查看
ps aux |grep mysqld #查看进程
netstat -an |grep 3306 #查看端口
// 启动和停止
net start mysql
net stop mysql
//忘记密码
//启动mysql时,跳过授权表
[root@controller ~]# service mysqld stop
[root@controller ~]# mysqld_safe --skip-grant-table &
[root@controller ~]# mysql
mysql> select user,host,password from mysql.user;
+----------+-----------------------+-------------------------------------------+
| user | host | password |
+----------+-----------------------+-------------------------------------------+
| root | localhost | *A4B6157319038724E3560894F7F932C8886EBFCF |
| root | localhost.localdomain | |
| root | 127.0.0.1 | |
| root | ::1 | |
| | localhost | |
| | localhost.localdomain | |
| root | % | *23AE809DDACAF96AF0FD78ED04B6A265E05AA257 |
+----------+-----------------------+-------------------------------------------+
mysql> update mysql.user set password=password("123") where user="root" and host="localhost";
mysql> flush privileges;
mysql> exit
[root@controller ~]# service mysqld restart
[root@controller ~]# mysql -uroot -p123
CREATE USER 'test'@'%' IDENTIFIED BY '123456'; #这种创建方式可以远程登录,即别的地方可以登录
create database testDemo default charset utf8 collate utf8_general_ci;
grant all privileges on testDemo.* to "test"@"%" identified by "123456";
flush privileges; #刷新系统权限表
https://blog.csdn.net/qq_43179597/article/details/96428076 在线升级mysql
数据类型
类型 | 大小 | 范围(有符号) | 范围(无符号)/格式 | 用途 |
---|---|---|---|---|
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的值 | 小数值 |
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 | 0-255 bytes | char(n) n 代表字符的个数 | 定长字符串 | |
VARCHAR | 0-65535 bytes | char(n) n 代表字符的个数 | 变长字符串 | |
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 | 极大文本数据 |
运算符
运算符 | 作用 |
---|---|
+ | 加法 |
- | 减法 |
* | 乘法 |
/ 或 DIV | 除法 |
% 或 MOD | 取余 |
= | 等于 |
<>, != | 不等于 |
> | 大于 |
< | 小于 |
<= | 小于等于 |
>= | 大于等于 |
BETWEEN | 在两值之间 |
NOT BETWEEN | 不在两值之间 |
IN | 在集合中 |
NOT IN | 不在集合中 |
<=> | 严格比较两个NULL值是否相等 |
LIKE | 模糊匹配 |
REGEXP 或 RLIKE | 正则式匹配 |
IS NULL | 为空 |
IS NOT NULL | 不为空 |
NOT 或 ! | 逻辑非 |
AND | 逻辑与 |
OR | 逻辑或 |
XOR | 逻辑异或 |
& | 按位与 |
| | 按位或 |
^ | 按位异或 |
! | 取反 |
<< | 左移 |
>> | 右移 |
流程控制
IF 语句、CASE 语句、LOOP 语句、LEAVE 语句、ITERATE 语句、REPEAT 语句和 WHILE 语句
IF 根据是否满足条件(可包含多个条件),来执行不同的语句
IF search_condition THEN statement_list
[ELSEIF search_condition THEN statement_list]...
[ELSE statement_list]
END IF
//例子
IF age>20 THEN SET @count1=@count1+1;
ELSEIF age=20 THEN @count2=@count2+1;
ELSE @count3=@count3+1;
END lF;
CASE 提供了多个条件进行选择,可以实现比 IF 语句更复杂的条件判断
CASE case_value
WHEN when_value THEN statement_list
[WHEN when_value THEN statement_list]...
[ELSE statement_list]
END CASE
//例子
CASE age
WHEN 20 THEN SET @count1=@count1+1;
ELSE SET @count2=@count2+1;
END CASE;
LOOP 只实现了一个简单的循环,并不进行条件判断。
[begin_label:]LOOP
statement_list
END LOOP [end_label]
//例子
add_num:LOOP
SET @count=@count+1;
END LOOP add_num;
LEAVE 用于跳出循环控制
add_num:LOOP
SET @count=@count+1;
IF @count=100 THEN
LEAVE add_num;
END LOOP add num;
INERATE 跳出本次循环,直接进入下一次循环
add_num:LOOP
SET @count=@count+1;
IF @count=100 THEN
LEAVE add_num;
ELSE IF MOD(@count,3)=0 THEN
ITERATE add_num;
SELECT * FROM employee;
END LOOP add_num;
REPEAT 有条件控制的循环语句,每次语句执行完毕后,会对条件表达式进行判断
[begin_label:] REPEAT
statement_list
UNTIL search_condition
END REPEAT [end_label]
//例子
REPEAT
SET @count=@count+1;
UNTIL @count=100
END REPEAT;
WHILE 语句是当满足条件时,执行循环内的语句,否则退出循环
[begin_label:] WHILE search_condition DO
statement list
END WHILE [end label]
//例子
WHILE @count<100 DO
SET @count=@count+1;
END WHILE;
元数据
命令 | 描述 |
---|---|
SELECT VERSION( ) | 服务器版本信息 |
SELECT DATABASE( ) | 当前数据库名 (或者返回空) |
SELECT USER( ) | 当前用户名 |
SHOW STATUS | 服务器状态 |
SHOW VARIABLES | 服务器配置变量 |
事务
事务是必须满足4个条件(ACID)::原子性(Atomicity,或称不可分割性)、一致性(Consistency)、隔离性(Isolation,又称独立性)、持久性(Durability)
1、用 BEGIN, ROLLBACK, COMMIT来实现
- BEGIN 开始一个事务
- ROLLBACK 事务回滚
- COMMIT 事务确认
2、直接用 SET 来改变 MySQL 的自动提交模式:
- SET AUTOCOMMIT=0 禁止自动提交
- SET AUTOCOMMIT=1 开启自动提交
库操作-创建-删除-使用
//创建数据库
CREATE DATABASE 数据库名;
//删除数据库
drop database <数据库名>;
// 选择使用数据库
use <数据库名>;
库操作-备份还原
//备份整个数据库
mysqldump -u root -h host -p dbname > backdb.sql
//备份数据库中的某个表
mysqldump -u root -h host -p dbname tbname1, tbname2 > backdb.sql
//备份多个数据库
mysqldump -u root -h host -p --databases dbname1, dbname2 > backdb.sql
//备份系统中所有数据库
mysqldump -u root -h host -p --all-databases > backdb.sql
// 还原
mysql -u root -p [dbname] < backup.sql
使用rsync在centos上进行异地备份https://blog.csdn.net/qq_40894742/article/details/110424808
表操作-增删
CREATE TABLE IF NOT EXISTS `runoob_tbl`(
`runoob_id` INT UNSIGNED AUTO_INCREMENT,
`runoob_title` VARCHAR(100) NOT NULL,
`runoob_author` VARCHAR(40) NOT NULL,
`submission_date` DATE,
PRIMARY KEY ( `runoob_id` )
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
//删除
DROP TABLE table_name ;
数据-增删改查
//插入
INSERT INTO table_name ( field1, field2,...fieldN )
VALUES
( value1, value2,...valueN );
//查询
SELECT column_name,column_name
FROM table_name
[WHERE Clause]
[LIMIT N][ OFFSET M]
//Where
SELECT field1, field2,...fieldN FROM table_name1, table_name2...
[WHERE condition1 [AND [OR]] condition2.....
//update
UPDATE table_name SET field1=new-value1, field2=new-value2
[WHERE Clause]
//delete
DELETE FROM table_name [WHERE Clause]
//LIKE
SELECT field1, field2,...fieldN
FROM table_name
WHERE field1 LIKE condition1 [AND [OR]] filed2 = 'somevalue'
//Union
SELECT expression1, expression2, ... expression_n
FROM tables
[WHERE conditions]
UNION [ALL | DISTINCT]
SELECT expression1, expression2, ... expression_n
FROM tables
[WHERE conditions];
DISTINCT: 可选,删除结果集中重复的数据。默认情况下 UNION 操作符已经删除了重复数据,所以 DISTINCT 修饰符对结果没啥影响。
//排序
SELECT field1, field2,...fieldN FROM table_name1, table_name2...
ORDER BY field1 [ASC [DESC][默认 ASC]], [field2...] [ASC [DESC][默认 ASC]]
//GroupBy
SELECT column_name, function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name;
数据-连接Jion
- INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录。
- LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录。
- RIGHT JOIN(右连接): 与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录。
技巧-正则
模式 | 描述 |
---|---|
^ | 匹配输入字符串的开始位置。如果设置了 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 次。 |
//查找name字段中以元音字符开头或以'ok'字符串结尾的所有数据:
SELECT name FROM person_tbl WHERE name REGEXP '^[aeiou]|ok$';
ALERT
//修改表名
ALTER TABLE testalter_tbl RENAME TO alter_tbl;
//删除,添加或修改表字段
ALTER TABLE testalter_tbl DROP I;
ALTER TABLE testalter_tbl ADD i INT;
//修改字段类型及名称
ALTER TABLE testalter_tbl MODIFY c CHAR(10);
ALTER TABLE testalter_tbl CHANGE i j BIGINT;i//字段名 j新字段名
//修改字段默认值
ALTER TABLE testalter_tbl ALTER i SET DEFAULT 1000;
ALTER TABLE testalter_tbl ALTER i DROP DEFAULT;// 删除默认值
索引
//显示索引信息
SHOW INDEX FROM table_name;
//创建索引
CREATE INDEX indexName ON table_name (column_name)
//添加索引
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 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
);
复制表
分三步走
1. 获取表结构crate语句
SHOW CREATE TABLE runoob_tbl;
2. 修改表名 转型create操作。
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;
3. 复制表数据
INSERT INTO clone_tbl (runoob_id,
-> runoob_title,
-> runoob_author,
-> submission_date)
-> SELECT runoob_id,runoob_title,
-> runoob_author,submission_date
-> FROM runoob_tbl;
防止SQL注入
/**
* sql注入过滤器
*/
@Component
@WebFilter(urlPatterns = "/*", filterName = "SQLInjection", initParams = { @WebInitParam(name = "regx", value = "(?:')|(?:--)|(/\\*(?:.|[\\n\\r])*?\\*/)|" +
"(\\b(select|update|and|or|delete|insert|trancate|char|into|substr|ascii|declare|exec|count|master|into|drop|execute)\\b)") })
public class SqlInjectFilter implements Filter{
private String regx;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
this.regx = filterConfig.getInitParameter("regx");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) servletRequest;
Map parametersMap = servletRequest.getParameterMap();
Iterator it = parametersMap.entrySet().iterator();
while (it.hasNext()) {
Map.Entry entry = (Map.Entry) it.next();
String[] value = (String[]) entry.getValue();
for (int i = 0; i < value.length; i++) {
if (null != value[i] && value[i].matches(this.regx)) {
log.error("您输入的参数有非法字符,请输入正确的参数!");
servletRequest.setAttribute("err", "您输入的参数有非法字符,请输入正确的参数!");
servletRequest.setAttribute("pageUrl",req.getRequestURI());
servletRequest.getRequestDispatcher(servletRequest.getServletContext().getContextPath() + "/error").forward(servletRequest, servletResponse);
return;
}
}
}
}
filterChain.doFilter(servletRequest, servletResponse);
}
@Override
public void destroy() {
}
}
启动类上记得加注解:
@ServletComponentScan(basePackages ="xxxx.xxx.xxx.filter") //filter所在的包,扫描
函数
函数 | 描述 | 实例 |
---|---|---|
ASCII(s) | 返回字符串 s 的第一个字符的 ASCII 码。 | 返回 CustomerName 字段第一个字母的 ASCII 码: |
CHAR_LENGTH(s) | 返回字符串 s 的字符数 | 返回字符串 RUNOOB 的字符数 |
CHARACTER_LENGTH(s) | 返回字符串 s 的字符数 | 返回字符串 RUNOOB 的字符数 |
CONCAT(s1,s2...sn) | 字符串 s1,s2 等多个字符串合并为一个字符串 | 合并多个字符串 |
CONCAT_WS(x, s1,s2...sn) | 同 CONCAT(s1,s2,...) 函数,但是每个字符串之间要加上 x,x 可以是分隔符 | 合并多个字符串,并添加分隔符: |
FIELD(s,s1,s2...) | 返回第一个字符串 s 在字符串列表(s1,s2...)中的位置 | 返回字符串 c 在列表值中的位置: |
FIND_IN_SET(s1,s2) | 返回在字符串s2中与s1匹配的字符串的位置 | 返回字符串 c 在指定字符串中的位置: |
FORMAT(x,n) | 函数可以将数字 x 进行格式化 "#,###.##", 将 x 保留到小数点后 n 位,最后一位四舍五入。 | 格式化数字 "#,###.##" 形式: |
INSERT(s1,x,len,s2) | 字符串 s2 替换 s1 的 x 位置开始长度为 len 的字符串 | 从字符串第一个位置开始的 6 个字符替换为 runoob: |
LOCATE(s1,s) | 从字符串 s 中获取 s1 的开始位置 | 获取 b 在字符串 abc 中的位置: 返回字符串 abc 中 b 的位置: |
LCASE(s) | 将字符串 s 的所有字母变成小写字母 | 字符串 RUNOOB 转换为小写: |
LEFT(s,n) | 返回字符串 s 的前 n 个字符 | 返回字符串 runoob 中的前两个字符: |
LOWER(s) | 将字符串 s 的所有字母变成小写字母 | 字符串 RUNOOB 转换为小写: |
LPAD(s1,len,s2) | 在字符串 s1 的开始处填充字符串 s2,使字符串长度达到 len | 将字符串 xx 填充到 abc 字符串的开始处: |
LTRIM(s) | 去掉字符串 s 开始处的空格 | 去掉字符串 RUNOOB开始处的空格: |
MID(s,n,len) | 从字符串 s 的 n 位置截取长度为 len 的子字符串,同 SUBSTRING(s,n,len) | 从字符串 RUNOOB 中的第 2 个位置截取 3个 字符: |
POSITION(s1 IN s) | 从字符串 s 中获取 s1 的开始位置 | 返回字符串 abc 中 b 的位置: |
REPEAT(s,n) | 将字符串 s 重复 n 次 | 将字符串 runoob 重复三次: |
REPLACE(s,s1,s2) | 将字符串 s2 替代字符串 s 中的字符串 s1 | 将字符串 abc 中的字符 a 替换为字符 x: |
REVERSE(s) | 将字符串s的顺序反过来 | 将字符串 abc 的顺序反过来: |
RIGHT(s,n) | 返回字符串 s 的后 n 个字符 | 返回字符串 runoob 的后两个字符: |
RPAD(s1,len,s2) | 在字符串 s1 的结尾处添加字符串 s2,使字符串的长度达到 len | 将字符串 xx 填充到 abc 字符串的结尾处: |
RTRIM(s) | 去掉字符串 s 结尾处的空格 | 去掉字符串 RUNOOB 的末尾空格: |
SPACE(n) | 返回 n 个空格 | 返回 10 个空格: |
STRCMP(s1,s2) | 比较字符串 s1 和 s2,如果 s1 与 s2 相等返回 0 ,如果 s1>s2 返回 1,如果 s1<s2 返回 -1 | 比较字符串: |
SUBSTR(s, start, length) | 从字符串 s 的 start 位置截取长度为 length 的子字符串 | 从字符串 RUNOOB 中的第 2 个位置截取 3个 字符: |
SUBSTRING(s, start, length) | 从字符串 s 的 start 位置截取长度为 length 的子字符串 | 从字符串 RUNOOB 中的第 2 个位置截取 3个 字符: |
SUBSTRING_INDEX(s, delimiter, number) | 返回从字符串 s 的第 number 个出现的分隔符 delimiter 之后的子串。 如果 number 是正数,返回第 number 个字符左边的字符串。 如果 number 是负数,返回第(number 的绝对值(从右边数))个字符右边的字符串。 | |
TRIM(s) | 去掉字符串 s 开始和结尾处的空格 | 去掉字符串 RUNOOB 的首尾空格: |
UCASE(s) | 将字符串转换为大写 | 将字符串 runoob 转换为大写: |
UPPER(s) | 将字符串转换为大写 | 将字符串 runoob 转换为大写: |
ABS(x) | 返回 x 的绝对值 | 返回 -1 的绝对值: |
ACOS(x) | 求 x 的反余弦值(参数是弧度) | |
ASIN(x) | 求反正弦值(参数是弧度) | |
ATAN(x) | 求反正切值(参数是弧度) | |
ATAN2(n, m) | 求反正切值(参数是弧度) | |
AVG(expression) | 返回一个表达式的平均值,expression 是一个字段 | 返回 Products 表中Price 字段的平均值: |
CEIL(x) | 返回大于或等于 x 的最小整数 | |
CEILING(x) | 返回大于或等于 x 的最小整数 | |
COS(x) | 求余弦值(参数是弧度) | |
COT(x) | 求余切值(参数是弧度) | |
COUNT(expression) | 返回查询的记录总数,expression 参数是一个字段或者 * 号 | 返回 Products 表中 products 字段总共有多少条记录: |
DEGREES(x) | 将弧度转换为角度 | |
n DIV m | 整除,n 为被除数,m 为除数 | 计算 10 除于 5: |
EXP(x) | 返回 e 的 x 次方 | 计算 e 的三次方: |
FLOOR(x) | 返回小于或等于 x 的最大整数 | 小于或等于 1.5 的整数: |
GREATEST(expr1, expr2, expr3, ...) | 返回列表中的最大值 | 返回以下数字列表中的最大值: 返回以下字符串列表中的最大值: |
LEAST(expr1, expr2, expr3, ...) | 返回列表中的最小值 | 返回以下数字列表中的最小值: 返回以下字符串列表中的最小值: |
LN | 返回数字的自然对数,以 e 为底。 | 返回 2 的自然对数: |
LOG(x) 或 LOG(base, x) | 返回自然对数(以 e 为底的对数),如果带有 base 参数,则 base 为指定带底数。 | |
LOG10(x) | 返回以 10 为底的对数 | |
LOG2(x) | 返回以 2 为底的对数 | 返回以 2 为底 6 的对数: |
MAX(expression) | 返回字段 expression 中的最大值 | 返回数据表 Products 中字段 Price 的最大值: |
MIN(expression) | 返回字段 expression 中的最小值 | 返回数据表 Products 中字段 Price 的最小值: |
MOD(x,y) | 返回 x 除以 y 以后的余数 | 5 除于 2 的余数: |
PI() | 返回圆周率(3.141593) | |
POW(x,y) | 返回 x 的 y 次方 | 2 的 3 次方: |
POWER(x,y) | 返回 x 的 y 次方 | 2 的 3 次方: |
RADIANS(x) | 将角度转换为弧度 | 180 度转换为弧度: |
RAND() | 返回 0 到 1 的随机数 | |
ROUND(x) | 返回离 x 最近的整数 | |
SIGN(x) | 返回 x 的符号,x 是负数、0、正数分别返回 -1、0 和 1 | |
SIN(x) | 求正弦值(参数是弧度) | |
SQRT(x) | 返回x的平方根 | 25 的平方根: |
SUM(expression) | 返回指定字段的总和 | 计算 OrderDetails 表中字段 Quantity 的总和: |
TAN(x) | 求正切值(参数是弧度) | |
TRUNCATE(x,y) | 返回数值 x 保留到小数点后 y 位的值(与 ROUND 最大的区别是不会进行四舍五入) | |
ADDDATE(d,n) | 计算起始日期 d 加上 n 天的日期 | |
ADDTIME(t,n) | n 是一个时间表达式,时间 t 加上时间表达式 n | 加 5 秒: 添加 2 小时, 10 分钟, 5 秒: |
CURDATE() | 返回当前日期 | |
CURRENT_DATE() | 返回当前日期 | |
CURRENT_TIME | 返回当前时间 | |
CURRENT_TIMESTAMP() | 返回当前日期和时间 | |
CURTIME() | 返回当前时间 | |
DATE() | 从日期或日期时间表达式中提取日期值 | |
DATEDIFF(d1,d2) | 计算日期 d1->d2 之间相隔的天数 | |
DATE_ADD(d,INTERVAL expr type) | 计算起始日期 d 加上一个时间段后的日期 | |
DATE_FORMAT(d,f) | 按表达式 f的要求显示日期 d | |
DATE_SUB(date,INTERVAL expr type) | 函数从日期减去指定的时间间隔。 | Orders 表中 OrderDate 字段减去 2 天: |
DAY(d) | 返回日期值 d 的日期部分 | |
DAYNAME(d) | 返回日期 d 是星期几,如 Monday,Tuesday | |
DAYOFMONTH(d) | 计算日期 d 是本月的第几天 | |
DAYOFWEEK(d) | 日期 d 今天是星期几,1 星期日,2 星期一,以此类推 | |
DAYOFYEAR(d) | 计算日期 d 是本年的第几天 | |
EXTRACT(type FROM d) | 从日期 d 中获取指定的值,type 指定返回的值。 type可取值为:
| |
FROM_DAYS(n) | 计算从 0000 年 1 月 1 日开始 n 天后的日期 | |
HOUR(t) | 返回 t 中的小时值 | |
LAST_DAY(d) | 返回给给定日期的那一月份的最后一天 | |
LOCALTIME() | 返回当前日期和时间 | |
LOCALTIMESTAMP() | 返回当前日期和时间 | |
MAKEDATE(year, day-of-year) | 基于给定参数年份 year 和所在年中的天数序号 day-of-year 返回一个日期 | |
MAKETIME(hour, minute, second) | 组合时间,参数分别为小时、分钟、秒 | |
MICROSECOND(date) | 返回日期参数所对应的微秒数 | |
MINUTE(t) | 返回 t 中的分钟值 | |
MONTHNAME(d) | 返回日期当中的月份名称,如 November | |
MONTH(d) | 返回日期d中的月份值,1 到 12 | |
NOW() | 返回当前日期和时间 | |
PERIOD_ADD(period, number) | 为 年-月 组合日期添加一个时段 | |
PERIOD_DIFF(period1, period2) | 返回两个时段之间的月份差值 | |
QUARTER(d) | 返回日期d是第几季节,返回 1 到 4 | |
SECOND(t) | 返回 t 中的秒钟值 | |
SEC_TO_TIME(s) | 将以秒为单位的时间 s 转换为时分秒的格式 | |
STR_TO_DATE(string, format_mask) | 将字符串转变为日期 | |
SUBDATE(d,n) | 日期 d 减去 n 天后的日期 | |
SUBTIME(t,n) | 时间 t 减去 n 秒的时间 | |
SYSDATE() | 返回当前日期和时间 | |
TIME(expression) | 提取传入表达式的时间部分 | |
TIME_FORMAT(t,f) | 按表达式 f 的要求显示时间 t | |
TIME_TO_SEC(t) | 将时间 t 转换为秒 | |
TIMEDIFF(time1, time2) | 计算时间差值 | |
TIMESTAMP(expression, interval) | 单个参数时,函数返回日期或日期时间表达式;有2个参数时,将参数加和 | |
TO_DAYS(d) | 计算日期 d 距离 0000 年 1 月 1 日的天数 | |
WEEK(d) | 计算日期 d 是本年的第几个星期,范围是 0 到 53 | |
WEEKDAY(d) | 日期 d 是星期几,0 表示星期一,1 表示星期二 | |
WEEKOFYEAR(d) | 计算日期 d 是本年的第几个星期,范围是 0 到 53 | |
YEAR(d) | 返回年份 | |
YEARWEEK(date, mode) | 返回年份及第几周(0到53),mode 中 0 表示周天,1表示周一,以此类推 | |
BIN(x) | 返回 x 的二进制编码 | 15 的 2 进制编码: |
BINARY(s) | 将字符串 s 转换为二进制字符串 | |
| CASE 表示函数开始,END 表示函数结束。如果 condition1 成立,则返回 result1, 如果 condition2 成立,则返回 result2,当全部不成立则返回 result,而当有一个成立之后,后面的就不执行了。 | |
CAST(x AS type) | 转换数据类型 | 字符串日期转换为日期: |
COALESCE(expr1, expr2, ...., expr_n) | 返回参数中的第一个非空表达式(从左向右) | |
CONNECTION_ID() | 返回唯一的连接 ID | |
CONV(x,f1,f2) | 返回 f1 进制数变成 f2 进制数 | |
CONVERT(s USING cs) | 函数将字符串 s 的字符集变成 cs | |
CURRENT_USER() | 返回当前用户 | |
DATABASE() | 返回当前数据库名 | |
IF(expr,v1,v2) | 如果表达式 expr 成立,返回结果 v1;否则,返回结果 v2。 | |
IFNULL(v1,v2) | 如果 v1 的值不为 NULL,则返回 v1,否则返回 v2。 | |
ISNULL(expression) | 判断表达式是否为 NULL | |
LAST_INSERT_ID() | 返回最近生成的 AUTO_INCREMENT 值 | |
NULLIF(expr1, expr2) | 比较两个字符串,如果字符串 expr1 与 expr2 相等 返回 NULL,否则返回 expr1 | |
SESSION_USER() | 返回当前用户 | |
SYSTEM_USER() | 返回当前用户 | |
USER() | 返回当前用户 | |
VERSION() | 返回数据库的版本号 | |
最后加一个练习的网址