MySQL基础讲解

什么是数据库?
数据库是按照数据结构来组织,存储和管理数据的仓库。每个数据库都有一个或多个不同的API用于创建,访问,管理,搜索和复杂所保存的数据。也可以将数据存储在文件中,但是在文件中读写数据速度相对较慢。所以,现在我们使用关系型数据库管理系统来存储和管理的大数据量,所谓的关系型数据库,是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。
RDBMS及关系数据库管理系统(Relational Database Mangement System)特点:
1.数据以表格的形式出现
2.每行为各种记录名称
3.每列为记录名称所对应的数据域
4.许多的行和列组成了一张表单
5.若干的表单组成database
术语:
数据库:数据库是一些关联表的集合
数据表:表示数据的矩阵。在一个数据库中的表看起来像一个简单的电子表格
列:一列(数据元素)包含了相同的数据,例如邮政编码的数据
行:一行(=元组,或记录)是一组相关的数据,例如一条用户订阅的数据
冗余:存储两倍数据,洛阳可以使系统速度跟快
主键:主键是唯一的。一个数据表中只能包含一个主键,你可以使用主键来查询数据
外键:外键用于关联两个表
复合主键:复合键将多个列作为一个索引键,一步用于复合索引
索引:使用索引可以快速访问数据库表中的特定信息,索引是对数据库表中一列或多列的值进行排序的一种结构,类似于书籍目录
参照完整性:参照的完整性要求关系中不允许引用不存在的实体,与实体完整性是关系模型必须满足的完整性约束条件,目的是保证数据的一致性。
管理MySQL的命令
use 数据库名:选择要操作的MySql数据库,使用该命令后所有mysql命令都只针对该数据库
show databases:列出mysql数据库管理系统的数据库列表
show tables:显示指定数据库的所有表,使用该命令前需要使用use命令来选择数据库。
show columns from 数据表:显示数据表的属性,属性类型,主键信息,是否为null,默认值等其他信息
show index from 数据表:显示数据表的信息索引细心,包括primary key(主键)
show table status like 数据表\G:该命令将输出MySql数据库管理系统的性能及统计信息

创建数据库
create tables table_name(column_name column_type);
删除数据库
drop table table_name;
插入数据
insert into table_name() values();
数据查询
select * from table_name [where Clause] [offset m][limit n];
select命令可以读取一条或者多条记录
可以使用(*)来代替其他的字段
用where语句来包含任何条件
通过offset指定select语句开始查询的数据偏移量默认情况下偏移量为0
使用limit属性来设定返回的记录数

数据更新
update table_name set field1=new_value1 where Clause;
数据删除
delete from table_name where clause;
left join
left join 会读取左边数据表中的全部数据,即使右边表五对应数据
MySQL事务
事务主要用于处理操作量大,复杂度高的数据,比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等,这些数据库操作语句就构成一个事务
在MySQL中只有使用了Innodb数据库引擎的数据库或表才支持事务
事务处理可以用来维护数据库的完整性,保证成批的SQL语句要么全部执行,要么全部不执行
事务用来管理insert , update,delete语句
一般来说,事务是必须满足4个条件(ACID):Atomicity(原子性),Consistency(稳定性),Isolation(隔离性),Durability(可靠性)
1.事务的原子性:一组事务,要么成功,要么撤回
2.稳定性:有非法的数据(外键约束之类),事务撤回
3.隔离性:事务独立运行,一个事务处理后的结果,影响了其他事务,那么其他事务会撤回,事务的100%隔离,需要牺牲速度
4.可靠性:软,硬件崩溃后,InnoDB数据表驱动会利用日志文件重构修改,可靠性和高速度不可兼得,innodb_flush_log_at_commit选项,决定什么时候把事务保存到日志里
1.开始一个事务
start transaction
2.做保存点
save point 保存点名称.
3.操作
4.可以回滚,可以提交,没有问题,就提交,有问题就回滚

索引
索引的建立对于数据库的高效运行时很重要的,索引可以大大提高数据库的检索速度。
索引分为:单列索引和组合索引,单列索引,及一个索引值包含单个列,一个表可以有多个单列索引,但这不是组合索引,组合索引,即一个索引包含多个列,
创建索引时,要确保该索引时应用在SQL查询语句的条件
实际上,索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录
过多的使用索引将会造成滥用,因此索引也会有它的缺点:虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对insert,update,delete。因为更新表时,MySQL不仅要保存数据,还有保存一下索引文件。建立索引会占用磁盘空间的索引文件。

普通索引
 
1. 创建索引:  create index indexName on mytable(username(length));
2.修改表结构:  alter mytable add index[indexName] on (username(length));
  删除索引的语法
drop index [indexName] on mytable;
唯一索引
它与前面的普通索引类似,不同的就是:索引列的值必须是唯一的,但允许有空值,如果是组合索引,则列值的组合必须唯一.
1.  创建索引:create unique index indexName on mytable (username(length));
2. 修改表结构: alter mytable add unique [indexName] on (username(length));
使用alter命令添加和删除索引
1.alter table table_name add primary key(column_list):该语句添加一个主键,这意味着索引值必须是唯一的,且不能为Null
2. alter table table_name add unique index_name(column_list):这条语句创建索引的值必须是唯一的(处理null外,null可能会出现多次)
3. alter table table_name add index index_name(column_list); 添加普通索引,索引值可以出现多次
4. alter table table_name add fulltext index_name(column_list); 该语句指定了索引为fulltext,用于全文索引。

使用alter命令创建添加和删除主键
  主键只能作用于一个列上,添加主键索引时,你需要确保该主键默认不为空(not null)
alter table table_name modify i int not null;
alter table table_name add primary key(i);
alter table table_name drop primary key;
显示索引信息
show index

MYSQL常用命令
1.导出整个数据库
mysqldump -u 用户名 -p --default-character-set=latin1 数据库名 > 导出的文件名(数据库默认编码是latin1)
mysqldump -u wcnc -p smgp_apps_wcnc > wcnc.sql
2.导出一个表
mysqldump -u 用户名 -p 数据库名 表名> 导出的文件名
mysqldump -u wcnc -p smgp_apps_wcnc users> wcnc_users.sql
3.导出一个数据库结构
mysqldump -u wcnc -p -d –add-drop-table smgp_apps_wcnc >d:wcnc_db.sql
-d 没有数据 –add-drop-table 在每个create语句之前增加一个drop table
4.导入数据库
A:常用source 命令
进入mysql数据库控制台,
如mysql -u root -p
mysql>use 数据库
然后使用source命令,后面参数为脚本文件(如这里用到的.sql)
mysql>source wcnc_db.sql
B:使用mysqldump命令
mysqldump -u username -p dbname < filename.sql
C:使用mysql命令
mysql -u username -p -D dbname < filename.sql
一、启动与退出
1、进入MySQL:启动MySQL Command Line Client(MySQL的DOS界面),直接输入安装时的密码即可。此时的提示符是:mysql>
2、退出MySQL:quit或exit
二、库操作
1、、创建数据库
命令:create database <数据库名>
例如:建立一个名为xhkdb的数据库
mysql> create database xhkdb; 
2、显示所有的数据库
命令:show databases (注意:最后有个s)
mysql> show databases;
3、删除数据库
命令:drop database <数据库名>
例如:删除名为 xhkdb的数据库
mysql> drop database xhkdb;
4、连接数据库
命令: use <数据库名>
例如:如果xhkdb数据库存在,尝试存取它:
mysql> use xhkdb;
屏幕提示:Database changed
5、查看当前使用的数据库
mysql> select database();
6、当前数据库包含的表信息:
mysql> show tables; (注意:最后有个s)
三、表操作,操作之前应连接某个数据库
1、建表
命令:create table <表名> ( <字段名1> <类型1> [,..<字段名n> <类型n>]);
mysql> create table MyClass(
> id int(4) not null primary key auto_increment,
> name char(20) not null,
> sex int(4) not null default '0',
> degree double(16,2));
2、获取表结构
命令: desc 表名,或者show columns from 表名
mysql>DESCRIBE MyClass
mysql> desc MyClass; 
mysql> show columns from MyClass;
3、删除表
命令:drop table <表名>
例如:删除表名为 MyClass 的表
mysql> drop table MyClass;
4、插入数据
命令:insert into <表名> [( <字段名1>[,..<字段名n > ])] values ( 值1 )[, ( 值n )]
例如,往表 MyClass中插入二条记录, 这二条记录表示:编号为1的名为Tom的成绩为96.45, 编号为2 的名为Joan 的成绩为82.99,编号为3 的名为Wang 的成绩为96.5.
mysql> insert into MyClass values(1,'Tom',96.45),(2,'Joan',82.99), (3,'Wang', 96.59);
5、查询表中的数据
1)、查询所有行
命令: select <字段1,字段2,...> from < 表名 > where < 表达式 >
例如:查看表 MyClass 中所有数据
mysql> select * from MyClass;
2)、查询前几行数据
例如:查看表 MyClass 中前2行数据
mysql> select * from MyClass order by id limit 0,2;
或者:
mysql> select * from MyClass limit 0,2;
6、删除表中数据
命令:delete from 表名 where 表达式
例如:删除表 MyClass中编号为1 的记录
mysql> delete from MyClass where id=1;
7、修改表中数据:update 表名 set 字段=新值,… where 条件
mysql> update MyClass set name='Mary' where id=1;
7、在表中增加字段:
命令:alter table 表名 add字段 类型 其他; 
例如:在表MyClass中添加了一个字段passtest,类型为int(4),默认值为0 
mysql> alter table MyClass add passtest int(4) default '0'
8、更改表名:
命令:rename table 原表名 to 新表名; 
例如:在表MyClass名字更改为YouClass 
mysql> rename table MyClass to YouClass;
更新字段内容
update 表名 set 字段名 = 新内容
update 表名 set 字段名 = replace(字段名,'旧内容','新内容');
文章前面加入4个空格
update article set content=concat('  ',content);
字段类型
1.INT[(M)] 型: 正常大小整数类型 
2.DOUBLE[(M,D)] [ZEROFILL] 型: 正常大小(双精密)浮点数字类型 
3.DATE 日期类型:支持的范围是1000-01-01到9999-12-31。MySQL以YYYY-MM-DD格式来显示DATE值,但是允许你使用字符串或数字把值赋给DATE列 
4.CHAR(M) 型:定长字符串类型,当存储时,总是是用空格填满右边到指定的长度 
5.BLOB TEXT类型,最大长度为65535(2^16-1)个字符。 
6.VARCHAR型:变长字符串类型
5.导入数据库表 
   (1)创建.sql文件 
   (2)先产生一个库如auction.c:mysqlbin>mysqladmin -u root -p creat auction,会提示输入密码,然后成功创建。 
   (2)导入auction.sql文件 
   c:mysqlbin>mysql -u root -p auction < auction.sql。 
   通过以上操作,就可以创建了一个数据库auction以及其中的一个表auction。 
   6.修改数据库
   (1)在mysql的表中增加字段: 
   alter table dbname add column userid int(11) not null primary key auto_increment;
   这样,就在表dbname中添加了一个字段userid,类型为int(11)。 
   7.mysql数据库的授权
   mysql>grant select,insert,delete,create,drop 
   on *.* (或test.*/user.*/..) 
   to 用户名@localhost 
   identified by '密码'; 
   如:新建一个用户帐号以便可以访问数据库,需要进行如下操作: 
   mysql> grant usage 
   -> ON test.* 
   -> TO testuser@localhost
   Query OK, 0 rows affected (0.15 sec) 
   此后就创建了一个新用户叫:testuser,这个用户只能从localhost连接到数据库并可以连接到test 数据库。下一步,我们必须指定testuser这个用户可以执行哪些操作: 
   mysql> GRANT select, insert, delete,update 
   -> ON test.* 
   -> TO testuser@localhost
   Query OK, 0 rows affected (0.00 sec) 
   此操作使testuser能够在每一个test数据库中的表执行SELECT,INSERT和DELETE以及UPDATE查询操作。现在我们结束操作并退出MySQL客户程序: 
   mysql> exit 
   Bye9!
