在mysql使用过程中,日期一般都是以datetime、timestamp等格式进行存储的,但有时会因为特殊的需求或历史原因,日期的存储格式是varchar,那么我们该如何处理这个varchar格式的日期数据呢?
使用函数:STR_TO_DATE(str, format)
STR_TO_DATE(str, format)函数是DATE_FORMAT()函数的反函数。它需要一个字符串str和一个格式字符串格式。STR_TO_DATE()返回一个DATETIME值,如果格式字符串包含日期和时间部分,或如果字符串只包含日期或时间的部分返回日期或时间值。
下面举个案例进行说明。
比如我现在有一张会员表,表的结构如下所示:
我在表中造了如下几条数据:
现在,如果我需要从中挑选出2018年8月份注册的所有会员,并按注册时间进行排序,那么要怎么做呢?这里给出一个参考:
SELECT id,nickname,createtime
FROM member
WHERE str_to_date(createtime, '%Y-%m-%d') BETWEEN str_to_date('2018-08-01', '%Y-%m-%d') AND str_to_date('2018-08-31', '%Y-%m-%d')
ORDER BY str_to_date(createtime, '%Y-%m-%d')
执行结果如下:
总结:STR_TO_DATE(str, format)函数可以将数据库中varchar类型的日期数据转换成DATETIME类型的日期数据,转换过程注意format参数必须要应对str的格式,之后我们就可以进行比较、排序等操作啦!
在mysql使用过程中,日期一般都是以datetime、timestamp等格式进行存储的,但有时会因为特殊的需求或历史原因,日期的存储格式是varchar,那么我们该如何处理这个varchar格式的日期数据呢?使用函数:STR_TO_DATE(str, format)STR_TO_DATE(str, format)函数是DATE_FORMAT()函数的反函数。它需要一个字符串str和一个...
先使用str_to_date函数,将其
varchar
类型
转为
日期
类型
,然后从小到大
排序
语法:select str_to_date(class_time,’%Y%m%d %H:%i:%s’) a from a order by a desc ;
下面接着看下oracle
中
varchar
类型
的
日期
格式转换date
类型
oracle
中
varchar
类型
的
日期
格式转换date
类型
SELECT to_char(to_date(m.ma_datetime,'yyyy-MM-dd hh24:mi:ss'),
'yyyyMMdd') FROM my_task m;
m.ma_datet
2.3.14. 在Windows环境下对
MySQL
安装的故障诊断与排除
2.3.15. 在Windows下升级
MySQL
2.3.16. Windows版
MySQL
同Unix版
MySQL
对比
2.4. 在Linux下安装
MySQL
2.5.在Mac OS X
中
安装
MySQL
2.6. 在NetWare
中
安装
MySQL
2.7. 在其它类Unix系统
中
安装
MySQL
2.8. 使用源码分发版安装
MySQL
2.8.1. 源码安装概述
2.8.2. 典型配置选项
2.8.3. 从开发源码树安装
2.8.4. 处理
MySQL
编译问题
2.8.5. MIT-pthreads注意事项
2.8.6. 在Windows下从源码安装
MySQL
2.8.7. 在Windows下编译
MySQL
客户端
2.9. 安装后的设置和测试
2.9.1. Windows下安装后的过程
2.9.2. Unix下安装后的过程
2.9.3. 使初始
MySQL
账户安全
2.10. 升级
MySQL
2.10.1. 从5.0版升级
2.10.2. 升级授权表
2.10.3. 将
MySQL
数据库拷贝到另一台机器
2.11. 降级
MySQL
2.12. 具体
操作
系统相关的注意事项
2.12.1. Linux注意事项
2.12.2. Mac OS X注意事项
2.12.3. Solaris注意事项
2.12.4. BSD注意事项
2.12.5. 其它Unix注意事项
2.12.6. OS/2注意事项
2.13. Perl安装注意事项
2.13.1. 在Unix
中
安装Perl
2.13.2. 在Windows下安装ActiveState Perl
2.13.3. 使用Perl DBI/DBD接口的问题
3. 教程
3.1. 连接与断开服务器
3.2. 输入查询
3.3. 创建并使用数据库
3.3.1. 创建并选择数据库
3.3.2. 创建表
3.3.3. 将数据装入表
中
3.3.4. 从表检索信息
3.4. 获得数据库和表的信息
3.5. 在批处理模式下使用
mysql
3.6. 常用查询的例子
3.6.1. 列的最大值
3.6.2. 拥有某个列的最大值的行
3.6.3. 列的最大值:按组
3.6.4. 拥有某个字段的组间最大值的行
3.6.5. 使用用户变量
3.6.6. 使用外键
3.6.7. 根据两个键搜索
3.6.8. 根据天计算访问量
3.6.9. 使用AUTO_INCREMENT
3.7. 孪生项目的查询
3.7.1. 查找所有未分发的孪生项
3.7.2. 显示孪生对状态的表
3.8. 与Apache一起使用
MySQL
4.
MySQL
程序概述
4.1.
MySQL
程序概述
4.2. 调用
MySQL
程序
4.3. 指定程序选项
4.3.1. 在命令行上使用选项
4.3.2. 使用选项文件
4.3.3. 用环境变量指定选项
4.3.4. 使用选项设置程序变量
5. 数据库管理
5.1.
MySQL
服务器和服务器启动脚本
5.1.1. 服务器端脚本和实用工具概述
5.1.2.
mysql
d-max扩展
MySQL
服务器
5.1.3.
mysql
d_safe:
MySQL
服务器启动脚本
5.1.4.
mysql
.server:
MySQL
服务器启动脚本
5.1.5.
mysql
d_multi:管理多个
MySQL
服务器的程序
5.2.
mysql
manager:
MySQL
实例管理器
5.2.1. 用
MySQL
实例管理器启动
MySQL
服务器
5.2.2. 连接到
MySQL
实例管理器并创建用户账户
5.2.3.
MySQL
实例管理器命令行选项
5.2.4.
MySQL
实例管理器配置文件
5.2.5.
MySQL
实例管理器识别的命令
5.3.
mysql
d:
MySQL
服务器
5.3.1.
mysql
d命令行选项
5.3.2.
SQL
服务器模式
5.3.3. 服务器系统变量
5.3.4. 服务器状态变量
5.4.
mysql
_fix_privilege_tables:升级
MySQL
系统表
5.5.
MySQL
服务器关机进程
5.6. 一般安全问题
5.6.1. 通用安全指南
5.6.2. 使
MySQL
在攻击者面前保持安全
5.6.3.
Mysql
d安全相关启动选项
5.6.4. LOAD DATA LOCAL安全问题
5.7.
MySQL
访问权限系统
5.7.1. 权限系统的作用
5.7.2. 权限系统工作原理
5.7.3.
MySQL
提供的权限
5.7.4. 与
MySQL
服务器连接
5.7.5. 访问控制, 阶段1:连接核实
5.7.6. 访问控制, 阶段2:请求核实
5.7.7. 权限更改何时生效
5.7.8. 拒绝访问错误的原因
5.7.9.
MySQL
4.1
中
的密码哈希处理
5.8.
MySQL
用户账户管理
5.8.1.
MySQL
用户名和密码
5.8.2. 向
MySQL
增加新用户账户
5.8.3. 从
MySQL
删除用户账户
5.8.4. 限制账户资源
5.8.5. 设置账户密码
5.8.6. 使你的密码安全
5.8.7. 使用安全连接
5.9. 备份与恢复
5.9.1. 数据库备份
5.9.2. 示例用备份与恢复策略
5.9.3. 自动恢复
5.9.4. 表维护和崩溃恢复
5.9.5. myisamchk:MyISAM表维护实用工具
5.9.6. 建立表维护计划
5.9.7. 获取关于表的信息
5.10.
MySQL
本地化和国际应用
5.10.1. 数据和
排序
用
字符
集
5.10.2. 设置错误消息语言
5.10.3. 添加新的
字符
集
5.10.4.
字符
定义数组
5.10.5.
字符
串
比较
支持
5.10.6. 多字节
字符
支持
5.10.7.
字符
集问题
5.10.8.
MySQL
服务器时区支持
5.11.
MySQL
日志文件
5.11.1. 错误日志
5.11.2. 通用查询日志
5.11.3. 二进制日志
5.11.4. 慢速查询日志
5.11.5. 日志文件维护
5.12. 在同一台机器上运行多个
MySQL
服务器
5.12.1. 在Windows下运行多个服务器
5.12.2. 在Unix
中
运行多个服务器
5.12.3. 在多服务器环境
中
使用客户端程序
5.13.
MySQL
查询高速缓冲
5.13.1. 查询高速缓冲如何工作
5.13.2. 查询高速缓冲SELECT选项
5.13.3. 查询高速缓冲配置
5.13.4. 查询高速缓冲状态和维护
6.
MySQL
中
的复制
6.1. 复制介绍
6.2. 复制实施概述
6.3. 复制实施细节
6.3.1. 复制主线程状态
6.3.2. 复制从I/O线程状态
6.3.3. 复制从
SQL
线程状态
6.3.4. 复制传递和状态文件
6.4. 如何设置复制
6.5. 不同
MySQL
版本之间的复制兼容性
6.6. 升级复制设置
6.6.1. 将复制升级到5.0版
6.7. 复制特性和已知问题
6.8. 复制启动选项
6.9. 复制FAQ
6.10. 复制故障诊断与排除
6.11. 通报复制缺陷
6.12. 多服务器复制
中
的Auto-Increment
7. 优化
7.1. 优化概述
7.1.1.
MySQL
设计局限与折衷
7.1.2. 为可移植性设计应用程序
7.1.3. 我们已将
MySQL
用在何处?
7.1.4.
MySQL
基准套件
7.1.5. 使用自己的基准
7.2. 优化SELECT语句和其它查询
7.2.1. EXPLAIN语法(获取SELECT相关信息)
7.2.2. 估计查询性能
7.2.3. SELECT查询的速度
7.2.4.
MySQL
怎样优化WHERE子句
7.2.5. 范围优化
7.2.6. 索引合并优化
7.2.7.
MySQL
如何优化IS NULL
7.2.8.
MySQL
如何优化DISTINCT
7.2.9.
MySQL
如何优化LEFT JOIN和RIGHT JOIN
7.2.10.
MySQL
如何优化嵌套Join
7.2.11.
MySQL
如何简化外部联合
7.2.12.
MySQL
如何优化ORDER BY
7.2.13.
MySQL
如何优化GROUP BY
7.2.14.
MySQL
如何优化LIMIT
7.2.15. 如何避免表扫描
7.2.16. INSERT语句的速度
7.2.17. UPDATE语句的速度
7.2.18. DELETE语句的速度
7.2.19. 其它优化技巧
7.3. 锁定事宜
7.3.1. 锁定方法
7.3.2. 表锁定事宜
7.4. 优化数据库结构
7.4.1. 设计选择
7.4.2. 使你的数据尽可能小
7.4.3. 列索引
7.4.4. 多列索引
7.4.5.
MySQL
如何使用索引
7.4.6. MyISAM键高速缓冲
7.4.7. MyISAM索引统计集合
7.4.8.
MySQL
如何计算打开的表
7.4.9.
MySQL
如何打开和关闭表
7.4.10. 在同一个数据库
中
创建多个表的缺陷
7.5. 优化
MySQL
服务器
7.5.1. 系统因素和启动参数的调节
7.5.2. 调节服务器参数
7.5.3. 控制查询优化器的性能
7.5.4. 编译和链接怎样影响
MySQL
的速度
7.5.5.
MySQL
如何使用内存
7.5.6.
MySQL
如何使用DNS
7.6. 磁盘事宜
7.6.1. 使用符号链接
8. 客户端和实用工具程序
8.1. 客户端脚本和实用工具概述
8.2. myisampack:生成压缩、只读MyISAM表
8.3.
mysql
:
MySQL
命令行工具
8.3.1. 选项
8.3.2.
mysql
命令
8.3.3. 怎样从文本文件执行
SQL
语句
8.3.4.
mysql
技巧
8.4.
mysql
access:用于检查访问权限的客户端
8.5.
mysql
admin:用于管理
MySQL
服务器的客户端
8.6.
mysql
binlog:用于处理二进制日志文件的实用工具
8.7.
mysql
check:表维护和维修程序
8.8.
mysql
dump:数据库备份程序
8.9.
mysql
hotcopy:数据库备份程序
8.10.
mysql
import:数据导入程序
8.11.
mysql
show-显示数据库、表和列信息
8.12. myisamlog:显示MyISAM日志文件内容
8.13. perror:解释错误代码
8.14. replace:
字符
串替换实用工具
8.15.
mysql
_zap:杀死符合某一模式的进程
9. 语言结构
9.1. 文字值
9.1.1.
字符
串
9.1.2. 数值
9.1.3. 十六进制值
9.1.4. 布尔值
9.1.5. 位字段值
9.1.6. NULL值
9.2. 数据库、表、索引、列和别名
9.2.1. 识别符限制条件
9.2.2. 识别符大小写敏感性
9.3. 用户变量
9.4. 系统变量
9.4.1. 结构式系统变量
9.5. 注释语法
9.6.
MySQL
中
保留字的处理
10.
字符
集支持
10.1. 常规
字符
集和校对
10.2.
MySQL
中
的
字符
集和校对
10.3. 确定默认
字符
集和校对
10.3.1. 服务器
字符
集和校对
10.3.2. 数据库
字符
集和校对
10.3.3. 表
字符
集和校对
10.3.4. 列
字符
集和校对
10.3.5.
字符
集和校对分配示例
10.3.6. 连接
字符
集和校对
10.3.7.
字符
串文字
字符
集和校对
10.3.8. 在
SQL
语句
中
使用COLLATE
10.3.9. COLLATE子句优先
10.3.10. BINARY
操作
符
10.3.11. 校对确定较为复杂的一些特殊情况
10.3.12. 校对必须适合
字符
集
10.3.13. 校对效果的示例
10.4.
字符
集支持影响到的
操作
10.4.1. 结果
字符
串
10.4.2. CONVERT()
10.4.3. CAST()
10.4.4. SHOW语句
10.5. Unicode支持
10.6. 用于元数据的UTF8
10.7. 与其它DBMS的兼容性
10.8. 新
字符
集配置文件格式
10.9. 国家特有
字符
集
10.10.
MySQL
支持的
字符
集和校对
10.10.1. Unicode
字符
集
10.10.2. 西欧
字符
集
10.10.3.
中
欧
字符
集
10.10.4. 南欧与
中
东
字符
集
10.10.5. 波罗的海
字符
集
10.10.6. 西里尔
字符
集
10.10.7. 亚洲
字符
集
11. 列
类型
11.1. 列
类型
概述
11.1.1. 数值
类型
概述
11.1.2.
日期
和时间
类型
概述
11.1.3.
字符
串
类型
概述
11.2. 数值
类型
11.3.
日期
和时间
类型
11.3.1. DATETIME、DATE和TIMESTAMP
类型
11.3.2. TIME
类型
11.3.3. YEAR
类型
11.3.4. Y2K事宜和
日期
类型
11.4. String
类型
11.4.1. CHAR和
VARCHAR
类型
11.4.2. BINARY和VARBINARY
类型
11.4.3. BLOB和TEXT
类型
11.4.4. ENUM
类型
11.4.5. SET
类型
11.5. 列
类型
存储需求
11.6. 选择正确的列
类型
11.7. 使用来自其他数据库引擎的列
类型
12. 函数和
操作
符
12.1.
操作
符
12.1.1.
操作
符优先级
12.1.2. 圆括号
12.1.3.
比较
函数和
操作
符
12.1.4. 逻辑
操作
符
12.2. 控制流程函数
12.3.
字符
串函数
12.3.1.
字符
串
比较
函数
12.4. 数值函数
12.4.1. 算术
操作
符
12.4.2. 数学函数
12.5.
日期
和时间函数
12.6.
MySQL
使用什么日历?
12.7. 全文搜索功能
12.7.1. 布尔全文搜索
12.7.2. 全文搜索带查询扩展
12.7.3. 全文停止字
12.7.4. 全文限定条件
12.7.5. 微调
MySQL
全文搜索
12.8. Cast函数和
操作
符
12.9. 其他函数
12.9.1. 位函数
12.9.2. 加密函数
12.9.3. 信息函数
12.9.4. 其他函数
12.10. 与GROUP BY子句同时使用的函数和修改程序
12.10.1. GROUP BY(聚合)函数
12.10.2. GROUP BY修改程序
12.10.3. 具有隐含字段的GROUP BY
13.
SQL
语句语法
13.1. 数据定义语句
13.1.1. ALTER DATABASE语法
13.1.2. ALTER TABLE语法
13.1.3. CREATE DATABASE语法
13.1.4. CREATE INDEX语法
13.1.5. CREATE TABLE语法
13.1.6. DROP DATABASE语法
13.1.7. DROP INDEX语法
13.1.8. DROP TABLE语法
13.1.9. RENAME TABLE语法
13.2. 数据
操作
语句
13.2.1. DELETE语法
13.2.2. DO语法
13.2.3. HANDLER语法
13.2.4. INSERT语法
13.2.5. LOAD DATA INFILE语法
13.2.6. REPLACE语法
13.2.7. SELECT语法
13.2.8. Subquery语法
13.2.9. TRUNCATE语法
13.2.10. UPDATE语法
13.3.
MySQL
实用工具语句
13.3.1. DESCRIBE语法(获取有关列的信息)
13.3.2. USE语法
13.4.
MySQL
事务处理和锁定语句
13.4.1. START TRANSACTION, COMMIT和ROLLBACK语法
13.4.2. 不能回滚的语句
13.4.3. 会造成隐式提交的语句
13.4.4. SAVEPOINT和ROLLBACK TO SAVEPOINT语法
13.4.5. LOCK TABLES和UNLOCK TABLES语法
13.4.6. SET TRANSACTION语法
13.4.7. XA事务
13.5. 数据库管理语句
13.5.1. 账户管理语句
13.5.2. 表维护语句
13.5.3. SET语法
13.5.4. SHOW语法
13.5.5. 其它管理语句
13.6. 复制语句
13.6.1. 用于控制主服务器的
SQL
语句
13.6.2. 用于控制从服务器的
SQL
语句
13.7. 用于预处理语句的
SQL
语法
14. 插件式存储引擎体系结构
14.1. 前言
14.2. 概述
14.3. 公共
MySQL
数据库服务器层
14.4. 选择存储引擎
14.5. 将存储引擎指定给表
14.6. 存储引擎和事务
14.7. 插入存储引擎
14.8. 拔出存储引擎
14.9. 插件式存储器的安全含义
15. 存储引擎和表
类型
15.1. MyISAM存储引擎
15.1.1. MyISAM启动选项
15.1.2. 键所需的空间
15.1.3. MyISAM表的存储格式
15.1.4. MyISAM表方面的问题
15.2. InnoDB存储引擎
15.2.1. InnoDB概述
15.2.2. InnoDB联系信息
15.2.3. InnoDB配置
15.2.4. InnoDB启动选项
15.2.5. 创建InnoDB表空间
15.2.6. 创建InnoDB表
15.2.7. 添加和删除InnoDB数据和日志文件
15.2.8. InnoDB数据库的备份和恢复
15.2.9. 将InnoDB数据库移到另一台机器上
15.2.10. InnoDB事务模型和锁定
15.2.11. InnoDB性能调节提示
15.2.12. 多版本的实施
15.2.13. 表和索引结构
15.2.14. 文件空间管理和磁盘I/O
15.2.15. InnoDB错误处理
15.2.16. 对InnoDB表的限制
15.2.17. InnoDB故障诊断与排除
15.3. MERGE存储引擎
15.3.1. MERGE表方面的问题
15.4. MEMORY (HEAP)存储引擎
15.5. BDB (BerkeleyDB)存储引擎
15.5.1. BDB支持的
操作
系统
15.5.2. 安装BDB
15.5.3. BDB启动选项
15.5.4. BDB表的特性
15.5.5. 修改BDB所需的事宜
15.5.6. 对BDB表的限制
15.5.7. 使用BDB表时可能出现的错误
15.6. EXAMPLE存储引擎
15.7. FEDERATED存储引擎
15.7.1. 安装FEDERATED存储引擎
15.7.2. FEDERATED存储引擎介绍
15.7.3. 如何使用FEDERATED表
15.7.4. FEDERATED存储引擎的局限性
15.8. ARCHIVE存储引擎
15.9. CSV存储引擎
15.10. BLACKHOLE存储引擎
16. 编写自定义存储引擎
16.1. 前言
16.2. 概述
16.3. 创建存储引擎源文件
16.4. 创建handlerton
16.5. 对处理程序
进行
实例化处理
16.6. 定义表扩展
16.7. 创建表
16.8. 打开表
16.9. 实施基本的表扫描功能
16.9.1. 实施store_lock()函数
16.9.2. 实施external_lock()函数
16.9.3. 实施rnd_init()函数
16.9.4. 实施info()函数
16.9.5. 实施extra()函数
16.9.6. 实施rnd_next()函数
16.10. 关闭表
16.11. 为存储引擎添加对INSERT的支持
16.12. 为存储引擎添加对UPDATE的支持
16.13. 为存储引擎添加对DELETE的支持
16.14. API引用
16.14.1. bas_ext
16.14.2. close
16.14.3. create
16.14.4. delete_row
16.14.5. delete_table
16.14.6. external_lock
16.14.7. extra
16.14.8. info
16.14.9. open
16.14.10. rnd_init
16.14.11. rnd_next
16.14.12. store_lock
16.14.13. update_row
16.14.14. write_row
17.
MySQL
簇
17.1.
MySQL
簇概述
17.2.
MySQL
簇的基本概念
17.3. 多计算机的简单基础知识
17.3.1. 硬件、软件和联网
17.3.2. 安装
17.3.3. 配置
17.3.4. 首次启动
17.3.5. 加载示例数据并执行查询
17.3.6. 安全关闭和重启
17.4.
MySQL
簇的配置
17.4.1. 从源码创建
MySQL
簇
17.4.2. 安装软件
17.4.3.
MySQL
簇的快速测试设置
17.4.4. 配置文件
17.5.
MySQL
簇
中
的进程管理
17.5.1. 用于
MySQL
簇的
MySQL
服务器进程使用
17.5.2. ndbd,存储引擎节点进程
17.5.3. ndb_mgmd,“管理服务器”进程
17.5.4. ndb_mgm,“管理客户端”进程
17.5.5. 用于
MySQL
簇进程的命令选项
17.6.
MySQL
簇的管理
17.6.1.
MySQL
簇的启动阶段
17.6.2. “管理客户端”
中
的命令
17.6.3.
MySQL
簇
中
生成的事件报告
17.6.4. 单用户模式
17.6.5.
MySQL
簇的联机备份
17.7. 使用与
MySQL
簇的高速互连
17.7.1. 配置
MySQL
簇以使用SCI套接字
17.7.2. 理解簇互连的影响
17.8.
MySQL
簇的已知限制
17.9.
MySQL
簇发展的重要历程
17.9.1.
MySQL
5.0
中
的
MySQL
簇变化
17.9.2. 关于
MySQL
簇的
MySQL
5.1发展历程
17.10.
MySQL
簇常见问题解答
17.11.
MySQL
簇术语表
18. 分区
18.1.
MySQL
中
的分区概述
18.2. 分区
类型
18.2.1. RANGE分区
18.2.2. LIST分区
18.2.3. HASH分区
18.2.4. KEY分区
18.2.5. 子分区
18.2.6.
MySQL
分区处理NULL值的方式
18.3. 分区管理
18.3.1. RANGE和LIST分区的管理
18.3.2. HASH和KEY分区的管理
18.3.3. 分区维护
18.3.4. 获取关于分区的信息
19.
MySQL
中
的空间扩展
19.1. 前言
19.2. OpenGIS几何模型
19.2.1. Geometry类的层次
19.2.2. 类Geometry
19.2.3. 类Point
19.2.4. 类Curve
19.2.5. 类LineString
19.2.6. 类Surface
19.2.7. 类Polygon
19.2.8. 类GeometryCollection
19.2.9. 类MultiPoint
19.2.10. 类MultiCurve
19.2.11. 类MultiLineString
19.2.12. 类MultiSurface
19.2.13. 类MultiPolygon
19.3. 支持的空间数据格式
19.3.1. 著名的文本(WKT)格式
19.3.2. 著名的二进制(WKB)格式
19.4. 创建具备空间功能的
MySQL
数据库
19.4.1.
MySQL
空间数据
类型
19.4.2. 创建空间值
19.4.3. 创建空间列
19.4.4. 填充空间列
19.4.5. 获取空间数据
19.5. 分析空间信息
19.5.1. Geometry格式转换函数
19.5.2. Geometry函数
19.5.3. 从已有Geometry创建新Geometry的函数
19.5.4. 测试几何对象间空间关系的函数
19.5.5. 关于几何最小边界矩形(MBR)的关系
19.5.6. 测试几何类之间空间关系的函数
19.6. 优化空间分析
19.6.1. 创建空间索引
19.6.2. 使用空间索引
19.7.
MySQL
的一致性和兼容性
19.7.1. 尚未实施的GIS特性
20. 存储程序和函数
20.1. 存储程序和授权表
20.2. 存储程序的语法
20.2.1. CREATE PROCEDURE和CREATE FUNCTION
20.2.2. ALTER PROCEDURE和ALTER FUNCTION
20.2.3. DROP PROCEDURE和DROP FUNCTION
20.2.4. SHOW CREATE PROCEDURE和SHOW CREATE FUNCTION
20.2.5. SHOW PROCEDURE STATUS和SHOW FUNCTION STATUS
20.2.6. CALL语句
20.2.7. BEGIN ... END复合语句
20.2.8. DECLARE语句
20.2.9. 存储程序
中
的变量
20.2.10. 条件和处理程序
20.2.11. 光标
20.2.12. 流程控制构造
20.3. 存储程序、函数、触发程序和复制:常见问题
20.4. 存储子程序和触发程序的二进制日志功能
21. 触发程序
21.1. CREATE TRIGGER语法
21.2. DROP TRIGGER语法
21.3. 使用触发程序
22. 视图
22.1. ALTER VIEW语法
22.2. CREATE VIEW语法
22.3. DROP VIEW语法
22.4. SHOW CREATE VIEW语法
23. INFORMATION_SCHEMA信息数据库
23.1. INFORMATION_SCHEMA表
23.1.1. INFORMATION_SCHEMA SCHEMATA表
23.1.2. INFORMATION_SCHEMA TABLES表
23.1.3. INFORMATION_SCHEMA COLUMNS表
23.1.4. INFORMATION_SCHEMA STATISTICS表
23.1.5. INFORMATION_SCHEMA USER_PRIVILEGES表
23.1.6. INFORMATION_SCHEMA SCHEMA_PRIVILEGES表
23.1.7. INFORMATION_SCHEMA TABLE_PRIVILEGES表
23.1.8. INFORMATION_SCHEMA COLUMN_PRIVILEGES表
23.1.9. INFORMATION_SCHEMA CHARACTER_SETS表
23.1.10. INFORMATION_SCHEMA COLLATIONS表
23.1.11. INFORMATION_SCHEMA COLLATION_CHARACTER_SET_APPLICABILITY表
23.1.12. INFORMATION_SCHEMA TABLE_CONSTRAINTS表
23.1.13. INFORMATION_SCHEMA KEY_COLUMN_USAGE表
23.1.14. INFORMATION_SCHEMA ROUTINES表
23.1.15. INFORMATION_SCHEMA VIEWS表
23.1.16. INFORMATION_SCHEMA TRIGGERS表
23.1.17. 其他INFORMATION_SCHEMA表
23.2. SHOW语句的扩展
24. 精度数学
24.1. 数值的
类型
24.2. DECIMAL数据
类型
更改
24.3. 表达式处理
24.4. 四舍五入
24.5. 精度数学示例
25. API和库
25.1. lib
mysql
d,嵌入式
MySQL
服务器库
25.1.1. 嵌入式
MySQL
服务器库概述
25.1.2. 使用lib
mysql
d编译程序
25.1.3. 使用嵌入式
MySQL
服务器时的限制
25.1.4. 与嵌入式服务器一起使用的选项
25.1.5. 嵌入式服务器
中
尚需完成的事项(TODO)
25.1.6. 嵌入式服务器示例
25.1.7. 嵌入式服务器的许可
25.2.
MySQL
C API
25.2.1. C API数据
类型
25.2.2. C API函数概述
25.2.3. C API函数描述
25.2.4. C API预处理语句
25.2.5. C API预处理语句的数据
类型
25.2.6. C API预处理语句函数概述
25.2.7. C API预处理语句函数描述
25.2.8. C API预处理语句方面的问题
25.2.9. 多查询执行的C API处理
25.2.10.
日期
和时间值的C API处理
25.2.11. C API线程函数介绍
25.2.12. C API嵌入式服务器函数介绍
25.2.13. 使用C API时的常见问题
25.2.14. 创建客户端程序
25.2.15. 如何生成线程式客户端
25.3.
MySQL
PHP API
25.3.1. 使用
MySQL
和PHP的常见问题
25.4.
MySQL
Perl API
25.5.
MySQL
C++ API
25.5.1. Borland C++
25.6.
MySQL
Python API
25.7.
MySQL
Tcl API
25.8.
MySQL
Eiffel Wrapper
25.9.
MySQL
程序开发实用工具
25.9.1. m
sql
2
mysql
:转换m
SQL
程序以用于
MySQL
25.9.2.
mysql
_config:获取编译客户端的编译选项
26. 连接器
26.1.
MySQL
Connector/ODBC
26.1.1. MyODBC介绍
26.1.2. 关于ODBC和MyODBC的一般信息
26.1.3. 如何安装MyODBC
26.1.4. 在Windows平台上从二进制版本安装MyODBC
26.1.5. I在Unix平台上从二进制版本安装MyODBC
26.1.6. 在Windows平台上从源码版本安装MyODBC
26.1.7. 在Unix平台上从源码版本安装MyODBC
26.1.8. 从BitKeeper开发源码树安装MyODBC
26.1.9. MyODBC配置
26.1.10. 与MyODBC连接相关的事宜
26.1.11. MyODBC和Microsoft Access
26.1.12. MyODBC和Microsoft VBA及ASP
26.1.13. MyODBC和第三方ODBC工具
26.1.14. MyODBC通用功能
26.1.15. 基本的MyODBC应用步骤
26.1.16. MyODBC API引用
26.1.17. MyODBC数据
类型
26.1.18. MyODBC错误代码
26.1.19. MyODBC与VB:ADO、DAO和RDO
26.1.20. MyODBC与Microsoft.NET
26.1.21. 感谢
26.2.
MySQL
Connector/NET
26.2.1. 前言
26.2.2. 下载并安装
MySQL
Connector/NET
26.2.3. Connector/NET体系结构
26.2.4. 使用
MySQL
Connector/NET
26.2.5.
MySQL
Connector/NET变更史
26.3.
MySQL
Connector/J
26.3.1. 基本的JDBC概念
26.3.2. 安装 Connector/J
26.3.3. JDBC引用
26.3.4. 与J2EE和其他Java框架一起使用 Connector/J
26.3.5. 诊断 Connector/J方面的问题
26.3.6. Changelog
26.4.
MySQL
Connector/MXJ
26.4.1. 前言
26.4.2. 支持平台:
26.4.3. Junit测试要求
26.4.4. 运行Junit测试
26.4.5. 作为JDBC驱动程序的一部分运行
26.4.6. 在Java对象
中
运行
26.4.7.
Mysql
dResource API
26.4.8. 在JMX代理(custom)
中
运行
26.4.9. 部署在标准的JMX代理环境下 (JBoss)
26.4.10. 安装
27. 扩展
MySQL
27.1.
MySQL
内部控件
27.1.1.
MySQL
线程
27.1.2.
MySQL
测试套件
27.2. 为
MySQL
添加新函数
27.2.1. 自定义函数接口的特性
27.2.2. CREATE FUNCTION/DROP FUNCTION语法
27.2.3. 添加新的自定义函数
27.2.4. 添加新的固有函数
27.3. 为
MySQL
添加新步骤
27.3.1. 步骤分析
27.3.2. 编写步骤
A. 问题和常见错误
A.1. 如何确定导致问题的原因
A.2. 使用
MySQL
程序时的常见错误
A.2.1. 拒绝访问
A.2.2. 无法连接到[local]
MySQL
服务器
A.2.3. 客户端不支持鉴定协议
A.2.4. 输入密码时出现密码错误
A.2.5. 主机的host_name被屏蔽
A.2.6. 连接数过多
A.2.7. 内存溢出
A.2.8.
MySQL
服务器不可用
A.2.9. 信息包过大
A.2.10. 通信错误和失效连接
A.2.11. 表已满
A.2.12. 无法创建文件/写入文件
A.2.13. 命令不同步
A.2.14. 忽略用户
A.2.15. 表tbl_name不存在
A.2.16. 无法初始化
字符
集
A.2.17. 文件未找到
A.3. 与安装有关的事宜
A.3.1. 与
MySQL
客户端库的链接问题
A.3.2. 如何以普通用户身份运行
MySQL
A.3.3. 与文件许可有关的问题
A.4. 与管理有关的事宜
A.4.1. 如何复位根用户密码
A.4.2. 如果
MySQL
依然崩溃,应作些什么
A.4.3.
MySQL
处理磁盘满的方式
A.4.4.
MySQL
将临时文件储存在哪里
A.4.5. 如何保护或更改
MySQL
套接字文件/tmp/
mysql
.sock
A.4.6. 时区问题
A.5. 与查询有关的事宜
A.5.1. 搜索
中
的大小写敏感性
A.5.2. 使用DATE列方面的问题
A.5.3. 与NULL值有关的问题
alter table user modify tel
varchar
(15) default ‘02087654321’;
修改tel列的位置,在第一列显示
alter table user modify tel
varchar
(15) default '02087654321' first;
修改tel列的位置,在指定列之后显示
alter table user modify tel
varchar
(15) default '02087654321' after age;
注意:alter modify不支持一次修改多个列,但是Oracle支持多列修改
但是
MySQL
可以通过多个modify的方式完成:
alter table user
modify tel
varchar
(15) default '02087654321' first,
modify name
varchar
(20) after tel;
11、 删除指定字段
alter table user drop photo;
12、 重命名表数据
alter table user rename to users;
字段重命名
alter table users change name u_name
varchar
(10);
alter table users change sex u_sex
varchar
(10) after u_name;
如果需要改变列名建议使用change,如果需要改变数据
类型
和显示位置可以使用modify
13、 删除表
drop table users;
drop删除表会删除表结构,表对象将不存在数据
中
;数据也不会存在;表内的对象也不存在,如:索引、视图、约束;
truncate删除表
truncate都被当成DDL出来,truncate的作用就是删除该表里的全部数据,保留表结构。相当于DDL
中
的delete语句,
但是truncate比delete语句的速度要快得多。但是truncate不能带条件删除指定数据,只会删除所有的数据。如果删除的表有外键,
删除的速度类似于delete。但新版本的
MySQL
中
truncate的速度比delete速度快。
MySQL
中
约束保存在information_schema数据库的table_constraints
中
,可以通过该表查询约束信息;
约束主要完成对数据的检验,保证数据库数据的完整性;如果有相互依赖数据,保证该数据不被删除。
常用五类约束:
not null:非空约束,指定某列不为空
unique: 唯一约束,指定某列和几列组合的数据不能重复
primary key:主键约束,指定某列的数据不能重复、唯一
foreign key:外键,指定该列记录属于主表
中
的一条记录,参照另一条数据
check:检查,指定一个表达式,用于检验指定数据
MySQL
不支持check约束,但可以使用check约束,而没有任何效果;
根据约束数据列限制,约束可分为:
单列约束:每个约束只约束一列
多列约束:每个约束约束多列数据
MySQL
中
约束保存在information_schema数据库的table_constraints
中
,可以通过该表查询约束信息;
1、 not null约束
非空约束用于确保当前列的值不为空值,非空约束只能出现在表对象的列上。
Null
类型
特征:
所有的
类型
的值都可以是null,包括int、float等数据
类型
空
字符
串“”是不等于null,0也不等于null
create table temp(
id int not null,
name
varchar
(255) not null default ‘abc’,
sex char null
上面的table加上了非空约束,也可以用alter来修改或增加非空约束
增加非空约束
alter table temp
modify sex
varchar
(2) not null;
取消非空约束
alter table temp modify sex
varchar
(2) null;
取消非空约束,增加默认值
alter table temp modify sex
varchar
(2) default ‘abc’ null;
2、 unique
唯一约束是指定table的列或列组合不能重复,保证数据的唯一性。虽然唯一约束不允许出现重复的值,但是可以为多个null
同一个表可以有多个唯一约束,多个列组合的约束。在创建唯一约束的时候,如果不给唯一约束名称,就默认和列名相同。
唯一约束不仅可以在一个表内创建,而且可以同时多表创建组合唯一约束。
MySQL
会给唯一约束的列上默认创建一个唯一索引;
create table temp (
id int not null,
name
varchar
(25),
password
varchar
(16),
--使用表级约束语法,
constraint uk_name_pwd unique(name, password)
表示用户名和密码组合不能重复
添加唯一约束
alter table temp add unique(name, password);
alter table temp modify name
varchar
(25) unique;
alter table temp drop index name;
3、 primary key
主键约束相当于唯一约束+非空约束的组合,主键约束列不允许重复,也不允许出现空值;如果的多列组合的主键约束,
那么这些列都不允许为空值,并且组合的值不允许重复。
每个表最多只允许一个主键,建立主键约束可以在列级别创建,也可以在表级别上创建。
MySQL
的主键名总是PRIMARY,
当创建主键约束时,系统默认会在所在的列和列组合上建立对应的唯一索引。
create table temp(
/*主键约束*/
id int primary key,
name
varchar
(25)
create table temp2(
id int not null,
name
varchar
(25),
pwd
varchar
(15),
constraint pk_temp_id primary key(id)
组合模式:
create table temp2(
id int not null,
name
varchar
(25),
pwd
varchar
(15),
constraint pk_temp_id primary key(name, pwd)
alter删除主键约束
alter table temp drop primary key;
alter添加主键
alter table temp add primary key(name, pwd);
alter修改列为主键
alter table temp modify id int primary key;
设置主键自增
create table temp(
id int auto_increment primary key,
name
varchar
(20),
pwd
varchar
(16)
auto_increment自增模式,设置自增后在插入数据的时候就不需要给该列插入值了。
4、 foreign key 约束
外键约束是保证一个或两个表之间的参照完整性,外键是构建于一个表的两个字段或是两个表的两个字段之间的参照关系。
也就是说从表的外键值必须在主表
中
能找到或者为空。
当主表的记录被从表参照时,主表的记录将不允许删除,如果要删除数据,需要先删除从表
中
依赖该记录的数据,
然后才可以删除主表的数据。还有一种就是级联删除子表数据。
注意:外键约束的参照列,在主表
中
引用的只能是主键或唯一键约束的列,假定引用的主表列不是唯一的记录,
那么从表引用的数据就不确定记录的位置。同一个表可以有多个外键约束。
创建外键约束:
create table classes(
id int auto_increment primary key,
name
varchar
(20)
create table student(
id int auto_increment,
name
varchar
(22),
constraint pk_id primary key(id),
classes_id int references classes(id)
通常先建主表,然后再建从表,这样从表的参照引用的表才存在。
表级别创建外键约束:
create table student(
id int auto_increment primary key,
name
varchar
(25),
classes_id int,
foreign key(classes_id) references classes(id)
上面的创建外键的方法没有指定约束名称,系统会默认给外键约束分配外键约束名称,命名为student_ibfk_n,
其
中
student是表名,n是当前约束从1开始的整数。
指定约束名称:
create table student(
id int auto_increment primary key,
name
varchar
(25),
classes_id int,
/*指定约束名称*/
constraint fk_classes_id foreign key(classes_id) references classes(id)
多列外键组合,必须用表级别约束语法:
create table classes(
id int,
name
varchar
(20),
number int,
primary key(name, number)
create table student(
id int auto_increment primary key,
name
varchar
(20),
classes_name
varchar
(20),
classes_number int,
/*表级别联合外键*/
foreign key(classes_name, classes_number) references classes(name, number)
删除外键约束:
alter table student drop foreign key student_ibfk_1;
alter table student drop foreign key fk_student_id;
增加外键约束
alter table student add foreign key(classes_name, classes_number) referencesclasses(name, number);
自引用、自关联(递归表、树状表)
create table tree(
id int auto_increment primary key,
name
varchar
(50),
parent_id int,
foreign key(parent_id) references tree(id)
级联删除:删除主表的数据时,关联的从表数据也删除,则需要在建立外键约束的后面增加on deletecascade
或on delete set null,前者是级联删除,后者是将从表的关联列的值设置为null。
create table student(
id int auto_increment primary key,
name
varchar
(20),
classes_name
varchar
(20),
classes_number int,
/*表级别联合外键*/
foreign key(classes_name, classes_number) references classes(name, number) on deletecascade
5、 check约束
MySQL
可以使用check约束,但check约束对数据验证没有任何作用。
create table temp(
id int auto_increment,
name
varchar
(20),
age int,
primary key(id),
/*check约束*/
check(age > 20)
上面check约束要求age必须大于0,但没有任何作用。但是创建table的时候没有任何错误或警告。
索引是存放在模式(schema)
中
的一个数据库对象,索引的作用就是提高对表的检索查询速度,
索引是通过快速访问的方法来
进行
快速定位数据,从而减少了对磁盘的读写
操作
。
索引是数据库的一个对象,它不能独立存在,必须对某个表对象
进行
依赖。
提示:索引保存在information_schema数据库里的STATISTICS表
中
。
创建索引方式:
自动:当表上定义主键约束、唯一、外键约束时,该表会被系统自动添加上索引。
手动:手动在相关表或列上增加索引,提高查询速度。
删除索引方式:
自动:当表对象被删除时,该表上的索引自动被删除
手动:手动删除指定表对象的相关列上的索引
索引类似于书籍的目录,可以快速定位到相关的数据,一个表可以有多个索引。
创建索引:
create index idx_temp_name on temp(name);
组合索引:
create index idx_temp_name$pwd on temp(name, pwd);
删除索引:
drop index idx_temp_name on temp;
视图就是一个表或多个表的查询结果,它是一张虚拟的表,因为它并不能存储数据。
视图的作用、优点:
限制对数据的访问
让复杂查询变得简单
提供数据的独立性
可以完成对相同数据的不同显示
创建、修改视图
create or replace view view_temp
select name, age from temp;
通常我们并不对视图的数据做修改
操作
,因为视图是一张虚拟的表,它并不存储实际数据。如果想让视图不被修改,可以用with check option来完成限制。
create or replace view view_temp
select * from temp
with check option;
修改视图:
alter view view_temp
select id, name from temp;
删除视图:
drop view view_temp;
显示创建语法:
show create view v_temp;
Ø DML语句
DML主要针对数据库表对象的数据而言的,一般DML完成:
插入新数据
修改已添加的数据
删除不需要的数据
1、 insert into 插入语句
insert into temp values(null, ‘jack’, 25);
主键自增可以不插入,所以用null代替
insert into temp(name, age) values(‘jack’, 22);
在表面后面带括号,括号
中
写列名,values
中
写指定列名的值即可。当省略列名就表示插入全部数据,
注意插入值的顺序和列的顺序需要保持一致。
Set方式插入,也可以指定列
insert into temp set id = 7, name = 'jason';
MySQL
中
外键的table的外键引用列可以插入数据可以为null,不参照主表的数据。
使用子查询插入数据
insert into temp(name) select name from classes;
insert into temp values(null, ‘jack’, 22), (null, ‘jackson’ 23);
2、 update 修改语句
update主要完成对数据的修改
操作
,可以修改一条或多条数据。修改多条或指定条件的数据,需要用where条件来完成。
修改所有数据
update temp set name = ‘jack2’;
所有的数据的name会被修改,如果修改多列用“,”分开
update temp set name = ‘jack’, age = 22;
修改指定条件的记录需要用where
update temp set name = ‘jack’ where age > 22;
3、 delete 删除语句
删除table
中
的数据,可以删除所有,带条件可以删除指定的记录。
删除所有数据
delete from temp;
删除指定条件数据
delete from temp where age > 20;
Ø select 查询、function 函数
select查询语句用得最广泛、功能也最丰富。可以完成单条记录、多条记录、单表、多表、子查询等。
1、 查询某张表所有数据
select * from temp;
*代表所有列,temp代表表名,不带条件就查询所有数据
2、 查询指定列和条件的数据
select name, age from temp where age = 22;
查询name和age这两列,age 等于22的数据。
3、 对查询的数据
进行
运算
操作
select age + 2, age / 2, age – 2, age * 2 from temp where age – 2 > 22;
4、 concat函数,
字符
串连接
select concat(name, ‘-eco’) from temp;
concat和null
进行
连接,会导致连接后的数据成为null
5、 as 对列重命名
select name as ‘名称’ from temp;
as也可以省略不写,效果一样
如果重命名的列名出现特殊
字符
,如“‘”单引号,那就需要用双引号引在外面
select name as “名’称” from temp;
6、 也可以给table去别名
select t.name Name from temp as t;
7、 查询常量
类似于
SQL
Server
select 5 + 2;
select concat('a', 'bbb');
8、 distinct 去掉重复数据
select distinct id from temp;
多列将是组合的重复数据
select distinct id, age from temp;
9、 where 条件查询
大于>、大于等于>=、小于<、小于等于<=、等于=、不等于
都可以出现在where语句
中
select * from t where a > 2 or a >= 3 or a < 5 or a <= 6 or a = 7 or a 0;
10、 and 并且
select * from temp where age > 20 and name = ‘jack’;
查询名称等于jack并且年龄大于20的
11、 or 或者
满足一个即可
select * from tmep where name = ‘jack’ or name = ‘jackson’;
12、 between v and v2
大于等于v且小于等于v2
select * form temp where age between 20 and 25;
13、 in 查询
可以多个条件 类似于or
select * from temp where id in (1, 2, 3);
查询id在括号
中
出现的数据
14、 like 模糊查询
查询name以j开头的
select * from temp where name like ‘j%’;
查询name包含k的
select * from temp where name like ‘%k%’;
escape转义
select * from temp where name like ‘/_%’ escape ‘/’;
指定/为转义
字符
,上面的就可以查询name
中
包含“_”的数据
15、 is null、is not null
查询为null的数据
select * from temp where name is null;
查询不为null的数据
select * from temp where name is not null;
16、 not
select * from temp where not (age > 20);
取小于等于20的数据
select * from temp where id not in(1, 2);
17、 order by
排序
,有desc、asc升序、降序
select * from temp order by id;
默认desc
排序
select * from temp order by id asc;
select * from temp order by id, age;
Ø function 函数
函数的作用
比较
大,一般多用在select查询语句和where条件语句之后。按照函数返回的结果,
可以分为:多行函数和单行函数;所谓的单行函数就是将每条数据
进行
独立的计算,然后每条数据得到一条结果。
如:
字符
串函数;而多行函数,就是多条记录同时计算,得到最终只有一条结果记录。如:sum、avg等
多行函数也称为聚集函数、分组函数,主要用于完成一些统计功能。
MySQL
的单行函数有如下特征:
单行函数的参数可以是变量、常量或数据列。单行函数可以接受多个参数,但返回一个值。
单行函数就是它会对每一行单独起作用,每一行(可能包含多个参数)返回一个结果。
单行函数可以改变参数的数据
类型
。单行函数支持嵌套使用:内层函数的返回值是外层函数的参数。
单行函数可以分为:
类型
转换函数;
流程控制语句;
加密解密函数;
1、 char_length
字符
长度
select char_length(tel) from user;
2、 sin函数
select sin(age) from user;
select sin(1.57);
3、 添加
日期
函数
select date_add('2010-06-21', interval 2 month);
interval是一个关键字,2 month是2个月的意思,2是数值,month是单位
select addDate('2011-05-28', 2);
在前面的
日期
上加上后面的天数
4、 获取当前系统时间、
日期
select curdate();
select curtime();
5、 加密函数
select md5('zhangsan');
6、 Null 处理函数
select ifnull(birthday, 'is null birthday') from user;
如果birthday为null,就返回后面的
字符
串
select nullif(age, 245) from user;
如果age等于245就返回null,不等就返回age
select isnull(birthday) from user;
判断birthday是否为null
select if(isnull(birthday), 'birthday is null', 'birthday not is null') from user;
如果birthday为null或是0就返回birthday is null,否则就返回birthday not is null;类似于三目运算符
7、 case 流程函数
case函数是一个流程控制函数,可以接受多个参数,但最终只会返回一个结果。
select name,
(case sex
when 1 then '男'
when 0 then '女'
else '火星人'
) sex
from user;
组函数就是多行函数,组函数是完成一行或多行结果集的运算,最后返回一个结果,而不是每条记录返回一个结果。
1、 avg平均值运算
select avg(age) from user;
select avg(distinct age) from user;
2、 count 记录条数统计
select count(*), count(age), count(distinct age) from user;
3、 max 最大值
select max(age), max(distinct age) from user;
4、 min 最小值
select min(age), min(distinct age) from user;
5、 sum 求和、聚和
select sum(age), sum(distinct age) from user;
select sum(ifnull(age, 0)) from user;
6、 group by 分组
select count(*), sex from user group by sex;
select count(*) from user group by age;
select * from user group by sex, age;
7、 having
进行
条件过滤
不能在where子句
中
过滤组,where子句仅用于过滤行。过滤group by需要having
不能在where子句
中
用组函数,having
中
才能用组函数
select count(*) from user group by sex having sex 2;
Ø 多表查询和子查询
数据库的查询功能最为丰富,很多时候需要用到查询完成一些事物,而且不是单纯的对一个表
进行
操作
。而是对多个表
进行
联合查询,
MySQL
中
多表连接查询有两种规范,较早的
SQL
92规范支持,如下几种表连接查询:
非等值连接
广义笛卡尔积
SQL
99规则提供了可读性更好的多表连接语法,并提供了更多
类型
的连接查询,
SQL
99支持如下几种多表连接查询:
使用using子句的连接
使用on子句连接
全部连接或者左右外连接
SQL
92的连接查询
SQL
92的连接查询语法
比较
简单,多将多个table放置在from关键字之后,多个table用“,”隔开;
连接的条件放在where条件之后,与查询条件直接用and逻辑运算符
进行
连接。如果条件
中
使用的是相等,
则称为等值连接,相反则称为非等值,如果没有任何条件则称为广义笛卡尔积。
广义笛卡尔积:select s.*, c.* from student s, classes c;
等值:select s.*, c.* from student s, classes c where s.cid = c.id;
非等值:select s.*, c.* from student s, classes c where s.cid c.id;
select s.*, c.name classes from classes c, student s where c.id = s.classes_id ands.name is not null;
SQL
99连接查询
1、交叉连接cross join,类似于
SQL
92的笛卡尔积查询,无需条件。如:
select s.*, c.name from student s cross join classes c;
2、自然连接 natural join查询,无需条件,默认条件是将2个table
中
的相同字段作为连接条件,如果没有相同字段,查询的结果就是空。
select s.*, c.name from student s natural join classes c;
3、using子句连接查询:using的子句可以是一列或多列,显示的指定两个表
中
同名列作为连接条件。
如果用natural join的连接查询,会把所有的相同字段作为连接查询。而using可以指定相同列及个数。
select s.*, c.name from student s join classes c using(id);
4、 join … on连接查询,查询条件在on
中
完成,每个on语句只能指定一个条件。
select s.*, c.name from student s join classes c on s.classes_id = c.id;
5、 左右外连接:3种外连接,left [outer] join、right [outer] join,连接条件都是通过用on子句来指定,条件可以等值、非等值。
select s.*, c.name from student s left join classes c on s.classes_id = c.id;
select s.*, c.name from student s right join classes c on s.classes_id = c.id;
子查询就是指在查询语句
中
嵌套另一个查询,子查询可以支持多层嵌套。子查询可以出现在2个位置:
from关键字之后,被当做一个表来
进行
查询,这种用法被称为行内视图,因为该子查询的实质就是一个临时视图
出现在where条件之后作为过滤条件的值
子查询注意点:
子查询用括号括起来,特别情况下需要起一个临时名称
子查询当做临时表时(在from之后的子查询),可以为该子查询起别名,尤其是要作为前缀来限定数据列名时
子查询用作过滤条件时,将子查询放在
比较
运算符的右边,提供可读性
子查询作为过滤条件时,单行子查询使用单行运算符,多行子查询用多行运算符
将from后面的子查询当做一个table来用:
select * from (select id, name from classes) s where s.id in (1, 2);
当做条件来用:
select * from student s where s.classes_id in (select id from classes);
select * from student s where s.classes_id = any (select id from classes);
select * from student s where s.classes_id > any (select id from classes);
Ø
操作
符和函数
1、 boolean只判断
select 1 is true, 0 is false, null is unknown;
select 1 is not unknown, 0 is not unknown, null is not unknown;
2、 coalesce函数,返回第一个非null的值
select coalesce(null, 1);
select coalesce(1, 1);
select coalesce(null, 1);
select coalesce(null, null);
3、 当有2个或多个参数时,返回最大的那个参数值
select greatest(2, 3);
select greatest(2, 3, 1, 9, 55, 23);
select greatest('D', 'A', 'B');
4、 Least函数,返回最小值,如果有null就返回null值
select least(2, 0);
select least(2, 0, null);
select least(2, 10, 22.2, 35.1, 1.1);
5、 控制流函数
select case 1 when 1 then 'is 1' when 2 then 'is 2' else 'none' end;
select case when 1 > 2 then 'yes' else 'no' end;
6、 ascii
字符
串函数
select ascii('A');
select ascii('1');
7、 二进制函数
select bin(22);
8、 返回二进制
字符
串长度
select bit_length(11);
9、 char将值转换成
字符
,小数取整四舍五入
select char(65);
select char(65.4);
select char(65.5);
select char(65.6);
select char(65, 66, 67.4, 68.5, 69.6, '55.5', '97.3');
10、 using改变
字符
集
select charset(char(0*65)), charset(char(0*65 using utf8));
11、 得到
字符
长度char_length,character_length
select char_length('abc');
select character_length('eft');
12、 compress压缩
字符
串、uncompress解压缩
select compress('abcedf');
select uncompress(compress('abcedf'));
13、 concat_ws分隔
字符
串
select concat_ws('#', 'first', 'second', 'last');
select concat_ws('#', 'first', 'second', null, 'last');
Ø 事务处理
开始事务:start transaction
提交事务:commit
回滚事务:rollback
设置自动提交:set autocommit 1 | 0
atuoCommit系统默认是1立即提交模式;如果要手动控制事务,需要设置set autoCommit 0;
这样我们就可以用commit、rollback来控制事务了。
在一段语句块
中
禁用autocommit 而不是set autocommit
start transaction;
select @result := avg(age) from temp;
update temp set age = @result where id = 2;
select * from temp where id = 2;//值被改变
rollback;//回滚
select * from temp where id = 2;//变回来了
在此期间只有遇到commit、rollback,start Transaction的禁用autocommit才会结束。然后就恢复到原来的autocommit模式;
不能回滚的语句
有些语句不能被回滚。通常,这些语句包括数据定义语言(DDL)语句,比如创建或取消数据库的语句,
和创建、取消或更改表或存储的子程序的语句。
您在设计事务时,不应包含这类语句。如果您在事务的前部
中
发布了一个不能被回滚的语句,
则后部的其它语句会发生错误,在这些情况下,通过发布ROLLBACK语句不能 回滚事务的全部效果。
一些
操作
也会隐式的提交事务
如alter、create、drop、rename table、lock table、set autocommit、starttransaction、truncate table 等等,
在事务
中
出现这些语句也会提交事务的
事务不能嵌套事务
事务的保存点
Savepoint pointName/Rollback to savepoint pointName
一个事务可以设置多个保存点,rollback可以回滚到指定的保存点,恢复保存点后面的
操作
。
如果有后面的保存点和前面的同名,则删除前面的保存点。
Release savepoint会删除一个保存点,如果在一段事务
中
执行commit或rollback,则事务结束,所以保存点删除。
Set Transaction设计数据库隔离级别
SET [GLOBAL | SESSION] TRANSACTION ISOLATION LEVEL
{ READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE }
本语句用于设置事务隔离等级,用于下一个事务,或者用于当前会话。
在默认情况下,SET TRANSACTION会为下一个事务(还未开始)设置隔离等级。
如果您使用GLOBAL关键词,则语句会设置全局性的默认事务等级,
用于从该点以后创建的所有新连接。原有的连接不受影响。使用SESSION关键测可以设置默认事务等级,
用于对当前连接执行的所有将来事务。
默认的等级是REPEATABLE READ全局隔离等级。
select 1+1; # 单行注释
select 1+1; -- 单行注释
select 1 /* 多行注释 */ + 1;
Ø 基本数据
类型
操作
select 'hello', '"hello"', '""hello""', 'hel''lo', '/'hello';
select "hello", "'hello'", "''hello''", "hel""lo", "/"hello";
select 'This/nIs/nFour/nLines';
select 'hello / world!';
select 'hello /world!';
select 'hello // world!';
select 'hello /' world!';
Ø 设置数据库mode模式
SET
sql
_mode='ANSI_QUOTES';
create table t(a int);
create table "tt"(a int);
create table "t""t"(a int);
craate talbe tab("a""b" int);
Ø 用户变量
set @num1 = 0, @num2 = 2, @result = 0;
select @result := (@num1 := 5) + @num2 := 3, @num1, @num2, @result;
Ø 存储过程
创建存储过程:
delimiter //
create procedure get(out result int)
begin
select max(age) into result from temp;
end//
调用存储过程:
call get(@temp);
查询结果:
select @temp;
删除存储过程:
drop procedure get;
查看存储过程创建语句:
show create procedure get;
select…into 可以完成单行记录的赋值:
create procedure getRecord(sid int)
begin
declare v_name
varchar
(20) default 'jason';
declare v_age int;
declare v_sex bit;
select name, age, sex into v_name, v_age, v_sex from temp where id = sid;
select v_name, v_age, v_sex;
call getRecord(1);
函数类似于存储过程,只是调用方式不同
例如:select max(age) from temp;
创建函数:
create function addAge(age int) returns int
return age + 5;
使用函数:
select addAge(age) from temp;
删除函数:
drop function if exists addAge;
drop function addAge;
显示创建语法:
show create function addAge;
声明游标:declare cur_Name cursor for select name from temp;
打开游标:open cur_Name;
Fetch游标:fetch cur_Name into @temp;
关闭游标:close cur_Name;
CREATE PROCEDURE cur_show()
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE v_id, v_age INT;
DECLARE v_name
varchar
(20);
DECLARE cur_temp CURSOR FOR SELECT id, name, age FROM temp;
DECLARE CONTINUE HANDLER FOR
SQL
STATE '02000' SET done = 1;
OPEN cur_temp;
REPEAT
FETCH cur_temp INTO v_id, v_name, v_age;
IF NOT done THEN
IF isnull(v_name) THEN
update temp set name = concat('test-json', v_id) where id = v_id;
ELSEIF isnull(v_age) THEN
update temp set age = 22 where id = v_id;
END IF;
END IF;
UNTIL done END REPEAT;
CLOSE cur_temp;
Ø 触发器
触发器分为insert、update、delete三种触发器事件
类型
还有after、before触发时间
创建触发器:
create trigger trg_temp_ins
before insert
on temp for each row
begin
insert into temp_log values(NEW.id, NEW.name);
end//
删除触发器:
drop trigger trg_temp_ins
一般情况下数据库时间
类型
都是以datetime、timestamp等格式
进行
存储的 , 但有时也会出现
varchar
类型
, 这个时候在
sql
中
比较
时间
类型
就需要用到函数STR_TO_DATE(str, format);
STR_TO_DATE(str, format)函数是DATE_FORMAT()函数的反函数 , 返回一个DATETIME值。它需要一个
字符
串str和一个格式字...
如果要对数据库
中
某存储数字的列(存储
类型
不为int)
进行
排序
,可以在order by 里对该列
进行
转换,
即如 order by cast(mycolumn as int) desc
转载于:https://www.cnblogs.com/dreamos/p/8919248.html...
(springmvc)页面找不到静态资源文件Failed to load resource: the server responded with a status of 404 (Not Found)
86769