** 以下提到oracle部分只是对比扩展,本文重点是 《MySQL 深入浅出》书中1-17章节 个人觉得需要提笔一记的知识点整理。
** 该书讲解 VERSION() ==>’5.0.18-nt‘ ,默认引擎 : MyISAM
1、获取建表语句
mysql --> show create table emp \G;
oracle --> SELECT DBMS_METADATA.GET_DDL ('TABLE', '表名',user ) FROM DUAL;
2、一条insert 多行value值
mysql --> insert into table(id,name) values (1,'a'),(2,'b'),(3,'c');
oracle --> insert into table(id,name) select 1,'a' from dual union all select 2,'b' from dual union all select 3,'c' from dual ; 或者写多条insert语句;
3、限制/范围 行数
mysql --> limit [offset_start,row_count] offset_start 表示记录的起始偏移量{默认0},row_count 表示显示的行数
oracle --> rownum = n Oracle rownum 分页引起的效率问题及优化思路
4、更改表字段和表名字:
改字段名:
oracle:alter table emp rename column age to age1;
mysql :alter table emp change age age1 int (4) ;
oracle、mysql modify 都不能需要字段名称。
改表名字:oracle 和mysql 都是用rename emp to emp1或者 alter table emp rename to emp1 实现.
5、执行sql/存储 有警告/报错时 查看warning/error 详细信息
mysql --> show warnings;
oracle --> "SQL>show errors" 、 OS层$ oerr ora 00922
6、表结构设置 id int(5) zerofill 属性, 再insert 1111111位数为 7 不会报错,因为zerofill后,宽度格式限制失效,且也不会有填充0部分.
7、字段雷系TIMESTAMP(tm ),增加时,系统会自动给第一个timestamp字段 授予默认值 CURRENT_TIMESTAMP(系统日期),且可以直接写定制19700101080001数字形式 ....
8、now()函数 代表当前日期
9、year 年份部分 00 "到"69" 范围的值被转换为 2000~2069 范围的 YEAR 值 、"70" 到“99”范围的值被转换为 1970~1999 范围的 YEAR 值
10、mysql 3中注释符
1)#内容2)/*内容*/;
3)-- 内容 (提示--后要有空格)
11、 mysql 通过命令直接执行语句
[root@lottery ~]# mysql -uroot -p11 -N -e "use diamond; show tables;"
+-------------+
| config_info |
+-------------+
[root@lottery ~]#
-e 后面跟上要执行的 SQL语句
-N 参数是不显示表头
25章有详细介绍。
--------------------------------------------------------------以上为小知识点,小笔记------------------------------------------------------------------------------------------------------
一、
MySQL 中的字符类型 |
char 和varchar 类型
char(2)
insert '1' oracle数据库 length=2,mysql数据库 length=1,
insert '1空格' oracle length=2,mysql=1
varchar(2)
insert '1' oracle length=1,mysql=1 ,
insert '1空格' oracle length=2,mysql=2
|
二、
第四章 、MySQL 中的运算符 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
*** 实际上,我们都是用 “()” 来将需要优先的操作括起来,既起到优先作用也方便看.
|
三、
第五章 、MySQL常用函数
四、
|
五、
第7章 表类型(存储引擎)的选择 | |||||
1) MySQL 5.0 支持的存储引擎包括 MyISAM/InnoDB/BDB/MEMORY/MERGE/EXAMPLE/NDB/Cluster/ ARCHIVE/CSV/BLACKHOLE/FEDERATED 等,其中 InnoDB 和 BDB 提供事务安全表,其他存储引擎都是非事务安全表。 | |||||
2) 查看mysql当前默认的存储引擎: show variables like '%storage_engine%'; | |||||
3) 查询当前数据库支持的存储引擎的2种方式。 1. mysql> show engines; +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+ | Engine | Support | Comment | Transactions | XA | Savepoints | +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+ | PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO | | CSV | YES | CSV storage engine | NO | NO | NO | | MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO | | BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | NO | NO | NO | | MyISAM | YES | MyISAM storage engine | NO | NO | NO | | MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO | | ARCHIVE | YES | Archive storage engine | NO | NO | NO | | InnoDB | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES | YES | YES | | FEDERATED | NO | Federated MySQL storage engine | NULL | NULL | NULL | +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+ mysql> 2. SHOW VARIABLES LIKE 'have%'; | |||||
4) 更改表的存储引擎: alter table table_name engine = innodb; | |||||
5) 常用存储引擎的对比 | |||||
特点 | MyISAM | InnoDB | MEMORY | MERGE | NDB |
存储限制 | 有 | 64TB | 有 | 没有 | 有 |
事务安全 | 支持 | ||||
锁机制 | 表锁 | 行锁 | 表锁 | 表锁 | 行锁 |
B 树索引 | 支持 | 支持 | 支持 | 支持 | 支持 |
哈希索引 | 支持 | 支持 | |||
全文索引 | 支持 | ||||
集群索引 | 支持 | ||||
数据缓存 | 支持 | 支持 | 支持 | ||
索引缓存 | 支持 | 支持 | 支持 | 支持 | 支持 |
数据可压缩 | 支持 | ||||
空间使用 | 低 | 高 | N/A | 低 | 低 |
内存使用 | 低 | 高 | 中等 | 低 | 高 |
批量插入的速度 | 高 | 低 | 高 | 高 | 高 |
支持外键 | 支持 | ||||
mysql 非自动提交设置注意事项 (mysql默认是自动提交,根据业务去更改) 若表引擎不是innodb,即使设置=0 ,每执行也都会自动提交; 若innodb引擎,set auto_commit =1就会自动提交,=0就要手动commit; |
InnoDB 表的自动增长列 (关键字autoincre_demo)
insert 自动增长列 可以按照自动增长属性 insert数据 每行+1,也可以手动写定值,但当定值为 null或者0时,会按照自动增加列的max(id)+1增长.定值部分还是会正常insert.;
例如:若max(id)=300, 执行insert .. values(103,'1'),(0,'2'),(null,'3'); 对应insert成的数据为: (103,'1'),(301,'2'),(302,'3');
通过ALTER TABLE *** AUTO_INCREMENT = n; 语句强制设置自动增长列的初识值,默认从 1 开始,
但是该强制的默认值是保留在内存中的,如果该值在使用之前数据库重新启动,那么这个强制的默认值就会丢失,就需要在数据库启动以后重新设置。
可以使用select LAST_INSERT_ID()查询当前线程最后插入记录使用的值。如果一次插入了多条记录,那么返回的是第一条记录使用的自动增长值。下面的例子演示了使用 LAST_INSERT_ID() 的情况:
MEMORY 存储引擎
使用存在内存中的内容来创建表。每个 MEMORY 表只实际对应一个磁盘文件,格式是.frm。MEMORY 类型的表访问非常得快,因为它的数据是放在内存中的,并且默认使用 HASH 索引,但是一旦服务关闭,表中的数据就会丢失掉。给 MEMORY 表创建索引的时候,可以指定使用 HASH 索引还是 BTREE 索引:create index 索引名 USING HASH/BTREE on 表(列) ;
每个 MEMORY 表中可以放置的数据量的大小,受到 max_heap_table_size 系统变量的约束,这个系统变量的初始值是 16MB,可以按照需要加大。此外,在定义 MEMORY 表的时候,可以通过 MAX_ROWS 子句指定表的最大行数。
下面是常用存储引擎的适用环境。
** MyISAM :默认的 MySQL 插件式存储引擎。如果应用是以读操作和插入操作为主,只有很少的更新和删除操作,并且对事务的完整性、并发性要求不是很高,那么选择这个存储引擎是非常适合的。 MyISAM 是在 Web 、数据仓储和其他应用环境下最常使用的存储引擎之一。
** InnoDB :用于事务处理应用程序,支持外键。如果应用对事务的完整性有比较高的要求,在并发条件下要求数据的一致性,数据操作除了插入和查询以外,还包括很多的更新、删除操作,那么 InnoDB 存储引擎应该是比较合适的选择。InnoDB 存储引擎除了有效地降低由于删除和更新导致的锁定,还可以确保事务的完整提交( Commit)和回滚(Rollback),对于类似计费系统或者财务系统等对数据准确性要求比较高的系统, InnoDB 都是合适的选择。
** MEMORY :将所有数据保存在 RAM 中,在需要快速定位记录和其他类似数据的环境下,可提供极快的访问。 MEMORY 的缺陷是对表的大小有限制,太大的表无法 CACHE 在内存中,其次是要确保表的数据可以恢复,数据库异常终止后表中的数据是可以恢复的。MEMORY 表通常用于更新不太频繁的小表,用以快速得到访问结果。
** MERGE :用于将一系列等同的 MyISAM 表以逻辑方式组合在一起,并作为一个对象引用它们。 MERGE 表的优点在于可以突破对单个 MyISAM 表大小的限制,并且通过将不同的表分布在多个磁盘上,可以有效地改善 MERGE表的访问效率。这对于诸如数据仓储等 VLDB 环境十分适合。
注意:以上只是我们按照实施经验提出的关于存储引擎选择的一些建议,但是不同应用的特点是千差万别的,选择使用哪种存储引擎才是最佳方案也不是绝对的,这需要根据用户各自的应用进行测试,从而得到最适合自己的结果。
六、
第8章 选择合适的数据类型 | |||||
CHAR 和 VARCHAR | |||||
CHAR 和 VARCHAR 类型类似,都用来存储字符串,但它们保存和检索的方式不同。CHAR 属于固定长度的字符类型,而 VARCHAR 属于可变长度的字符类型。 | |||||
CHAR 和 VARCHAR 对比 | |||||
值 | CHAR(4) | 存储需求 | VARCHAR(4) | 存储需求 | |
'' | ' ' | 4 个字节 | '' | 1 个字节 | |
'ab' | 'ab ' | 4 个字节 | 'ab ' | 3 个字节 | |
'abcd' | 'abcd' | 4 个字节 | 'abcd' | 5 个字节 | |
'abcdefgh' | 'abcd' | 4 个字节 | 'abcd' | 5 个字节 | |
简单概括 不同的存储引擎对 CHAR 和 VARCHAR 的使用原则有所不同 。 MyISAM 存储引擎:建议使用固定长度的数据列代替可变长度的数据列。 MEMORY 存储引擎:目前都使用固定长度的数据行存储,因此无论使用 CHAR 或 VARCHAR 列都没有关系。两者都是作为 CHAR 类型处理。 InnoDB 存储引擎:建议使用 VARCHAR 类型。对于 InnoDB 数据表,内部的行存储格式没有区分固定长度和可变长度列(所有数据行都使用指向数据列值的头指针),因此在本质上,使用固定长度的 CHAR 列不一定比使用可变长度 VARCHAR 列性能要好。因而,主要的性能因素是数据行使用的存储总量。由于 CHAR 平均占用的空间多于 VARCHAR,因此使用 VARCHAR 来最小化需要处理的数据行的存储总量和磁盘 I/O 是比较好的。 | |||||
TEXT 与 BLOB | |||||
TEXT 或者 BLOB用来保存较大文本; 二者间主要差别是: BLOB 能用来保存二进制数据,比如照片; 而 TEXT 只能保存字符数据,比如一篇文章或者日记。 TEXT 和 BLOB 中有分别包括 TEXT、MEDIUMTEXT、LONGTEXT 和 BLOB、MEDIUMBLOB、LONGBLOB3 种不同的类型; 它们之间的主要区别是存储文本长度不同和存储字节不同,用户应该根据实际情况选择能够满足需求的最小存储类型。 BLOB 和 TEXT 值会引起一些性能问题,特别是在执行了大量的删除操作时。 删除操作会在数据表中留下很大的“空洞”,以后填入这些“空洞”的记录在插入的性能上会有影响。为了提高性能,建议定期使用 OPTIMIZE TABLE 功能对这类表进行碎片整理,避免因为“空洞”导致性能问题。 注释:OPTIMIZE TABLE会产生锁表, mysql 空洞类似oracle 高水位,oracle 通过move 等形式解决 | |||||
浮点数与定点数 |
|||||
float、double(或 real)表示浮点数。 | |||||
decimal(或 numberic)表示定点数 | |||||
注意:在今后关于浮点数和定点数的应用中,用户要考虑到以下几个原则: 浮点数存在误差问题; 对货币等对精度敏感的数据,应该用定点数表示或存储; 在编程中,如果用到浮点数,要特别注意误差问题,并尽量避免做浮点数比较; 要注意浮点数中一些特殊值的处理。 |
七、
第9章 字符集 | |||||||||||||||||||||||||||||||||||||||||||||
常用字符集比较 | |||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||
查询当前服务器的字符集和校对规则: show variables like 'character_set_server'; | |||||||||||||||||||||||||||||||||||||||||||||
设置/更换字符集 : 1/ my.cnf中设置: [mysqld] default-character-set=gbk 2/ 启动选项中指定: mysqld --default-character-set=gbk 3/ 在编译的时候指定: ./configure --with-charset=gbk |
参数:character_set_client、 character_set_connection 和 character_set_results,分别代表客户端、连接和返回结果的字符集
八、
BTREE 索引与 HASH 索引 | ||||||||||||||||||
两种不同类型的索引各有其不同的适用范围。HASH 索引有一些重要的特征需要在使用的时候特别注意,如下所示。 只用于使用=或<=>操作符的等式比较。 优化器不能使用 HASH 索引来加速 ORDER BY 操作。 MySQL 不能确定在两个值之间大约有多少行。如果将一个 MyISAM 表改为 HASH 索引的 MEMORY 表,会影响一些查询的执行效率。 只能使用整个关键字来搜索一行。 而对于 BTREE 索引,当使用>、<、>=、<=、BETWEEN、!=或者<>,或者 LIKE 'pattern'(其中'pattern'不以通配符开始)操作符时,都可以使用相关列上的索引。 例子: 下列范围查询适用于 BTREE 索引和 HASH 索引: SELECT * FROM t1 WHERE key_col = 1 OR key_col IN (15,18,20); 下列范围查询只适用于 BTREE 索引: SELECT * FROM t1 WHERE key_col > 1 AND key_col < 10; SELECT * FROM t1 WHERE key_col LIKE 'ab%' OR key_col BETWEEN 'lisa' AND 'simon'; | ||||||||||||||||||
view | ||||||||||||||||||
使用 CREATE OR REPLACE 或者 ALTER 修改视图 | ||||||||||||||||||
显示用户下多少view :show tables; | ||||||||||||||||||
查看视图状态 : show table status like 'staff_list' ; | ||||||||||||||||||
查看视图创建语句: show create view staff_list; | ||||||||||||||||||
查看存储状态: show procedure status like 'film_in_stock'; | ||||||||||||||||||
查看存储创建语句: SHOW CREATE {PROCEDURE | FUNCTION} sp_name ; | ||||||||||||||||||
通过查看 information_schema. Routines 了解存储过程和 函数的详细信息: select * from Routines where ROUTINE_NAME = 'film_in_stock'; |
||||||||||||||||||
*** 怎么写存储/函数 一些语法等,语法太多,在此不做说明,若有需要请自己查找相关资料 | ||||||||||||||||||
九、 | ||||||||||||||||||
第14章 事务控制和锁定语句 | ||||||||||||||||||
LOCK TABLE 和 UNLOCK TABLE LOCK TABLES 可以锁定用于当前线程的表。如果表被其他线程锁定,则当前线程会等待,直到可以获取所有锁定为止。 UNLOCK TABLES 可以释放当前线程获得的任何锁定。当前线程执行另一个 LOCK TABLES 时,或当与服务器的连接被关闭时,所有由当前线程锁定的表被隐含地解锁 | ||||||||||||||||||
一个获得表锁和释放表锁的简单例子 | ||||||||||||||||||
|
||||||||||||||||||
事物控制 : MySQL 通过 SET AUTOCOMMIT、START TRANSACTION、COMMIT 和 ROLLBACK 等语句支持本地事务,具体语法如下。 START TRANSACTION | BEGIN [WORK] COMMIT [WORK] [AND [NO] CHAIN] [[NO] RELEASE] ROLLBACK [WORK] [AND [NO] CHAIN] [[NO] RELEASE] SET AUTOCOMMIT = {0 | 1} | ||||||||||||||||||
MySQL 默认是自动提交(Autocommit)的,可用Commit 和 Rollback 来提交和回滚事务,那么需要通过明确的事务控制命令来开始事务,这是和 Oracle 的事务管理明显不同的地方。如果应用是从 Oracle 数据库迁移到 MySQL 数据库,则需要确保应用中是否对事务进行了明确的管理。 START TRANSACTION 或 BEGIN 语句可以开始一项新的事务。 COMMIT 和 ROLLBACK 用来提交或者回滚事务。 CHAIN 和 RELEASE 子句分别用来定义在事务提交或者回滚之后的操作,CHAIN 会立即启动一个新事物,并且和刚才的事务具有相同的隔离级别,RELEASE 则会断开和客户端的连接. ? SET AUTOCOMMIT 可以修改当前连接的提交方式,如果设置了 SET AUTOCOMMIT=0,则设置之后的所有事务都需要通过明确的命令进行提交或者回滚。 如果只是对某些语句需要进行事务控制,则使用 START TRANSACTION 语句开始一个事务比较方便,这样事务结束之后可以自动回到自动提交的方式,如果希望所有的事务都不是自动提交的,那么通过修改 AUTOCOMMIT 来控制事务比较方便,这样不用在每个事务开始的时候再执行 START TRANSACTION 语句。 | ||||||||||||||||||
***** 在此只摘取重要说明部分,较多例子在此未作声明,若想了解请自己查找相关资料 |
十、
SQL MODE
MySQL 5.0 上, SQL Mode(sql_mode 参数)默认 为REAL_AS_FLOAT/PIPES_AS_CONCAT/ANSI_QUOTES/GNORE_SPACE 和 ANSI; 在这种模式下允许插入超过字段长度的值,只是在插入后, MySQL 会返回一个 warning 。通过修改 sql_mode 为 STRICT_TRANS_TABLES(严格模式)实现了数据的严格校验,使错误数据不能插入表中,从而保证了数据的准确性,具体实现如下。 | |||||||||||||||||||||||||||||||||
查看默认 SQL Mode 的命令如下: | |||||||||||||||||||||||||||||||||
mysql> select @@sql_mode; | |||||||||||||||||||||||||||||||||
sql_mode 的一种修改方法,即 SET [SESSION|GLOBAL] sql_mode='modes',其中 SESSION 选项表示只在本次连接中生效;而 GLOBAL 选项表示在本次连接中并不生效,而对于新的连接则生效,这种方法在 MySQL 4.1 开始有效。另外,也可以通过使用“--sql-mode="modes"”选项,在 MySQL 启动时设置 sql_mode。 详见博客 MySQL数据类型:SQL_MODE设置不容忽视 | |||||||||||||||||||||||||||||||||
MySQL 中的 SQL Mode
|
|||||||||||||||||||||||||||||||||
|
从第18章SQL 优化开始 往后每章节都需要仔细阅读书籍和资料。由于知识点过多,所以在此先不做整理。
后续可能会对一些点做整理 另发博客。