1:使用SHOW语句找出在服务器上当前存在什么数据库:
mysql> SHOW DATABASES;
2:2、创建一个数据库MYSQLDATA
mysql> Create DATABASE MYSQLDATA;
3:选择你所创建的数据库
mysql> USE MYSQLDATA; (按回车键出现Database changed 时说明操作成功!)
4:查看现在的数据库中存在什么表
mysql> SHOW TABLES;
5:创建一个数据库表
mysql> Create TABLE MYTABLE (name VARCHAR(20), sex CHAR(1));
6:显示表的结构:
mysql> DESCRIBE MYTABLE;
7:往表中加入记录
mysql> insert into MYTABLE values ("hyq","M");
8:用文本方式将数据装入数据库表中(例如D:/mysql.txt)
mysql> LOAD DATA LOCAL INFILE "D:/mysql.txt" INTO TABLE MYTABLE;
9:导入.sql文件命令(例如D:/mysql.sql)
mysql>use database;
mysql>source d:/mysql.sql;
10:删除表
mysql>drop TABLE MYTABLE;
11:清空表
mysql>delete from MYTABLE;
12:更新表中数据
mysql>update MYTABLE set sex="f" where name='hyq';
以下是无意中在网络看到的使用MySql的管理心得,
摘自:http://www1.xjtusky.com/article/htmldata/2004_12/3/57/article_1060_1.html
在windows中MySql以服务形式存在,在使用前应确保此服务已经启动,未启动可用net start mysql命令启动。而Linux中启动时可用“/etc/rc.d/init.d/mysqld start"命令,注意启动者应具有管理员权限。
刚安装好的MySql包含一个含空密码的root帐户和一个匿名帐户,这是很大的安全隐患,对于一些重要的应用我们应将安全性尽可能提高,在这里应把匿名帐户删除、 root帐户设置密码,可用如下命令进行:
use mysql;
delete from User where User="";
update User set Password=PASSWORD('newpassword') where User='root';
如果要对用户所用的登录终端进行限制,可以更新User表中相应用户的Host字段,在进行了以上更改后应重新启动数据库服务,此时登录时可用如下类似命令:
mysql -uroot -p;
mysql -uroot -pnewpassword;
mysql mydb -uroot -p;
mysql mydb -uroot -pnewpassword;
上面命令参数是常用参数的一部分,详细情况可参考文档。此处的mydb是要登录的数据库的名称。
在进行开发和实际应用中,用户不应该只用root用户进行连接数据库,虽然使用root用户进行测试时很方便,但会给系统带来重大安全隐患,也不利于管理技术的提高。我们给一个应用中使用的用户赋予最恰当的数据库权限。如一个只进行数据插入的用户不应赋予其删除数据的权限。MySql的用户管理是通过 User表来实现的,添加新用户常用的方法有两个,一是在User表插入相应的数据行,同时设置相应的权限;二是通过GRANT命令创建具有某种权限的用户。其中GRANT的常用用法如下:
grant all on mydb.* to NewUserName@HostName identified by "password" ;
grant usage on *.* to NewUserName@HostName identified by "password";
grant select,insert,update on mydb.* to NewUserName@HostName identified by "password";
grant update,delete on mydb.TestTable to NewUserName@HostName identified by "password";
若要给此用户赋予他在相应对象上的权限的管理能力,可在GRANT后面添加WITH GRANT OPTION选项。而对于用插入User表添加的用户,Password字段应用PASSWORD 函数进行更新加密,以防不轨之人窃看密码。对于那些已经不用的用户应给予清除,权限过界的用户应及时回收权限,回收权限可以通过更新User表相应字段,也可以使用REVOKE操作。
下面给出本人从其它资料(www.cn-java.com)获得的对常用权限的解释:
全局管理权限:
FILE: 在MySQL服务器上读写文件。
PROCESS: 显示或杀死属于其它用户的服务线程。
RELOAD: 重载访问控制表,刷新日志等。
SHUTDOWN: 关闭MySQL服务。
数据库/数据表/数据列权限:
Alter: 修改已存在的数据表(例如增加/删除列)和索引。
Create: 建立新的数据库或数据表。
Delete: 删除表的记录。
Drop: 删除数据表或数据库。
INDEX: 建立或删除索引。
Insert: 增加表的记录。
Select: 显示/搜索表的记录。
Update: 修改表中已存在的记录。
特别的权限:
ALL: 允许做任何事(和root一样)。
USAGE: 只允许登录--其它什么也不允许做。
---------------------
MYSQL常用命令
有很多朋友虽然安装好了mysql但却不知如何使用它。在这篇文章中我们就从连接MYSQL、修改密码、增加用户等方面来学习一些MYSQL的常用命令。
  有很多朋友虽然安装好了mysql但却不知如何使用它。在这篇文章中我们就从连接MYSQL、修改密码、增加用户等方面来学习一些MYSQL的常用命令。  
  一、连接MYSQL 
  格式: mysql -h主机地址 -u用户名 -p用户密码   
  1、例1:连接到本机上的MYSQL
  首先在打开DOS窗口,然后进入目录 mysqlbin,再键入命令mysql -uroot -p,回车后提示你输密码,如果刚安装好MYSQL,超级用户root是没有密码的,故直接回车即可进入到MYSQL中了,MYSQL的提示符是:mysql>   
  2、例2:连接到远程主机上的MYSQL
  假设远程主机的IP为:110.110.110.110,用户名为root,密码为abcd123。则键入以下命令:    
  mysql -h110.110.110.110 -uroot -pabcd123   
  (注:u与root可以不用加空格,其它也一样)   
  3、退出MYSQL命令: exit (回车)
  二、修改密码  
  格式:mysqladmin -u用户名 -p旧密码 password 新密码  
  1、例1:给root加个密码ab12。首先在DOS下进入目录mysqlbin,然后键入以下命令   
  mysqladmin -uroot -password ab12   
  注:因为开始时root没有密码,所以-p旧密码一项就可以省略了。   
  2、例2:再将root的密码改为djg345
  mysqladmin -uroot -pab12 password djg345
MYSQL常用命令(下)
  一、操作技巧
  1、如果你打命令时,回车后发现忘记加分号,你无须重打一遍命令,只要打个分号回车就可以了。也就是说你可以把一个完整的命令分成几行来打,完后用分号作结束标志就OK。
  2、你可以使用光标上下键调出以前的命令。但以前我用过的一个MYSQL旧版本不支持。我现在用的是mysql-3.23.27-beta-win。
  二、显示命令
  1、显示数据库列表。
  show databases;
  刚开始时才两个数据库:mysql和test。mysql库很重要它里面有MYSQL的系统信息,我们改密码和新增用户,实际上就是用这个库进行操作。
  2、显示库中的数据表:
  use mysql; //打开库,学过FOXBASE的一定不会陌生吧
  show tables;
  3、显示数据表的结构:
  describe 表名;
  4、建库:
  create database 库名;
  5、建表:
  use 库名;
  create table 表名 (字段设定列表);
  6、删库和删表:
  drop database 库名;
  drop table 表名;
  7、将表中记录清空:
  delete from 表名;
  8、显示表中的记录:
  select * from 表名;
