MySQL是一个关系型数据库管理系统。
与其他的大型数据库例如Oracle、DB2、SQL Server等相比,MySQL自有它的不足之处,如规模小、功能有限(MySQL Cluster的功能和效率都相对比较差)等,但是这丝毫也没有减少它受欢迎的程度。
由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,许多中小型网站为了降低网站总体拥有成本而选择了MySQL作为网站数据库。
对于一般的个人使用者和中小型企业来说,MySQL提供的功能已经绰绰有余,而且由于MySQL是开放源码软件,因此可以大大降低总体拥有成本。
MYSQL的特性:
- 使用C和C++编写,并使用了多种编译器进行测试,保证源代码的可移植性
- 支持AIX、FreeBSD、HP-UX、Linux、Mac OS、Novell Netware、OpenBSD、OS/2 Wrap、Solaris、Windows等多种操作系统
- 为多种编程语言提供了API。这些编程语言包括C、C++、Eiffel、Java、Perl、PHP、Python、Ruby和Tcl等。
- 支持多线程,充分利用CPU资源
- 优化的SQL查询算法,有效地提高查询速度
- 既能够作为一个单独的应用程序应用在客户端服务器网络环境中,也能够作为一个库而嵌入到其他的软件中提供多语言支持,常见的编码如中文的GB 2312、BIG5,日文的Shift_JIS等都可以用作数据表名和数据列名
- 提供TCP/IP、ODBC和JDBC等多种数据库连接途径
- 提供用于管理、检查、优化数据库操作的管理工具
- 可以处理拥有上千万条记录的大型数据库
MYSQL编程:
MYSQL的常用命令:
•显示所有数据库:show databases;
•选定默认数据库:use dbname;
•显示默认数据库中所有表:show tables;
•放弃正在输入的命令:\c
•显示命令清单:\h
•退出mysql程序:\q
•查看mysql服务器状态信息:\s
使用PL/SQL编程的优缺点:
使用纯sql语句来操作数据库,有技术缺陷
- 不能模块化编程,为了完成下订单,可能要发出几条sql
- 执行速度低
- 安全性问题
- 浪费带宽
- 多语言支持:Mysql为C、C++、Python、Java、Perl、PHP、Ruby等多种编程语言提供了API,访问和使用方便。
- 可以移植性好:MySQL是跨平台的。
- 免费开源。
- 高效:MySql的核心程序采用完全的多线程编程。
- 支持大量数据查询和存储:Mysql可以承受大量的并发访问。
使用pl/sql来编写过程,可以提高效率
缺点:移植性不高
SQL编程规范:
- 当定义变量时,建议用v_作为前缀v_sal
- 当定义常量时,建议用c_作为前缀c_rate
- 当定义游标时,建议用_cursor作为后缀emp_cursor;
- 当定义例外时,建议用e_做为前缀e_error;
MYSQL数据库的备份:
使用mysqldump命令备份
mysqldump命令可以将数据库中的数据备份成一个文本文件。表的结构和表中的数据将存储在生成的文本文件中。
mysqldump命令的工作原理很简单。它先查出需要备份的表的结构,再在文本文件中生成一个CREATE语句。然后,将表中的所有记录转换成一条INSERT语句。这些CREATE语句和INSERT语句都是还原时使用的。还原数据时就可以使用其中的CREATE语句来创建表。使用其中的INSERT语句来还原数据
Mysqldump常用参数:
•–all-databases , -A 导出全部数据库
•–add-drop-database 每个数据库创建之前添加drop数据库语句
•–no-data, -d 不导出任何数据,只导出数据库表结构。
•–no-create-db, -n只导出数据,而不添加CREATE DATABASE 语句。
•–no-create-info, -t 只导出数据,而不添加CREATE TABLE 语句。
MYSQL的独特代码:
MySQL中没有check约束,可以用enum类型,或触发器实现。
MySQL不支持InnoDB,解决办法:
/var/lib/mysql目录下,删除ibdata1、ib_logfile1、 ib_logfile0,然后重启MySql让其重建以上文件:
mysqladmin -uroot -p shutdown
sudo mysqld_safe &
MySQL中用正则表达式查询时不是匹配规则,而是包括。且规则有汉字时可能会出现问题。
MySQL触发器中不能用select语句。
MySQL存储过程中变量可以不用declare定义,变量不能带@。
MySQL查询页面中的变量不能用declare定义,直接使用即可,但是一定要有@。变量的生命周期到页面关闭,编译一次即可一直存在。
MySQL中没有top,可用limit 控制查询的行数。
MySQL在存储过程中对变量赋值,除set外可用 select … into 变量 …. ,但一定要确保查询的结果只有一个,可以用limit 1 确保。(不同于sql,↓)
MYSQL不支持:
Select * Into new_table_name from old_table_name;
替代方法:
Create table new_table_name (Select * from old_table_name);
MySQL触发器中的两张表是new和old。
MYSQL的updata语句不能做查询,例如 update 表 set id = (select id from 表 where …)
替代方法:
update 表 AS 表1 inner join 表 AS 表2 on 条件 set id = …
update 表 AS 表1 ,表 AS 表2 set id = … WHERE 条件