三、一个建库和建表以及插入数据的实例
  drop database if exists school; //如果存在SCHOOL则删除
  create database school; //建立库SCHOOL
  use school; //打开库SCHOOL
  create table teacher //建立表TEACHER
  (
  id int(3) auto_increment not null primary key,
  name char(10) not null,
  address varchar(50) default '深圳',
  year date
  ); //建表结束
  //以下为插入字段
  insert into teacher values('','glchengang','深圳一中','1976-10-10');
  insert into teacher values('','jack','深圳一中','1975-12-23');
  注:在建表中(1)将ID设为长度为3的数字字段:int(3)并让它每个记录自动加一:auto_increment并不能为空:not null而且让他成为主字段primary key
  (2)将NAME设为长度为10的字符字段
  (3)将ADDRESS设为长度50的字符字段,而且缺省值为深圳。varchar和char有什么区别呢,只有等以后的文章再说了。
  (4)将YEAR设为日期字段。
  如果你在mysql提示符键入上面的命令也可以,但不方便调试。你可以将以上命令原样写入一个文本文件中假设为school.sql,然后复制到c:\下,并在DOS状态进入目录\mysql\bin,然后键入以下命令:
  mysql -uroot -p密码 < c:\school.sql
  如果成功,空出一行无任何显示;如有错误,会有提示。(以上命令已经调试,你只要将//的注释去掉即可使用)。
四、将文本数据转到数据库中
  1、文本数据应符合的格式:字段数据之间用tab键隔开,null值用\n来代替.
  例:
  3 rose 深圳二中 1976-10-10
  4 mike 深圳一中 1975-12-23
  2、数据传入命令 load data local infile "文件名" into table 表名;
  注意:你最好将文件复制到\mysql\bin目录下,并且要先用use命令打表所在的库 。
五、备份数据库:(命令在DOS的\mysql\bin目录下执行)
  mysqldump --opt school>school.bbb
  注释:将数据库school备份到school.bbb文件,school.bbb是一个文本文件,文件名任取,打开看看你会有新发现。
一.SELECT语句的完整语法为: 
SELECT[ALL|DISTINCT|DISTINCTROW|TOP] 
{*|talbe.*|[table.]field1[AS alias1][,[table.]field2[AS alias2][,…]]} 
FROM tableexpression[,…][IN externaldatabase] 
[WHERE…] 
[GROUP BY…] 
[HAVING…] 
[ORDER BY…] 
[WITH OWNERACCESS OPTION] 
说明: 
用中括号([])括起来的部分表示是可选的,用大括号({})括起来的部分是表示必须从中选择其中的一个。 
1 FROM子句 
FROM 子句指定了SELECT语句中字段的来源。FROM子句后面是包含一个或多个的表达式(由逗号分开),其中的表达式可为单一表名称、已保存的查询或由 INNER JOIN、LEFT JOIN 或 RIGHT JOIN 得到的复合结果。如果表或查询存储在外部数据库,在IN 子句之后指明其完整路径。 
例:下列SQL语句返回所有有定单的客户: 
SELECT OrderID,Customer.customerID 
FROM Orders Customers 
WHERE Orders.CustomerID=Customers.CustomeersID
2 ALL、DISTINCT、DISTINCTROW、TOP谓词 
(1) ALL 返回满足SQL语句条件的所有记录。如果没有指明这个谓词,默认为ALL。 
例:SELECT ALL FirstName,LastName 
FROM Employees 
(2) DISTINCT 如果有多个记录的选择字段的数据相同,只返回一个。 
(3) DISTINCTROW 如果有重复的记录,只返回一个 
(4) TOP显示查询头尾若干记录。也可返回记录的百分比,这是要用 TOP N PERCENT子句(其中N 表示百分比) 
例:返回5%定货额最大的定单 
SELECT TOP 5 PERCENT* 
FROM [ Order Details] 
ORDER BY UnitPrice*Quantity*(1-Discount) DESC
3 用 AS 子句为字段取别名 
如果想为返回的列取一个新的标题,或者,经过对字段的计算或总结之后,产生了一个新的值,希望把它放到一个新的列里显示,则用AS保留。 
例:返回FirstName字段取别名为NickName 
SELECT FirstName AS NickName ,LastName ,City 
FROM Employees 
例:返回新的一列显示库存价值 
SELECT ProductName ,UnitPrice ,UnitsInStock ,UnitPrice*UnitsInStock AS valueInStock 
FROM Products
二 .WHERE 子句指定查询条件
1 比较运算符 
比较运算符 含义 
= 等于 
> 大于 
< 小于 
>= 大于等于 
<= 小于等于 
<> 不等于 
!> 不大于 
!< 不小于 
例:返回96年1月的定单 
SELECT OrderID, CustomerID, OrderDate 
FROM Orders 
WHERE OrderDate>#1/1/96# AND OrderDate<#1/30/96# 
注意: 
Mcirosoft JET SQL 中,日期用‘#’定界。日期也可以用Datevalue()函数来代替。在比较字符型的数据时,要加上单引号’’,尾空格在比较中被忽略。 
例: 
WHERE OrderDate>#96-1-1# 
也可以表示为: 
WHERE OrderDate>Datevalue(‘1/1/96’) 
使用 NOT 表达式求反。 
例:查看96年1月1日以后的定单 
WHERE Not OrderDate<=#1/1/96# 
2 范围(BETWEEN 和 NOT BETWEEN) 
BETWEEN …AND…运算符指定了要搜索的一个闭区间。 
例:返回96年1月到96年2月的定单。 
WHERE OrderDate Between #1/1/96# And #2/1/96# 
3 列表(IN ,NOT IN) 
IN 运算符用来匹配列表中的任何一个值。IN子句可以代替用OR子句连接的一连串的条件。 
例:要找出住在 London、Paris或Berlin的所有客户 
SELECT CustomerID, CompanyName, ContactName, City 
FROM Customers 
WHERE City In(‘London’,’ Paris’,’ Berlin’) 
4 模式匹配(LIKE) 
LIKE运算符检验一个包含字符串数据的字段值是否匹配一指定模式。 
LIKE运算符里使用的通配符 
通配符 含义 
? 任何一个单一的字符 
* 任意长度的字符 
# 0~9之间的单一数字 
[字符列表] 在字符列表里的任一值 
[!字符列表] 不在字符列表里的任一值 
- 指定字符范围,两边的值分别为其上下限 
例:返回邮政编码在(171)555-0000到(171)555-9999之间的客户 
SELECT CustomerID ,CompanyName,City,Phone 
FROM Customers 
WHERE Phone Like ‘(171)555-####’ 
LIKE运算符的一些样式及含义 
样式 含义 不符合 
LIKE ‘A*’ A后跟任意长度的字符 Bc,c255 
LIKE’5[*]’ 5*5 555 
LIKE’5?5’ 5与5之间有任意一个字符 55,5wer5 
LIKE’5##5’ 5235,5005 5kd5,5346 
LIKE’[a-z]’ a-z间的任意一个字符 5,% 
LIKE’[!0-9]’ 非0-9间的任意一个字符 0,1 
LIKE’[[]’ 1,* 
三 .用ORDER BY子句排序结果 
ORDER子句按一个或多个(最多16个)字段排序查询结果,可以是升序(ASC)也可以是降序(DESC),缺省是升序。ORDER子句通常放在SQL语句的最后。 
ORDER子句中定义了多个字段,则按照字段的先后顺序排序。 
例: 
SELECT ProductName,UnitPrice, UnitInStock 
FROM Products 
ORDER BY UnitInStock DESC , UnitPrice DESC, ProductName 
ORDER BY 子句中可以用字段在选择列表中的位置号代替字段名,可以混合字段名和位置号。 
例:下面的语句产生与上列相同的效果。 
SELECT ProductName,UnitPrice, UnitInStock 
FROM Products 
ORDER BY 1 DESC , 2 DESC,3 
四 .运用连接关系实现多表查询 
例:找出同一个城市中供应商和客户的名字 
SELECT Customers.CompanyName, Suppliers.ComPany.Name 
FROM Customers, Suppliers 
WHERE Customers.City=Suppliers.City 
例:找出产品库存量大于同一种产品的定单的数量的产品和定单 
SELECT ProductName,OrderID, UnitInStock, Quantity 
FROM Products, [Order Deails] 
WHERE Product.productID=[Order Details].ProductID 
AND UnitsInStock>Quantity 
另一种方法是用 Microsof JET SQL 独有的 JNNER JOIN 
语法: 
FROM table1 INNER JOIN table2 
ON table1.field1 comparision table2.field2 
其中comparision 就是前面WHERE子句用到的比较运算符。 
SELECT FirstName,lastName,OrderID,CustomerID,OrderDate 
FROM Employees 
INNER JOIN Orders ON Employees.EmployeeID=Orders.EmployeeID 
注意: 
INNER JOIN不能连接Memo OLE Object Single Double 数据类型字段。 
在一个JOIN语句中连接多个ON子句 
语法: 
SELECT fields 
FROM table1 INNER JOIN table2 
ON table1.field1 compopr table2.field1 AND 
ON table1.field2 compopr table2.field2 OR 
ON table1.field3 compopr table2.field3 
也可以 
SELECT fields 
FROM table1 INNER JOIN 
(table2 INNER JOIN [( ]table3 
[INNER JOER] [( ]tablex[INNER JOIN] 
ON table1.field1 compopr table2.field1 
ON table1.field2 compopr table2.field2 
ON table1.field3 compopr table2.field3 
外部连接返回更多记录,在结果中保留不匹配的记录,不管存不存在满足条件的记录都要返回另一侧的所有记录。 
FROM table [LEFT|RIGHT]JOIN table2 
ON table1.field1comparision table.field2 
用左连接来建立外部连接,在表达式的左边的表会显示其所有的数据 
例:不管有没有定货量,返回所有商品 
SELECT ProductName ,OrderID 
FROM Products 
LEFT JOIN Orders ON Products.PrductsID=Orders.ProductID 
右连接与左连接的差别在于:不管左侧表里有没有匹配的记录,它都从左侧表中返回所有记录。 
例:如果想了解客户的信息,并统计各个地区的客户分布,这时可以用一个右连接,即使某个地区没有客户,也要返回客户信息。 
空值不会相互匹配,可以通过外连接才能测试被连接的某个表的字段是否有空值。 
SELECT * 
FROM talbe1 
LEFT JOIN table2 ON table1.a=table2.c 
1 连接查询中使用Iif函数实现以0值显示空值 
Iif表达式: Iif(IsNull(Amount,0,Amout) 
例:无论定货大于或小于¥50,都要返回一个标志。 
Iif([Amount]>50,?Big order?,?Small order?) 
五. 分组和总结查询结果 
在SQL的语法里,GROUP BY和HAVING子句用来对数据进行汇总。GROUP BY子句指明了按照哪几个字段来分组,而将记录分组后,用HAVING子句过滤这些记录。 
GROUP BY 子句的语法 
SELECT fidldlist 
FROM table 
WHERE criteria 
[GROUP BY groupfieldlist [HAVING groupcriteria]] 
注:Microsoft Jet数据库 Jet 不能对备注或OLE对象字段分组。 
GROUP BY字段中的Null值以备分组但是不能被省略。 
在任何SQL合计函数中不计算Null值。 
GROUP BY子句后最多可以带有十个字段,排序优先级按从左到右的顺序排列。 
例:在‘WA’地区的雇员表中按头衔分组后,找出具有同等头衔的雇员数目大于1人的所有头衔。 
SELECT Title ,Count(Title) as Total 
FROM Employees 
WHERE Region = ‘WA’ 
GROUP BY Title 
HAVING Count(Title)>1 
JET SQL 中的聚积函数 
聚集函数 意义 
SUM ( ) 求和 
AVG ( ) 平均值 
COUNT ( ) 表达式中记录的数目 
COUNT (* ) 计算记录的数目 
MAX 最大值 
MIN 最小值 
VAR 方差 
STDEV 标准误差 
FIRST 第一个值 
LAST 最后一个值 
六. 用Parameters声明创建参数查询 
Parameters声明的语法: 
PARAMETERS name datatype[,name datatype[, …]] 
其中name 是参数的标志符,可以通过标志符引用参数. 
Datatype说明参数的数据类型. 
使用时要把PARAMETERS 声明置于任何其他语句之前. 
例: 
PARAMETERS[Low price] Currency,[Beginning date]datatime 
SELECT OrderID ,OrderAmount 
FROM Orders 
WHERE OrderAMount>[low price] 
AND OrderDate>=[Beginning date] 
七. 功能查询 
所谓功能查询,实际上是一种操作查询,它可以对数据库进行快速高效的操作.它以选择查询为目的,挑选出符合条件的数据,再对数据进行批处理.功能查询包括更新查询,删除查询,添加查询,和生成表查询.
1 更新查询 
UPDATE子句可以同时更改一个或多个表中的数据.它也可以同时更改多个字段的值. 
更新查询语法: 
UPDATE 表名 
SET 新值 
WHERE 准则 
例:英国客户的定货量增加5%,货运量增加3% 
UPDATE OEDERS 
SET OrderAmount = OrderAmount *1.1 
Freight = Freight*1.03 
WHERE ShipCountry = ‘UK’ 
2 删除查询 
DELETE子句可以使用户删除大量的过时的或冗于的数据. 
注:删除查询的对象是整个记录. 
DELETE子句的语法: 
DELETE [表名.*] 
FROM 来源表 
WHERE 准则 
例: 要删除所有94年前的定单 
DELETE * 
FROM Orders 
WHERE OrderData<#94-1-1# 
3 追加查询 
INSERT子句可以将一个或一组记录追加到一个或多个表的尾部. 
INTO 子句指定接受新记录的表 
valueS 关键字指定新记录所包含的数据值. 
INSERT 子句的语法: 
INSETR INTO 目的表或查询(字段1,字段2,…) 
valueS(数值1,数值2,…) 
例:增加一个客户 
INSERT INTO Employees(FirstName,LastName,title) 
valueS(‘Harry’,’Washington’,’Trainee’) 
4 生成表查询 
可以一次性地把所有满足条件的记录拷贝到一张新表中.通常制作记录的备份或副本或作为报表的基础. 
SELECT INTO子句用来创建生成表查询语法: 
SELECT 字段1,字段2,… 
INTO 新表[IN 外部数据库] 
FROM 来源数据库 
WHERE 准则 
例:为定单制作一个存档备份 
SELECT * 
INTO OrdersArchive 
FROM Orders 
八. 联合查询 
UNION运算可以把多个查询的结果合并到一个结果集里显示. 
UNION运算的一般语法: 
[表]查询1 UNION [ALL]查询2 UNION … 
例:返回巴西所有供给商和客户的名字和城市 
SELECT CompanyName,City 
FROM Suppliers 
WHERE Country = ‘Brazil’ 
UNION 
SELECT CompanyName,City 
FROM Customers 
WHERE Country = ‘Brazil’ 
注: 
缺省的情况下,UNION子句不返回重复的记录.如果想显示所有记录,可以加ALL选项 
UNION运算要求查询具有相同数目的字段.但是,字段数据类型不必相同. 
每一个查询参数中可以使用GROUP BY 子句 或 HAVING 子句进行分组.要想以指定的顺序来显示返回的数据,可以在最后一个查询的尾部使用OREER BY子句. 
九. 交叉查询 
交叉查询可以对数据进行总和,平均,计数或其他总和计算法的计算,这些数据通过两种信息进行分组:一个显示在表的左部,另一个显示在表的顶部. 
Microsoft Jet SQL 用TRANSFROM语句创建交叉表查询语法: 
TRANSFORM aggfunction 
SELECT 语句 
GROUP BY 子句 
PIVOT pivotfield[IN(value1 [,value2[,…]]) ] 
Aggfounction指SQL聚积函数, 
SELECT语句选择作为标题的的字段, 
GROUP BY 分组 
说明: 
Pivotfield 在查询结果集中创建列标题时用的字段或表达式,用可选的IN子句限制它的取值. 
value代表创建列标题的固定值. 
例:显示在1996年里每一季度每一位员工所接的定单的数目: 
TRANSFORM Count(OrderID) 
SELECT FirstName&’’&LastName AS FullName 
FROM Employees INNER JOIN Orders 
ON Employees.EmployeeID = Orders.EmployeeID 
WHERE DatePart(“yyyy”,OrderDate)= ‘1996’ 
GROUP BY FirstName&’’&LastName 
ORDER BY FirstName&’’&LastName 
POVOT DatePart(“q”,OrderDate)&’季度’ 
十 .子查询 
子查询可以理解为 套查询.子查询是一个SELECT语句. 
1 表达式的值与子查询返回的单一值做比较 
语法: 
表达式 comparision [ANY|ALL|SOME](子查询) 
说明: 
ANY 和SOME谓词是同义词,与比较运算符(=,<,>,<>,<=,>=)一起使用.返回一个布尔值True或 False.ANY的意思是,表达式与子查询返回的一系列的值逐一比较,只要其中的一次比较产生True结果,ANY测试的返回 True值(既WHERE子句的结果),对应于该表达式的当前记录将进入主查询的结果中.ALL测试则要求表达式与子查询返回的一系列的值的比较都产生 True结果,才回返回True值. 
例:主查询返回单价比任何一个折扣大于等于25%的产品的单价要高的所有产品 
SELECT * FROM Products 
WHERE UnitPrice>ANY 
(SELECT UnitPrice FROM[Order Details] WHERE Discount>0.25)
2 检查表达式的值是否匹配子查询返回的一组值的某个值 
语法: 
[NOT]IN(子查询) 
例:返回库存价值大于等于1000的产品. 
SELECT ProductName FROM Products 
WHERE ProductID IN 
(SELECT PrdoctID FROM [Order DEtails] 
WHERE UnitPrice*Quantity>= 1000)
3检测子查询是否返回任何记录 
语法: 
[NOT]EXISTS (子查询) 
例:用EXISTS检索英国的客户 
SELECT ComPanyName,ContactName 
FROM Orders 
WHERE EXISTS 
(SELECT * 
FROM Customers 
WHERE Country = ‘UK’ AND 
Customers.CustomerID= Orders.CustomerID)


概述
背景
数据库的选择
MySQL的架构
MySQL架构介绍
MySQL安装
XP下安装
Linux下安装和参数配置
可视化工具的安装navicat
Navicat的使用
MySQL的管理维护
库连接管理
表空间管理
用户及权限管理
操作表、视图、触发器
从oracle到MySQL
从MySQL到oracle
冷备份和逻辑备份
时间点恢复和位置恢复
SQL的使用
增删改查的SQL
常用的数据类型
常用的Mysql函数介绍
技巧篇
索引的使用
锁的使用
Mysql事务控制
自增列的使用
Mysql安全
安装和使用时的常见错误处理
字符集的管理
SQL的优化
结合UniEAP使用
数据源管理
开发注意事项
常见数据类型的增删改查方法








概述
背景
MySQL是一个开源免费的关系型数据库存储引擎。
在MySQL经历了2008年Sun的收购和2009年Oracle收购Sun的过程中,基本处于停滞发展的情况。目前,使用的常用的版本,也是比较稳定的版本是5.5.28.
不过,从目前各个中小型网站的使用情况看,以及企业级的BS等应用很多在使用MySQL。从部门开发情况看,也有少许项目是使用MySQL开发,比如个住项目。

数据库的选择
小型数据库:access、foxbase;中型数据库:sql server 、mysql、informix;大型数据库:db2、Oracle、Sybase。
微软:sql server 和 access;IBM公司:db2,informix;美国Sybase公司:Sybase;美国oracle公司:oracle,MySQL;
选择数据主要考虑以下几点:项目的大小、架构、符合不符合技术路线,以及客户的原因。


MySQL架构介绍
1.逻辑架构


     最上面一层不是MySQL特有的,所有基于网络的C/S或者B/S的网络应用程序都应该包括连接处理、认证、安全管理等。
  中间层是MySQL的核心,包括查询解析、分析、优化和缓存等。同时它还提供跨存储引擎的功能,包括存储过程、触发器和视图等。
  最下面是存储引擎,它负责存取数据。服务器通过storage engine API可以和各种存储引擎进行交互。

1.1、查询优化和执行(Optimization and Execution)
  MySQL 将用户的查询语句进行解析,并创建一个内部的数据结构——分析树,然后进行各种优化,例如重写查询、选择读取表的顺序,以及使用哪个索引等。查询优化器不关心一个表所使用的存储引擎,但是存储引擎会影响服务器如何优化查询。优化器通过存储引擎获取一些参数、某个操作的执行代价、以及统计信息等。在解析查询之前,服务器会先访问查询缓存(query cache)——它存储SELECT语句以及相应的查询结果集。如果某个查询结果已经位于缓存中,服务器就不会再对查询进行解析、优化、以及执行。它仅仅将缓存中的结果返回给用户即可,这将大大提高系统的性能。

 1.2、并发控制
  MySQL提供两个级别的并发控制:服务器级(the server level)和存储引擎级(the storage engine level)。加锁是实现并发控制的基本方法,MySQL中锁的粒度:
  (1)表级锁:MySQL独立于存储引擎提供表锁,例如,对于ALTER TABLE语句,服务器提供表锁(table-level lock)。

  (2)行级锁:InnoDB和Falcon存储引擎提供行级锁,此外,BDB支持页级锁。InnoDB的并发控制机制,下节详细讨论。

  1.3、存储引擎
1.3.1、什么叫存储引擎
MySQL中的数据用各种不同的技术存储在文件(或者内存)中。这些技术中的每一种技术都使用不同的存储机制、索引技巧、锁定水平并且最终提供广泛的不同的功能和能力。通过选择不同的技术,你能够获得额外的速度或者功能,从而改善你的应用的整体功能。
  例如,如果你在研究大量的临时数据,你也许需要使用内存存储引擎。内存存储引擎能够在内存中存储所有的表格数据。又或者,你也许需要一个支持事务处理的数据库(以确保事务处理不成功时数据的回退能力)。
  这些不同的技术以及配套的相关功能在MySQL中被称作存储引擎(也称作表类型)。MySQL默认配置了许多不同的存储引擎,可以预先设置或者在MySQL服务器中启用。你可以选择适用于服务器、数据库和表格的存储引擎,以便在选择如何存储你的信息、如何检索这些信息以及你需要你的数据结合什么性能和功能的时候为你提供最大的灵活性。
选择如何存储和检索你的数据的这种灵活性是MySQL为什么如此受欢迎的主要原因。其它数据库系统(包括大多数商业选择)仅支持一种类型的数据存储。遗憾的是,其它类型的数据库解决方案采取的“一个尺码满足一切需求”的方式意味着你要么就牺牲一些性能,要么你就用几个小时甚至几天的时间详细调整你的数据库。使用MySQL,我们仅需要修改我们使用的存储引擎就可以了。

1.3.2、查看存储引擎
mysql> show engines;
通过以上命令可以看到当前有如下引擎:


1.3.3、常用存储引擎
最常用的是MyISAM、InnoDB、Memory,下面简单介绍以下:
MyISAM 
MyISAM 是 MySQL 最常用的类型,但不支持外键,不支持事务,但重要的是 快。
MyISAM是MySQL的ISAM扩展格式和缺省的数据库引擎。除了提供ISAM里所没有的索引和字段管理的大量功能,MyISAM还使用一种表格锁定的机制,来优化多个并发的读写操作。其代价是你需要经常运行OPTIMIZE TABLE命令,来恢复被更新机制所浪费的空间。MyISAM还有一些有用的扩展,例如用来修复数据库文件的MyISAMChk工具和用来恢复浪费空间的 MyISAMPack工具。

InnoDB
InnoDB 是 比较完善的类型,支持外键、事务,但速度不算最快,而且数据占用空间较多。

Memory
Memory 一般只用于 临时表。

ISAM
ISAM是一个定义明确且历经时间考验的数据表格管理方法,它在设计之时就考虑到数据库被查询的次数要远大于更新的次数。因此,ISAM执行读取操作的速度很快,而且不占用大量的内存和存储资源。ISAM的两个主要不足之处在于,它不支持事务处理,也不能够容错:如果你的硬盘崩溃了,那么数据文件就无法恢复了。如果你正在把ISAM用在关键任务应用程序里,那就必须经常备份你所有的实时数据,通过其复制特性,MySQL能够支持这样的备份应用程序。

HEAP
HEAP允许只驻留在内存里的临时表格。驻留在内存里让HEAP要比ISAM和MyISAM 都快,但是它所管理的数据是不稳定的,而且如果在关机之前没有进行保存,那么所有的数据都会丢失。在数据行被删除的时候,HEAP也不会浪费大量的空间。 HEAP表格在你需要使用SELECT表达式来选择和操控数据的时候非常有用。要记住,在用完表格之后就删除表格。让我再重复一遍:在你用完表格之后,不要忘记删除表格。

NDB
集群时使用。

其他存储引擎
    | MERGE | YES | Collection of identical MyISAM tables |
  | MRG_MYISAM | YES | Alias for MERGE |
  | MRG_ISAM | NO | Obsolete storage engine, now replaced by MERGE |
  | INNOBASE | YES | Alias for INNODB |
  | BDB | NO | Supports transactions and page-level locking |
  | BERKELEYDB | NO | Alias for BDB |
  | NDBCLUSTER | NO | Clustered, fault-tolerant, memory-based tables |
  | EXAMPLE | NO | Example storage engine |
  | ARCHIVE | NO | Archive storage engine |
  | CSV | NO | CSV storage engine |

1.3.4、查看当前数据库使用的引擎
可以使用SHOW TABLE STATUS FROM DBname来查看。

1.3.5、指定表的存储引擎
可以在Create Table语句的最后添加扩展语句,如TYPE=MyISAM(或者ENGINE = INNODB)来指定当前标的引擎类型。也可以用Alter语句在建立表个后进行更改。
例如: CREATE TABLE mytable (id int, title char(20)) ENGINE = INNODB
ALTER TABLE mytable ENGINE = MyISAM
1.3.6、存储引擎的选择
为了做出选择哪一个存储引擎的决定,我们首先需要考虑每一个存储引擎提供了哪些不同的核心功能。这种功能使我们能够把不同的存储引擎区别开来。我们一般把这些核心功能分为四类:支持的字段和数据类型、锁定类型、索引和处理。一些引擎具有能过促使你做出决定的独特的功能,我们一会儿再仔细研究这些具体问题。
  字段和数据类型
  虽然所有这些引擎都支持通用的数据类型,例如整型、实型和字符型等,但是,并不是所有的引擎都支持其它的字段类型,特别是BLOG(二进制大对象)或者TEXT文本类型。其它引擎也许仅支持有限的字符宽度和数据大小。
  这些局限性可能直接影响到你可以存储的数据,同时也可能会对你实施的搜索的类型或者你对那些信息创建的索引产生间接的影响。这些区别能够影响你的应用程序的性能和功能,因为你必须要根据你要存储的数据类型选择对需要的存储引擎的功能做出决策。
  锁定
  数据库引擎中的锁定功能决定了如何管理信息的访问和更新。当数据库中的一个对象为信息更新锁定了,在更新完成之前,其它处理不能修改这个数据(在某些情况下还不允许读这种数据)。
  锁定不仅影响许多不同的应用程序如何更新数据库中的信息,而且还影响对那个数据的查询。这是因为查询可能要访问正在被修改或者更新的数据。总的来说,这种延迟是很小的。大多数锁定机制主要是为了防止多个处理更新同一个数据。由于向数据中插入信息和更新信息这两种情况都需要锁定,你可以想象,多个应用程序使用同一个数据库可能会有很大的影响。
  不同的存储引擎在不同的对象级别支持锁定,而且这些级别将影响可以同时访问的信息。得到支持的级别有三种:表锁定、块锁定和行锁定。支持最多的是表锁定,这种锁定是在MyISAM中提供的。在数据更新时,它锁定了整个表。这就防止了许多应用程序同时更新一个具体的表。这对应用很多的多用户数据库有很大的影响,因为它延迟了更新的过程。
  页级锁定使用Berkeley DB引擎,并且根据上载的信息页(8KB)锁定数据。当在数据库的很多地方进行更新的时候,这种锁定不会出现什么问题。但是,由于增加几行信息就要锁定数据结构的最后8KB,当需要增加大量的行,也别是大量的小型数据,就会带来问题。
  行级锁定提供了最佳的并行访问功能,一个表中只有一行数据被锁定。这就意味着很多应用程序能够更新同一个表中的不同行的数据,而不会引起锁定的问题。只有InnoDB存储引擎支持行级锁定。
  建立索引
  建立索引在搜索和恢复数据库中的数据的时候能够显著提高性能。不同的存储引擎提供不同的制作索引的技术。有些技术也许会更适合你存储的数据类型。
  有些存储引擎根本就不支持索引,其原因可能是它们使用基本表索引(如MERGE引擎)或者是因为数据存储的方式不允许索引(例如FEDERATED或者BLACKHOLE引擎)。
  事务处理
  事务处理功能通过提供在向表中更新和插入信息期间的可靠性。这种可靠性是通过如下方法实现的,它允许你更新表中的数据,但仅当应用的应用程序的所有相关操作完全完成后才接受你对表的更改。例如,在会计处理中每一笔会计分录处理将包括对借方科目和贷方科目数据的更改,你需要要使用事务处理功能保证对借方科目和贷方科目的数据更改都顺利完成,才接受所做的修改。如果任一项操作失败了,你都可以取消这个事务处理,这些修改就不存在了。如果这个事务处理过程完成了,我们可以通过允许这个修改来确认这个操作。



1.4、事务处理
MySQL中,InnoDB和BDB都支持事务处理。
事务是由一组SQL语句组成的逻辑处理单元,事务具有以下4个属性,通常简称为事务的ACID属性。
  (1)原子性(Atomicity):事务是一个原子操作单元,其对数据的修改,要么全都执行,要么全都不执行。
  (2)一致性(Consistent):在事务开始和完成时,数据都必须保持一致状态。这意味着所有相关的数据规则都必须应用于事务的修改,以保持数据的完整性;事务结束时,所有的内部数据结构(如B树索引或双向链表)也都必须是正确的。
  (3)隔离性(Isolation):数据库系统提供一定的隔离机制,保证事务在不受外部并发操作影响的“独立”环境执行。这意味着事务处理过程中的中间状态对外部是不可见的,反之亦然。
(4)持久性(Durable):事务完成之后,它对于数据的修改是永久性的,即使出现系统故障也能够保持。


第三章 MySQL的安装
1.  XP下安装
           打开下载的安装文件,出现如下界面:

mysql安装向导启动,点击“next”继续

        选择安装类型,有“Typical(默认)”、“Complete(完全)”、“Custom(用户自定义)”三个选项,我们选择“Custom”,有更多的选项,也方便熟悉安装过程。

        在“MySQL Server(MySQL服务器)”上左键单击,选择“This feature, and all subfeatures, will beinstalled on local hard drive.”,即“此部分,及下属子部分内容,全部安装在本地硬盘上”。点选“Change...”,手动指定安装目录。


确认一下先前的设置,如果有误,按“Back”返回重做。按“Install”开始安装。

正在安装中,请稍候,直到出现下面的界面。

点击“next”继续,出现如下界面。

       现在软件安装完成了,出现上面的界面,这里有一个很好的功能,mysql 配置向导,不用向以前一样,自己手动乱七八糟的配置my.ini 了,将“Configure the Mysql Server now”前面的勾打上,点“Finish”结束,软件的安装并启动mysql配置向导。
配置MySQL Server
      点击“Finsh”,出现如下界面,MySQL Server配置向导启动。

点击“next”出现如下界面,

       选择配置方式,“Detailed Configuration(手动精确配置)”、“Standard Configuration(标准配置)”,我们选择“Detailed Configuration”,方便熟悉配置过程。

       选择服务器类型,“Developer Machine(开发测试类,mysql 占用很少资源)”、“Server Machine(服务器类型,mysql占用较多资源)”、“Dedicated MySQL Server Machine(专门的数据库服务器,mysql占用所有可用资源)”,大家根据自己的类型选择了,一般选“Server Machine”,不会太少,也不会占满。

        选择mysql数据库的大致用途,“Multifunctional Database(通用多功能型,好)”、“Transactional Database Only(服务器类型,专注于事务处理,一般)”、“Non-Transactional Database Only(非事务处理型,较简单,主要做一些监控、记数用,对MyISAM数据类型的支持仅限于non-transactional),随自己的用途而选择了,我这里选择“Transactional Database Only”,按“Next”继续。

       对InnoDB Tablespace进行配置,就是为InnoDB 数据库文件选择一个存储空间,如果修改了,要记住位置,重装的时候要选择一样的地方,否则可能会造成数据库损坏,当然,对数据库做个备份就没问题了,这里不详述。我这里没有修改,使用默认位置,直接按“Next”继续。

        选择您的网站的一般mysql 访问量,同时连接的数目,“Decision Support(DSS)/OLAP(20个左右)”、“Online Transaction Processing(OLTP)(500个左右)”、“Manual Setting(手动设置,自己输一个数)”,我这里选“Online Transaction Processing(OLTP)”,自己的服务器,应该够用了,按“Next”继续。

       是否启用TCP/IP连接,设定端口,如果不启用,就只能在自己的机器上访问mysql 数据库了,我这里启用,把前面的勾打上,Port Number:3306,在这个页面上,您还可以选择“启用标准模式”(Enable Strict Mode),这样MySQL就不会允许细小的语法错误。如果您还是个新手,我建议您取消标准模式以减少麻烦。但熟悉MySQL以后,尽量使用标准模式,因为它可以降低有害数据进入数据库的可能性。还有一个关于防火墙的设置“Add firewall exception ……”需要选中,将MYSQL服务的监听端口加为windows防火墙例外,避免防火墙阻断。按“Next”继续。

       注意:如果要用原来数据库的数据,最好能确定原来数据库用的是什么编码,如果这里设置的编码和原来数据库数据的编码不一致,在使用的时候可能会出现乱码。
这个比较重要,就是对mysql默认数据库语言编码进行设置,第一个是西文编码,第二个是多字节的通用utf8编码,都不是我们通用的编码,这里选择第三个,然后在Character Set 那里选择或填入“gbk”,当然也可以用“gb2312”,区别就是gbk的字库容量大,包括了gb2312的所有汉字,并且加上了繁体字和其它乱七八糟的字——使用mysql 的时候,在执行数据操作命令之前运行一次“SET NAMES GBK;”(运行一次就行了,GBK可以替换为其它值,视这里的设置而定),就可以正常的使用汉字(或其它文字)了,否则不能正常显示汉字。按“Next”继续。

        选择是否将mysql 安装为windows服务,还可以指定Service Name(服务标识名称),是否将mysql的bin目录加入到Windows PATH(加入后,就可以直接使用bin下的文件,而不用指出目录名,比如连接,“mysql.exe -uusername -ppassword;”就可以了,不用指出mysql.exe的完整地址,很方便),我这里全部打上了勾,Service Name不变。按“Next”继续。

       这一步询问是否要修改默认root 用户(超级管理)的密码(默认为空),“New root password”如果要修改,就在此填入新密码(如果是重装,并且之前已经设置了密码,在这里更改密码可能会出错,请留空,并将“Modify Security Settings”前面的勾去掉,安装配置完成后另行修改密码),“Confirm(再输一遍)”内再填一次,防止输错。“Enable root access from remotemachines(是否允许root 用户在其它的机器上登陆,如果要安全,就不要勾上,如果要方便,就勾上它)”。最后“Create An Anonymous Account(新建一个匿名用户,匿名用户可以连接数据库,不能操作数据,包括查询)”,一般就不用勾了,设置完毕,按“Next”继续。

       确认设置无误,如果有误,按“Back”返回检查。按“Execute”使设置生效。
      设置完毕,按“Finish”结束mysql的安装与配置——这里有一个比较常见的错误,就是不能“Startservice”,一般出现在以前有安装mysql 的服务器上,解决的办法,先保证以前安装的mysql 服务器彻底卸载掉了;不行的话,检查是否按上面一步所说,之前的密码是否有修改,照上面的操作;如果依然不行,将mysql 安装目录下的data文件夹备份,然后删除,在安装完成后,将安装生成的data文件夹删除,备份的data文件夹移回来,再重启mysql 服务就可以了,这种情况下,可能需要将数据库检查一下,然后修复一次,防止数据出错。


2.Linux下安装和参数配置
安装的三种方式:rpm、二进制、源码
Rpm
优点:安装简单,适合初学者学习使用
缺点:1. 需要单独下载客户端和服务器
2. 安装路径不灵活,默认路径不能修改,一台服务器只能安装一个mysql

二进制
优点: 1. 安装简单
2. 可以地安装到任何路径下,灵活性好
3. 一台服务器可以安装多个mysql
缺点: 1. 已经经过编译,性能不如源码编译的好
2. 不能灵活定制编译参数

源码
优点: 1. 在实际安装的操作系统进行可根据需要定制编译,最灵活
2. 性能最好
3. 一台服务器可以安装多个mysql
缺点: 1. 安装过程较复杂
2. 编译时间长


3.可视化工具的安装navicat
下一步即可。


第四章 Navicat的使用
除了navicat还有mysql-front ,phpadmin,mysql workbench等软件都是可视化管理mysql的软件。
参见《navicat使用说明书.chm》



第五章 MySQL的管理维护
a) 库连接管理
1.命令行连接数据库
Mysql –h IP –u 用户 –p sid
然后输入密码。
退出  quit
在Linux中,按Ctrl+D也可以退出。
2.创建连接,可以连接本地或者远程的MySQL的数据库。在空白处右键单击“创建连接”。

  
3.重启MySQL服务
Net stop mysql
Net start mysql

b) 表空间管理
     查看表空间:show databases;
创建表空间:create database ihis;
删除表空间:drop database ihis;
选择创建的数据库:use ihis;

注意:
1、有些操作系统对大小写敏感.比如linux/unix.
2、表空间大小限制取决于操作系统。
从MySQL5.0以后,在不同操作系统大小限制如下:
Operating System                    File-size Limit
Win32 w/ FAT/FAT32                2GB/4GB
Win32 w/ NTFS                     2TB (possibly larger)
Linux 2.2-Intel 32-bit             2GB (LFS: 4GB)
Linux 2.4+                        (using ext3 file system) 4TB
Solaris 9/10                                    16TB
MacOS X w/ HFS+                             2TB
NetWare w/NSS file system             8TB
                3、如果表太大,比如几十T,需要将该表拆分成不同的分区。
   可以利用表分区的功能,将一张大表,拆分成若干小表。
· RANGE分区:基于属于一个给定连续区间的列值,把多行分配给分区。 
· LIST分区:类似于按RANGE分区,区别在于LIST分区是基于列值匹配一个离散值集合中的某个值来进行选择。 
· HASH分区:基于用户定义的表达式的返回值来进行选择的分区,该表达式使用将要插入到表中的这些行的列值进行计算。这个函数可以包含MySQL 中有效的、产生非负整数值的任何表达式。
· KEY分区:类似于按HASH分区,区别在于KEY分区只支持计算一列或多列,且MySQL 服务器提供其自身的哈希函数。必须有一列或多列包含整数值。

RANGE分区:
CREATE TABLE employees (
    id INT NOT NULL,
    fname VARCHAR(30),
    lname VARCHAR(30),
    hired DATE NOT NULL DEFAULT '1970-01-01',
    separated DATE NOT NULL DEFAULT '9999-12-31',
    job_code INT NOT NULL,
    store_id INT NOT NULL
)

partition BY RANGE (store_id) (
    partition p0 VALUES LESS THAN (6),
    partition p1 VALUES LESS THAN (11),
    partition p2 VALUES LESS THAN (16),
    partition p3 VALUES LESS THAN (21)
);
c) 用户及权限管理
添加用户:
CREATE USER语法
CREATE USER user [IDENTIFIED BY [PASSWORD] 'password']    [, user [IDENTIFIED BY [PASSWORD] 'password']] 

shell> mysql -u root mysql 
mysql> INSERT INTO user (Host,User,Password) 
 VALUES('%','jeffrey','biscuit');
图形化界面。

修改密码:
mysqladmin -u wl -h localhost -p password wl
UPDATE user SET Password = PASSWORD('bagel') WHERE Host = '%' AND User = 'francis'; 
FLUSH PRIVILEGES;
图形化界面。


授权
图形化界面。
grant all privileges on *.* to root@"%" identified by "sys"
刷新数据库flush privileges
diyige * biao kongjian  dier ge wei shitu

d) 操作表、视图、触发器

新建表:
CREATE TABLE `NewTable` (
`field1`  int(5) NULL AUTO_INCREMENT ,
`field2`  varchar(32) NULL ,
PRIMARY KEY (`field1`)
) ENGINE=MyISAM;

删除表:
Drop table 表名

修改表
ALTER TABLE `xt_xzqzdb`
MODIFY COLUMN `qt_ctn_code`  int(6) NOT NULL AUTO_INCREMENT FIRST ,
AUTO_INCREMENT=1;

视图
基于单表的视图,没有函数处理是列对列对应的情况时,支持数据的更新,插入、删除的操作。
基于多表的视图的时候,只支持插入和更新的操作,不支持删除。
新建视图:
CREATE 
VIEW `NewView`AS 
select * from aa ;

修改视图:
ALTER 
ALGORITHM=UNDEFINED 
DEFINER=`root`@`localhost` 
SQL SECURITY DEFINER 
VIEW `view_bizprocinst` AS 
select `rt_processinstance`.`PROC_INSTANCE_ID` AS
ALGORITHM可取三个值:MERGE、TEMPTABLE或UNDEFINED。如果没有ALGORITHM子句,默认算法是UNDEFINED(未定义的)。
对于MERGE,会将引用视图的语句的文本与视图定义合并起来,使得视图定义的某一部分取代语句的对应部分。
对于TEMPTABLE,视图的结果将被置于临时表中,然后使用它执行语句。
对于UNDEFINED,MySQL将选择所要使用的算法。如果可能,它倾向于MERGE而不是TEMPTABLE,这是因为MERGE通常更有效,而且如果使用了临时表,视图是不可更新的。


删除视图:
DROP VIEW 视图名

函数
函数的定义:
CREATE DEFINER = `root`@`localhost` FUNCTION `NewProc`(`f_string` VARCHAR(40),`f_delimiter` VARCHAR(40))
 RETURNS varchar(250)
BEGIN
declare result varchar(250 ) default '';   
declare str_key varchar(40 ) default  '';  
DECLARE record_not_found INTEGER DEFAULT 0; 
 declare  cur_1 CURSOR FOR SELECT pername FROM `VIEW_RESULTQUERYINFO`  where cxbh  = f_string and houseid = f_delimiter  group by cxbh,certificate,pername;
 DECLARE CONTINUE HANDLER FOR NOT FOUND SET record_not_found = 1;
open cur_1;   
allperson: LOOP 
                     FETCH cur_1 INTO str_key; 
                     IF record_not_found THEN 
                             LEAVE allperson; 
                     END IF; 
                     SET result = CONCAT(result,", ",str_key); 
             END LOOP allperson;    
close cur_1;
return SUBSTR(result,3);   
END;

事件
1) 表准备工作
mysql> create database db_test
mysql> use db_test
mysql> CREATE TABLE tab_heartbeat (
id int(11) not null AUTO_INCREMENT PRIMARY KEY,
source_server varchar(10) not null,
update_time timestamp
) ENGINE=MyISAM;
mysql> insert into tab_heartbeat set source_server = 'WEB50';
mysql> insert into tab_heartbeat set source_server = 'WEB50';
mysql> select * from tab_heartbeat;
+----+---------------+---------------------+
| id | source_server | update_time         |
+----+---------------+---------------------+
|  1 | WEB50         | 2011-06-22 10:48:03 |
|  2 | WEB50         | 2011-06-22 10:48:31 |
+----+---------------+---------------------+
2 rows in set (0.00 sec)

2) Master建立Event(5.1版以上支持)
Ø 开启Master的event scheduler
默认EVENT支持是没有启动的, 可以通过下面的命令来查看状态: 
mysql> Select @@global.event_scheduler;
如果返回OFF, 则需要执行下面的命令启动: 
mysql> SET GLOBAL event_scheduler = ON;
上面虽然启动了EVENT, 但是每次重启mysqld之后EVENT并没有自动启动, 还得修改my.cnf文件:
# vi $MYSQL_HOME/etc/my.cnf
-----------------------------------------------------
[mysqld]
event_scheduler = 1
-----------------------------------------------------
Ø 建立Event负责每分钟插入一条数据
mysql> use db_test
mysql> DROP EVENT IF EXISTS e_insert_heartbeat; 
mysql> CREATE EVENT e_insert_heartbeat ON SCHEDULE every 1 minute
DO insert into db_test.tab_heartbeat set source_server = 'WEB50';
几分钟后, 验证数据:
mysql> select * from db_test.tab_heartbeat order by id desc limit 3;
+-----+---------------+---------------------+
| id  | source_server | update_time         |
+-----+---------------+---------------------+
| 111 | WEB50         | 2011-06-22 13:25:24 |
| 110 | WEB50         | 2011-06-22 13:24:24 |
| 109 | WEB50         | 2011-06-22 13:23:24 |
+-----+---------------+---------------------+
3 rows in set (0.00 sec)
Ø 建立Event负责每天自动删除两天前的旧数据, 以防该表过大
mysql> DROP EVENT IF EXISTS e_delete_heartbeat; 
mysql> CREATE EVENT e_delete_heartbeat ON SCHEDULE every 1 day
DO delete from db_test.tab_heartbeat where update_time <= date_add(current_timestamp, interval -2 day);

3) 如果复制正常, 在Slave上就可以查询到该表数据, 就知道复制是否正常了
mysql> select * from db_test.tab_heartbeat order by id desc limit 3;
+-----+---------------+---------------------+
| id  | source_server | update_time         |
+-----+---------------+---------------------+
| 111 | WEB50         | 2011-06-22 13:25:24 |
| 110 | WEB50         | 2011-06-22 13:24:24 |
| 109 | WEB50         | 2011-06-22 13:23:24 |
+-----+---------------+---------------------+
3 rows in set (0.00 sec) 

e) 从oracle到MySQL
两种数据库中,常用的几种数据类型对应如下:

使用Convert Oracle to MySQL4.0 软件可以实现转换。对blob字段类型也有很好的支持,不过对long raw 不支持。

f) 从MySQL到oracle
使用MySQL To Oracle 2.3软件可以转换。

g) 冷备份和逻辑备份
冷备份 (只能全部备份)
查看my.ini配置文件中的datadir,找到数据文件的位置。
然后备份对应的实例,这是操作系统级别的备份。

逻辑备份
mysqldump -h localhost -u root -p test >e:\eee.sql然后输入密码

单个表的备份
 方法1:
mysql > select * into outfile ‘/tmp/order_tab’ fields-terminatedby=’,’
from order_tab;
 方法2:
mysqldump –u root –p*** –T /tmp pointcard order_tab --fieldsterminated-
by=’,’;

h) 数据库恢复
单个表的恢复:
1. 方法1:
mysql > load data [local] infile ‘/tmp/order_tab’ into table
order_tab fields-terminated-by=’,’;
2. 方法2:
mysqlimport –u root –p*** [--local] pointcatd order_tab.txt --
fields-terminated-by=’,’;
注意:如果导入和导出是跨平台操作的(windows 和linux),那么要注意设置参数lineterminated-by, windows 上设置为line-terminated-by=’\r\n’,linux 上设置为
line-terminated-by=’\n’.


mysqldump -h localhost -u root -p test <e:\eee.sql然后输入密码

通过图形化界面,右键单击实例,运行SQL文件。
等于命令:source d:/MySQL.sql;


第六章 SQL的使用
a) 增删改查的SQL
SELECT c1, c2 FROM t WHERE (c3 > 100) AND (c1 < 100) and tname like '%杨%';
insert into test(tid,tname,tdate) value(1,'yangjuqi','2008-03-21');
update test set tname='张三' where tid='2';
delete from test where tid='2';
b) 数据类型
INT或INTEGER 4 字节 (-2 147 483 648,2 147 483 647) (0,4 294 967 295) 大整数值 
TINYINT 1 字节 (-128,127) (0,255) 小整数值 
SMALLINT 2 字节 (-32 768,32 767) (0,65 535) 大整数值 
MEDIUMINT 3 字节 (-8 388 608,8 388 607) (0,16 777 215) 大整数值 
BIGINT 8 字节 (-9 233 372 036 854 775 808,9 223 372 036 854 775 807) (0,18 446 744 073 709 551 615) 极大整数值 
FLOAT 4 字节 (-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 字节 (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的值 小数值
CHAR 0-255字节 定长字符串 
VARCHAR 0-255字节 变长字符串 
TINYBLOB 0-255字节 不超过 255 个字符的二进制字符串 
TINYTEXT 0-255字节 短文本字符串 
BLOB 0-65 535字节 二进制形式的长文本数据 
TEXT 0-65 535字节 长文本数据 
MEDIUMBLOB 0-16 777 215字节 二进制形式的中等长度文本数据 
MEDIUMTEXT 0-16 777 215字节 中等长度文本数据 
LOGNGBLOB 0-4 294 967 295字节 二进制形式的极大文本数据 
LONGTEXT 0-4 294 967 295字节 极大文本数据


c) 常用的Mysql函数介绍
查询当前mysql版本以及当前时间:
select version(),current_date ;
查看数据库状态
         status;
刷新数据库
flush privileges;
     聚合函数min/max等,在使用聚合函数的时候,可以使用group by /having子句
   字符串处理函数substring/trim/round/等

       左右连接:
左连接
select * from table A left join table B on A.XX = B.XX [ where A.XXX = XXX ] 
右连接
select * from table A right join table B on A.XX = B.XX [ where A.XXX = XXX ]
内连接
MySQL内连接的数据记录中,不会存在字段为NULL的情况。select * from table1 a inner join table2 b on a.city = b.city 和select * from table1 a join table2 b on a.city = b.city 的效果是一样的,即如果join的左边没有诸如left、right或者inner这样的关键字时,缺省的是内连接。另外,MySQL不支持full join。

更多参见《mysql函数.txt》



第七章 技巧篇
a) 索引的使用
按算法分类:
存储引擎 允许的索引类型
MyISAM  BTREE
InnoDB  BTREE
MEMORY/HEAP  HASH, BTREE
示例:
CREATE TABLE lookup (id INT) ENGINE = MEMORY;
CREATE INDEX id_index USING BTREE ON lookup (id);
 
大多数MySQL 索引(PRIMARY KEY、UNIQUE、INDEX 和FULLTEXT)在B 树中存储。只是空间列类型的索引使用R-树,并且MEMORY 表还支持hash 索引。



全文检索:全文索引是MyISAM的一个特殊索引类型。当表有full text全文检索时,使用select * from bizdata where MATCH(biz01) AGAINST('1')。可以使用到全文检索。

只有在使用MyISAM, InnoDB或BDB表类型时,您可以向有NULL值的列中添加索引。
只有在使用MyISAM, BDB或InnoDB表类型时,您可以向BLOB或TEXT列中添加索引。
一个index_col_name规约可以以ASC或DESC为结尾。这些关键词将来可以扩展,用于指定递增或递减索引值存储。
       
         按索引的组成分类:
索引分单列索引和组合索引。单列索引,即一个索引只包含单个列,一个表可以有多个单列索引(最多16个),但这不是组合索引。组合索引,即一个索包含多个列。
  MySQL索引类型包括:
  (1)普通索引
  这是最基本的索引,它没有任何限制。它有以下几种创建方式:
  ◆创建索引
  CREATE INDEX indexName ON mytable(username(length));
  如果是 CHAR,VARCHAR类型,length可以小于字段实际长度;如果是BLOB和TEXT类型,必须指定 length,下同。
  ◆修改表结构
  ALTER mytable ADD INDEX [indexName] ON (username(length))
  ◆ 创建表的时候直接指定
  CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, INDEX [indexName] (username(length)) );
  删除索引的语法:
  DROP INDEX [indexName] ON mytable;
  (2)唯一索引
  它与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。它有以下几种创建方式:
  ◆创建索引
   CREATE UNIQUE INDEX indexName ON mytable(username(length))
  ◆修改表结构
  ALTER mytable ADD UNIQUE [indexName] ON (username(length))
  ◆创建表的时候直接指定
  CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, UNIQUE [indexName] (username(length)) );
  (3)主键索引
  它是一种特殊的唯一索引,不允许有空值。一般是在建表的时候同时创建主键索引:
  CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, PRIMARY KEY(ID) );
  当然也可以用 ALTER 命令。记住:一个表只能有一个主键。
  (4)组合索引
  为了形象地对比单列索引和组合索引,为表添加多个字段:
  CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, city VARCHAR(50) NOT NULL, age INT NOT NULL );
  为了进一步榨取MySQL的效率,就要考虑建立组合索引。就是将 name, city, age建到一个索引里:
  ALTER TABLE mytable ADD INDEX name_city_age (name(10),city,age);
  建表时,usernname长度为 16,这里用 10。这是因为一般情况下名字的长度不会超过10,这样会加速索引查询速度,还会减少索引文件的大小,提高INSERT的更新速度。
  如果分别在 usernname,city,age上建立单列索引,让该表有3个单列索引,查询时和上述的组合索引效率也会大不一样,远远低于我们的组合索引。虽然此时有了三个索引,但MySQL只能用到其中的那个它认为似乎是最有效率的单列索引。
  建立这样的组合索引,其实是相当于分别建立了下面三组组合索引:
  usernname,city,age usernname,city usernname
  为什么没有 city,age这样的组合索引呢?这是因为MySQL组合索引“最左前缀”的结果。简单的理解就是只从最左面的开始组合。并不是只要包含这三列的查询都会用到该组合索引,下面的几个SQL就会用到这个组合索引:
  SELECT * FROM mytable WHREE username="admin" AND city="郑州" SELECT * FROM mytable WHREE username="admin"
  而下面几个则不会用到:
  SELECT * FROM mytable WHREE age=20 AND city="郑州" SELECT * FROM mytable WHREE city="郑州"
  (5)建立索引的时机
  到这里我们已经学会了建立索引,那么我们需要在什么情况下建立索引呢?一般来说,在WHERE和JOIN中出现的列需要建立索引,但也不完全如此,因为MySQL只对<,<=,=,>,>=,BETWEEN,IN,以及某些时候的LIKE才会使用索引。例如:
  SELECT t.Name FROM mytable t LEFT JOIN mytable m ON t.Name=m.username WHERE m.age=20 AND m.city='郑州'
  此时就需要对city和age建立索引,由于mytable表的 userame也出现在了JOIN子句中,也有对它建立索引的必要。
  刚才提到只有某些时候的LIKE才需建立索引。因为在以通配符%和_开头作查询时,MySQL不会使用索引。例如下句会使用索引:
  SELECT * FROM mytable WHERE username like'admin%'
  而下句就不会使用:
  SELECT * FROM mytable WHEREt Name like'%admin'
  因此,在使用LIKE时应注意以上的区别。
  (6)索引的不足之处
  上面都在说使用索引的好处,但过多的使用索引将会造成滥用。因此索引也会有它的缺点:
  ◆虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行 INSERT、UPDATE和DELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。
  ◆建立索引会占用磁盘空间的索引文件。一般情况这个问题不太严重,但如果你在一个大表上创建了多种组合索引,索引文件的会膨胀很快。
  索引只是提高效率的一个因素,如果你的 MySQL有大数据量的表,就需要花时间研究建立最优秀的索引,或优化查询语句。
  (7)使用索引的注意事项
  使用索引时,有以下一些技巧和注意事项:
  ◆索引不会包含有NULL值的列
  只要列中包含有NULL值都将不会被包含在索引中,复合索引中只要有一列含有 NULL值,那么这一列对于此复合索引就是无效的。所以我们在数据库设计时不要让字段的默认值为NULL。
  ◆使用短索引
  对串列进行索引,如果可能应该指定一个前缀长度。例如,如果有一个CHAR(255)的列,如果在前10个或20个字符内,多数值是惟一的,那么就不要对整个列进行索引。短索引不仅可以提高查询速度而且可以节省磁盘空间和I/O操作。
  ◆索引列排序
  MySQL查询只使用一个索引,因此如果 where子句中已经使用了索引的话,那么order by中的列是不会使用索引的。因此数据库默认排序可以符合要求的情况下不要使用排序操作;尽量不要包含多个列的排序,如果需要最好给这些列创建复合索引。
  ◆like语句操作
  一般情况下不鼓励使用like操作,如果非使用不可,如何使用也是一个问题。like “%aaa%” 不会使用索引而like “aaa%”可以使用索引。
  ◆不要在列上进行运算
  select * from users where YEAR(adddate)<2007;
  将在每个行上进行运算,这将导致索引失效而进行全表扫描,因此我们可以改成
   select * from users where adddate<‘2007-01-01’;
  ◆不使用NOT IN和<>操作
  以上,就对其中MySQL索引类型进行了介绍。






b) 锁的使用
页级:引擎 BDB。表级锁速度快,但冲突多,行级冲突少,但速度慢。所以取了折衷的页级,一次锁定相邻的一组记录。
表级:引擎 MyISAM。直接锁定整张表,在你锁定期间,其它进程无法对该表进行写操作。如果你是写锁,则其它进程则读也不允许。
行级:引擎 INNODB。仅对指定的记录进行加锁,这样其它进程还是可以对同一个表中的其它记录进行操作。


对WRITE,MySQL使用的表锁定方法原理如下:
如果在表上没有锁,在它上面放一个写锁。  
否则,把锁定请求放在写锁定队列中。  
对READ,MySQL使用的锁定方法原理如下:

如果在表上没有写锁定,把一个读锁定放在它上面。  
否则,把锁请求放在读锁定队列中。  


InnoDB使用行锁定,BDB使用页锁定。对于这两种存储引擎,都可能存在死锁。这是因为,在SQL语句处理期间,InnoDB自动获得行锁定和BDB获得页锁定,而不是在事务启动时获得。

行级锁定的优点:
· 当在许多线程中访问不同的行时只存在少量锁定冲突。
· 回滚时只有少量的更改。
· 可以长时间锁定单一的行。

行级锁定的缺点:
· 比页级或表级锁定占用更多的内存。
· 当在表的大部分中使用时,比页级或表级锁定速度慢,因为你必须获取更多的锁。
· 如果你在大部分数据上经常进行GROUP BY操作或者必须经常扫描整个表,比其它锁定明显慢很多。
· 用高级别锁定,通过支持不同的类型锁定,你也可以很容易地调节应用程序,因为其锁成本小于行级锁定。


在以下情况下,表锁定优先于页级或行级锁定:
· 表的大部分语句用于读取。
· 对严格的关键字进行读取和更新,你可以更新或删除可以用单一的读取的关键字来提取的一行:

· UPDATE tbl_name SET column=value WHERE unique_key_col=key_value;
· DELETE FROM tbl_name WHERE unique_key_col=key_value;
· SELECT 结合并行的INSERT语句,并且只有很少的UPDATE或DELETE语句。
· 在整个表上有许多扫描或GROUP BY操作,没有任何写操作。

显示锁的使用:
mysql> LOCK TABLES real_table WRITE, insert_table WRITE;
mysql> INSERT INTO real_table SELECT * FROM insert_table;
mysql> TRUNCATE TABLE insert_table;
mysql> UNLOCK TABLES;


c) Mysql事务控制
一般我们不直接在程序里写数据库的事务控制,一般都通过工具来使用事务,比如SPRING或者HIBERNATE的事务。
都是基于数据库事务的封装,一个基于DAO,一个基于业务。
DDL DML
START TRANSACTION | BEGIN [WORK]
COMMIT [WORK] [AND [NO] CHAIN] [[NO] RELEASE]
ROLLBACK [WORK] [AND [NO] CHAIN] [[NO] RELEASE]
SET AUTOCOMMIT = {0 | 1}
SAVEPOINT identifier
ROLLBACK [WORK] TO SAVEPOINT identifier
RELEASE SAVEPOINT identifier

d) 自增列的使用
需设置成主键。
ALTER TABLE `aaa`
MODIFY COLUMN `aa`  int(8) NOT NULL AUTO_INCREMENT AFTER `bb`;
ALTER TABLE `aaa`
AUTO_INCREMENT=2;



e) Mysql安全
linux下权限变更:
以linux管理员用户root进行安装MySQL, MySQL软件的默认权限都为root权限,如果不希望root用户管理MySQL软件以及数据,执行以下语句进行权限的变更:
Chown –R mysql:mysql /home/mysql/data
删除匿名账户
安装MySQL后系统会自动创建一个空账号,这样普通用户执行mysql命令就可以进行登陆操作,建议删除:
Drop user ‘’@’localhost’
Drop user ‘’@’localhost.localdomain’
给普通用户授权
Grant select,insert,update,delete on tablename to ’username’@’hostname’;
不能将mysql下的user表的管理权限授权给普通用户。
最好能实现对每个登陆用户IP的管理授权
更改密码时加密
Set password  for ‘username’@’hostname’ = PASSWORD(‘NEWPASSWORD’)
f) 安装和使用时的常见错误处理
提示Host is not allowed to connect to this MySQL server
update user set host = '%' where user = 'root';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'192.168.1.3' IDENTIFIED BY 'mypassword' WITH GRANT OPTION; 
卸载时的错误
1, 卸载MySQL
2, 删除目录 C:\Documents and Settings\All Users\Application Data\MySQL
3, 重新安装MySQL 就 OK 啦
------------------------------------------
[MySQL] Could not start the service MySQL 解决方法 

安装mysql 5.1.33,在运行Server Instance Configuration wizard时的Execute configurattion步骤中的第三项Start Service进出错,错误提示为Could not start the service MySQL (出现这种情况一般是因为装过mysql,卸载不干净造成的。卸载后重启后再重装。注意看下服务,如果未能卸载,可以用mysqld-nt -remove卸载)。
具体方法如下:
查看服务中有没有mysql,如果有将该服务停掉;
在控制面板中运行添加删除程序,将mysql卸载;
卸载后打开注册表,查看HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services 下的键值,如果有相关mysql键值(mysql、mysqladmin)则删掉,即可;
重启,将mysql的安装残余目录删掉 (查看服务,此时服务中已没有mysql);
重新安装mysql.安装后先不要运行Server Instance Configuration wizard,重启后在开始菜单中运行该向导,即可。
PS:一种值得参考的方法
---------------------------------------------
msyql安装到最后一步start service错误解决方法
1,到控制面板里面先把mysql删除.
2.到c盘C:\Program Files目录下把mysql目录删除.
3.如果在其他盘还有设置目录也要删除.空目录也要删除
4.到regedit把注册表
HKEY_LOCAL_MACHINE/SYSTEM/ControlSet001/Services/Eventlog/Applications/MySQL
HKEY_LOCAL_MACHINE/SYSTEM/ControlSet002/Services/Eventlog/Applications/MySQL
HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/Eventlog/Applications/MySQL
有的话,全部删除!
(技巧:用F3循环查找“mysql”)
5.如果任务管理器里有关mysql内容也删除
6,把防火墙关了
7,重新装mysql(这里我没有重启计算机) 
重装时候有必要的话,重启计算机,停用IIS,和删除temp里的临时文件.
实在不行的话,配置mysql时候,把mysql服务换个服务名.


无法删除 LEGACY_MYSQL51: 删除项时出错。
解决办法:注册表项里右键增加administrators所有权限


g) 字符集的管理
对于字符集的支持细化到四个层次:
      服务器(server),数据库(database),数据表(table)和连接(connection)。
服务器级别:i18n文件修改。
数据库级别:查看- SHOW VARIABLES LIKE 'character%';
(1)编译MySQL 时,指定了一个默认的字符集,这个字符集是 latin1
(2)安装MySQL 时,可以在配置文件 (my.ini) 中指定一个默认的的字          符集,如果没指定,这个值继承自编译时指定的;
(3)启动mysqld 时,可以在命令行参数中指定一个默认的的字符集,如果没指定,这个值继承自配置文件中的配置,此时 character_set_server 被设定为这个默认的字符集;
(4)当创建一个新的数据库时,除非明确指定,这个数据库的字符集被缺省设定为character_set_server;
(5)当选定了一个数据库时,character_set_database 被设定为这个数据库默认的字符集;

修改my.cnf
vi /etc/my.cnf
在[client]下添加
default-character-set=utf8
在[mysqld]下添加
default-character-set=utf8

4.重新启动MySQL
[root@bogon ~]# /etc/rc.d/init.d/mysql restart
修改数据库的字符集
    mysql>use mydb
    mysql>alter database mydb character set utf-8;
创建数据库指定数据库的字符集
    mysql>create database mydb character set utf-8;

通过配置文件修改:
修改/var/lib/mysql/mydb/db.opt
default-character-set=latin1
default-collation=latin1_swedish_ci

default-character-set=utf8
default-collation=utf8_general_ci
重起MySQL:
[root@bogon ~]# /etc/rc.d/init.d/mysql restart

表级别:
(1)在这个数据库里创建一张表时,表默认的字符集被设定为 character_set_database,也就是这个数据库默认的字符集;
(2)当在表内设置一栏时,除非明确指定,否则此栏缺省的字符集就是表默认的字符集;
通过可视化界面设置。

连接级别:
mysql> set character_set_client=utf8;
Query OK, 0 rows affected (0.00 sec)
mysql> set character_set_connection=utf8;
Query OK, 0 rows affected (0.00 sec)
mysql> set character_set_database=utf8;
Query OK, 0 rows affected (0.00 sec)
mysql> set character_set_results=utf8;
Query OK, 0 rows affected (0.00 sec)
mysql> set character_set_server=utf8;
Query OK, 0 rows affected (0.00 sec)
mysql> set character_set_system=utf8;
Query OK, 0 rows affected (0.01 sec)
mysql> set collation_connection=utf8;
Query OK, 0 rows affected (0.01 sec)
mysql> set collation_database=utf8;
Query OK, 0 rows affected (0.01 sec)
mysql> set collation_server=utf8;
Query OK, 0 rows affected (0.01 sec)

  
SQL的优化
MySQL 只支持优化 MyISAM、InnoDB 及 BDB 表。
Show status;查看服务器状态信息
show processlist;查看当前MySQL在进行的线程,包括线程的状态,是否锁表等等,可以实时的查看SQL执行情况,同事对一些锁表操作进行优化。
Explain + SQL 查看SQL的执行计划。

更详细的了解《深入浅出MySQL数据库开发、优化与管理维护.pdf》


第八章 结合UniEAP使用
a) 数据源管理
b) 开发注意事项
c) 常见数据类型的增删改查方法











  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数据库管理系统检查命令清单全文共2页,当前为第1页。数据库管理系统检查命令清单全文共2页,当前为第1页。数据库管理系统测评检查命令 数据库管理系统检查命令清单全文共2页,当前为第1页。 数据库管理系统检查命令清单全文共2页,当前为第1页。 Oracle 数据库 命令 说明 Oracle数据库管理系统测评检查命令 数据库检查时主要使用select只读查看命令,主要查看用户情况、安全策略配置文件、日志等。 cat /$ORACLE_HOME/rdbms/admin/utlpwdmg.sql cat /$ORACLE_HOME/network/admin/sqlnet.ora select * from v$version; select username,account_status from dba_users; select resource_name,limit from dba_profiles where profile='DEFAULT'; select granted_role from dba_role_privs where grantee='PUBLIC'; show parameter O7_DICTIONARY_ACCESSIBILITY; show parameter audit show parameter audit_sys_operations; show parameter audit_trail; select * from dba_stmt_audit_opts; select grantee from dba_tab_privs where table_name='AUD$' and grantee not in ('DELETE_CATALOG_ROLE') and grantee not in (select grantee from dba_role_privs where granted_role='DBA'); select resource_name,limit from dba_profiles where profile='DEFAULT' and resource_type='KERNEL'; select username,profile from dba_users; select * from dba_role_privs where granted_role= 'DBA'; select * from V_$PWFILE_USERS; archive log list; show parameter log_archive_dest; select * from role_sys_privs; select * from dba_sys_privs select policy_name,status from dba_sa_policies; select * from sys.aud$ where ROWNUM<5; SELECT name,password FROM user$ WHERE name='SYS'; select name from v$database; select instance_name from v$instance; Mysql 数据库管理系统检查命令清单全 共2页,当前为第2页。数据库管理系统检查命令清单全文共2页,当前为第2页。Mysql数据管理系统测评检查命令 数据库管理系统检查命令清单全 共2页,当前为第2页。 数据库管理系统检查命令清单全文共2页,当前为第2页。 数据库检查时主要使用select只读查看命令,主要查看用户情况、安全策略配置文件、日志等(连接数据库mysql –uusername –ppassword show databases;use mysql;) cat my.ini select user(); select host,user,password from mysql.user; show global variables like "%timeout%"; show variables like '%skip_networking%'; show variables like 'log_%'; show variables; select * from mysql.user; select version(); netstat -lnpt " grep 3306 cat .mysql_history cat /etc/my.cnf SELECT DISTINCT CONCAT('User: ''',user,'''@''',host,''';') AS query FROM mysql.user

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值