MySQL学习笔记(一)

(1)登录:mysql -u root -p;(u和root可以不用加空格);

(2)mysql的数据类型:

   a) text:大的文本数据类型

   b) blob:存取二进制文件:如图片等,最大为64k;

(3)一些查看数据库对象信息操作:

   a) show databases;查看数据库信息;

   b) show tables;查看表信息;

   c) show columns from 表名:显示表的列信息;等同于 describe 表名;

   d) show status:显示服务器状态信息;

   e) show create database:显示创建特定数据库的mysql语句;

   f) show create table:显示创建特定表的mysql语句;

   g) show grants:用来显示授予用户(所有用户或特定用户)的安全权限;

   h) show errors和show warnings:显示服务器错误或警告信息;

   i) help show:显示所有允许的show语句;

(4)不能部分使用distinct关键字,distinct关键字应用于所有列而不仅是前置它的列;

(5)limit语句位于最后,在order by后;

   a) select sno from student limit 5;返回不多于5行;

   b) select sno from student limit 5,5;表示mysql返回从行5开始的5行;第一个数为开始位置,第二个数为要检索的行数;

   c) mysql 5支持limit的另一种替代语法:limit 4 offset 3:意思是从行3开始取4行;等同于limit 3,4;

   d) limit检索出来的第一行为行0而不是行1,因此,limit 1,1将检索出第二行而不是第一行;

   e) limit 10,5,如果只有13行,mysql将只返回它能返回的那么多行;

(6)MySql在处理or操作符之前,会优先处理and操作符;

(7)如在保存abc时,如果它后面有一个或多个空格,则子句where string like'%abc'将不会匹配它们,因为在最后的c后有多余的字符,解决这个问题的方法是在最后附加一个%,也可以使用函数去掉首尾空格;

(3)虽然似乎%通配符可以匹配任何东西,但有一个例外,即NULL,即使是where string like '%'也不能匹配有NULL的行;

(4)通配符使用时需注意:

   a) 不要过度使用通配符,如果其他操作符能达到相同的目的,应该使用其他操作符;通配符搜索的处理一般要比前面讨论的其他搜索所花时间更长;

   b) 在确实需要使用通配符时,除非绝对有必要,否则不要把它们用在搜索字符串的开始处,因为这样搜索起来是最慢的;


 

(1)mysql中实现拼接要使用函数Concat()函数来实现;需要指定一个或多个指定的字符串,各个串之间用逗号分隔;

如:select Concat(sno,': name is',sname,'!!') from ...;

(2)rtrim()函数去掉值右边的所有空格;

select concat('name is ',rtrim(sname),'!') from ...;

(3)mysql还支持ltrim()函数(去掉左边的空格),trim()函数(去掉值左右两边的空格);

select concat(ltrim(sname),' is great') as name from ..;

(4)select now();返回当前日期和时间;

(5)select sname,upper(sname) as name from student;

(6)soundex()函数:soundex是一个将任何文本串转换为描述其语音表示的字母数字模式的算法,soundex考虑了类似的发音字符和音节,使得能对串进行发音比较而不是字母比较:

select sname from student where soundex(sname) = soundex('great'); 将匹配所有发音类似于great的sname;

(7)mysql的日期格式尽量为yyyy-mm-dd;mysql支持两位数字的年份,处理00-69为2000-2069,处理70-99为1970-1999;

(8)datetime类型存储日期及时间值,Date()函数只提取列的日期部分;如要你想要的仅是日期,应尽量使用Date()函数;

select sname from stu where Date(birthday) = '2009-12-09';

(9)同样存在time(),当只需要时间时可以使用它;

(10)用Date()解决时间范围的问题:select * from stu where Date(birthday) between '2009-12-09' and '2012-12-09';

(11)查询为2005年12月的所有行:select * from stu where Year(birthday) = 2005 and Month(birthday) = 12;

(12)count(*)对表中行的数目进行计数,不管是否有空值NULL;count(column)对特定列中具有值的行进行计数,忽略NULL值;

(13)虽然max()一般用来找出最大的数值或日起值,但mysql允许将它用来返回任意列的最大值,包括返回文本列的最大值;

(14)同样,avg()、max()、min()、sum()也忽略null值;distinct不能用于count(*),即不允许使用count(distinct),使用distinct时必须使用列名;

(15)select (select count(*) from stu) as count1  from stu;

(16)mysql中不支持简化字符 *= 和 =* 的使用;

(17)使用union组合查询时,只能使用一条order by语句,它必须出现在最后一条select语句之后,不允许使用多条order by语句;

select sno,sname from stu where ...

union

select sno,sname from student where ...

order by ...;

虽然order by子句似乎只是最后一条select语句的组成部分,但实际上mysql将用它来排序所有select语句返回的所有结果;

(18)在数据库访问时,如果数据检索是最重要的,则可以通过在insert和into之间添加关键字low_priority,即insert low_priority into,则指示mysql降低insert语句的优先级;如果您使用LOW_PRIORITY关键词,则INSERT的执行被延迟,直到没有其它客户端从表中读取为止;

 

MySQL学习笔记(一)_第1张图片

MySQL学习笔记(一)_第2张图片

MySQL学习笔记(一)_第3张图片

MySQL学习笔记(一)_第4张图片

(1)插入多行数据:mysql用单条insert语句处理多个插入要比使用多条insert语句快,能提高数据库处理的性能;

insert into stu values(...),(...),(...);

(2)如果update语句更新多行,并且在更新这些行中的一行或多行时现一个错误,则整个update操作被取消,如果想即使发生错误,也继续进行更新,可使用ignore关键字,如:update ignore stu..

(3)如果想从表中更快的删除所有行,则可以使用truncate table语句,它和delete完成相同的工作,但速度更快(truncate实际是删除原来的表并重新创建一个表,而不是逐行删除表中的数据);

(4)MySql没有撤销(undo)操作,因此应该小心的使用update和delete,删除之前先用select语句进行查询;

(5)MySql中可以使用auto_increment实现自动增量;

num int not null auto_increment,

(6)如何获取auto_increment列的值,可使用last_insert_id()函数来获得这个值,如:select last_insert_id();次语句返回最后一个auto_increment值,然后可以将它用于后续的MySql语句;

(7)指定默认值:num int not null default 1;mysql中不允许使用函数作为默认值,只支持常量;

(8)MySql有一个具体管理和处理数据的内部引擎,在使用create table语句时,该引擎具体创建表,而在你使用select语句或进行其他数据库处理时,该引擎在内部处理你的请求;但MySql与其他DBMS不一样,它具有多种引擎,这些引擎都隐藏在MySql服务器内,全都能执行create table和select等命令;

(9)为什么要有多种引擎呢?因为它们具有各自不同的功能和特性,为不同的任务选择正确的引擎能获得良好的功能和灵活性;几个需要掌握的引擎:

   a) InnoDB是一个可靠的事务引擎,它不支持全文本搜索;

   b) MEMORY在功能上等同于MyISAM,但由于数据存储在内存(而不是磁盘)中,速度很块(特别适合于临时表);

   c) MyISAM是一个性能极高的引擎,它支持全文本搜索,但不支持事务处理;

(10)外键不能跨引擎,即使用一个引擎的表不能引用具有使用不同引擎的表的外键;

(11)更新表结构:

   alter table stu add sex char(2);

   alter table stu drop column sex;

(12)重命名表:

   rename table stu to student;

   rename table stu1 to student1,stu2 to student2,

    stu3 to student3;

(13)视图的性能问题:因为视图不包含数据,所以每次使用视图时,都必须处理查询执行时所需的任一个检索,所以性能可能会不高;

(14)当视图定义中有以下操作,则不能进行视图的更新:group by,having,联接,子查询,并,聚集函数(如min(),count()),distinct,导出列;

(15)存储过程:默认的MySql语句分隔符是;MySql命令行程序也使用;作为语句分隔符,如果命令行程序要解释存储过程自身内的;字符,则它们最终不会成为存储过程的成分,这会使存储过程中的SQL出现句法错误。解决办法是临时更改命令行程序的语句分隔符;

delimited //    告诉命令行使用//作为新的语句结束分隔符;

create procedure pro()

begin ...

end //             结束分隔符;

delimited; 

最后,为恢复原来的语句分隔符,可以使用delimited ; 除 \符号外,任何字符都可以用作语句分隔符;

(16)存储过程在创建后,被保存在服务器上以供使用,直至删除。删除存储过程:drop procedure ...;

(17)mysql存储过程支持in、out、inout类型的参数;如:

create procedure pro(out name1 char(3),out name2 char(3),out name3 char(4))...

(18)执行存储过程:call pro(@name1,@name2,@name3);所有MySql变量都必须以@开始;在调用时这条语句并不显示任何数据,它返回的是以后可以显示的变量,即执行完存储过程后,可以通过select @name1显示变量的内容; 

(19)对于create procedure pro(in name1 char(10), out @name2 char(10)),调用时call pro('zhangsan',@getName),然后select @getName获取值;

(20)显示存储过程信息:show create procedure ...;

show procedure status;将列出所有存储过程,为限制其输出,可使用like指定一个过滤模式,如:show procedure status like 'pro';

 

(1)MySql的游标只能用于存储过程和函数;

(2)在一个游标关闭后,如果没有重新打开,则不能使用它,但是,使用声明过的游标不需要再次声明,用open语句打开就可以了;

(3)如果不明确关闭游标,MySql将会在到达end语句时自动关闭它;

(4)declare语句的次序:declare语句的发布存在特定的次序,用declare语句定义的局部变量必须在定义任意游标或句柄之前,而句柄必须在游标之后定义;

(5)只有表才支持触发器(临时表和视图都不支持);

(6)触发器按每个表每个时间每次的定义,每个表每个事件每次只允许一个触发器,因此,每个表最多支持6个触发器(每条insert、update和delete的之前和之后),单一触发器不能与多个事件或多个表关联,所以,如果你需要一个对insert和update操作执行的触发器,则应该定义两个触发器;

(7)如果before触发器失败,则MySql将不执行请求的操作,此外,如果before触发器或语句本身失败,MySql将不执行after触发器(如果有的话);

(8)在insert触发器代码内,可引用一个名为NEW的虚拟表,访问被插入的行;在delete触发器代码内,你可以引用一个名为OLD的虚拟表,访问被删除的行;

(9)通常将before用于数据验证和净化(目的是保证插入表中的数据确实是需要的数据),本提示也适用于update触发器;

 

事务处理:

(1)MySql中使用start transaction来标识事务的开始;

(2)回退部分事务可以设置多个保存点,并且保存点越多越好,因为保留点越多,你就越能按照自己的意愿进行灵活的回退,同样使用保存点时,必须使用start transaction来标识事务的开始;

(3)保存点在事务处理完成(执行一条rollback或commit)后自动释放,也可以用release savepoint明确的释放保留点;

(4)默认的MySql行为是自动提交所有更改,可设置MySql不自动提交:set autocommit = 0;autocommit标识决定是否自动提交更改,不管有没有commit语句,设置autocommit为0(假)说明MySql不自动提交更改(直到autocommit被设置为真为止,设置为1);

(5)autocommit是针对每个连接而不是服务器的;

 

(1)字符集为字母和符号的集合,编码是为某个字符集成员的内部表示,校对为规定字符如何比较的指令;

(2)MySql支持众多的字符集,为查看所支持的字符集完整列表,可以: show character set;

(3)为了查看所支持校对的完整列表,使用: show collation;

(4)通常系统管理在安装时定义一个默认的字符集和校对。也可以在创建数据库时,指定默认的字符集和校对。为了确定所用的字符集和校对,可以使用:

show variables like 'character%';

show variables like 'collation%';

(5)实际上,字符集很少是服务器范围(甚至数据库范围)的设置,不同的表,甚至不同的列都可能需要不同的字符集,而且两者都可以在创建表时指定;

(6)为了给表指定字符集和校对,可使用:

create table mytable ( cloumn1 int,column2 char(3))

default character set hebrew collate hebrew_general_ci;

(7)如果指定character set和collate两者,则使用这些值;如果只指定character set,则使用此字符集及其默认的校对;如果既不指定character set,也不指定collate,则使用数据库默认的;

(8)除了能指定字符集和校对的表范围外,MySql还允许对每个列设置它们;

create table mytable ( column1 int ,

column2 char(3) character set latin1 collate latin1_general_ci

) default character set hebrew 

collate hebrew_general_ci;

(9)如果你需要用与创建表时不同的校对顺序排序特定的select语句,可以在select语句自身中进行:

select * from stu order by snamecollate latin1_general_cs;

在这个例子中,为区分大小写的校对;

(10)collate还可以用于group by、having、聚集函数、别名等;并且,如果绝对需要,字符串可以在字符集之间进行转换,使用cast()或convert()函数;

 

 

MySql服务器的安全基础是:用户应该对它们需要的数据具有适当的访问权,既不能多也不能少,换句话说,用户不能对过多的数据具有过多的访问权;

(1)应该严肃的对待root登录的使用,仅在绝对需要时使用它,不应该在日常的MySql中使用root;

(2)mysql用户帐号信息和信息存储在名为mysql的MySql数据库中:use mysql; select user from user;

(3)创建用户帐号(不一定需要口令):

create user scott identified by 'password';

identified by指定的口令为纯文本,MySql将在保存到user表之前对其进行加密;

(4)也可以通过直接插入行到user表来增加用户,不过为安全起见,一般不建议这样做,MySql用来存储用户帐号信息的表极为重要;

(5)重命名一个用户帐号:rename user scott to scott1;

(6)删除用户帐号:drop user scott;可删除用户帐号和所有的帐号权限;

(7)在创建用户帐号后,必须接着分配访问权限,新创建的用户帐号没有访问权限;为看到赋予用户帐号的权限,使用:

show grants for scott;

usage表示根本没有权限,表示在任意数据库和任意表上对任何东西都没有权限;

(8)为设置权限,使用grant语句:

grant select on test.* to scott; 允许scott在test数据库的所有表上使用select;

(9)撤销权限用:revoke select on test.* from scott;

(10)grant 和revoke可在几个层次上控制访问权限:

   a) 整个服务器,使用grant all 和 revoke all;

   b) 整个数据库,使用 on database.*;

   c) 特定的表,使用 on database.table;

   d) 特定的列;

   e) 特定的存储过程;

(11)更改口令:set password for scott=password('password');新的口令必须传递到password()函数进行加密;set password也可以用来设置你自己的口令:set password = password('password');在不指定用户名时,set password更新当前登录用户的口令;

 

 

备份:

(1)为了保证所有数据被写到磁盘,在备份前尽量首先使用flush tables刷新数据;

(2)analyze table table_name,用来检查表键是否正确;

(3)check table table_name;用来针对许多问题对表进行检查;

(4)MySql维护管理员依赖的一系列日志文件:

   a) MySql错误日志:它包含启动和关闭问题以及任意关键错误的细节,唯一data目录中,后缀名为.err;

   b) 查询日志:它记录所有MySql活动,在诊断问题时非常有用,次日志文件可能会很快的变得非常大,因此不应该长期使用它,位于data目录内,后缀名为.log;

   c) 二进制日志,它记录更新过数据(或者可能更新过数据)的所有语句,位于data目录内;

   d) 在使用日志时,可以使用flush logs 语句来刷新和重新开始所有日志文件;

 

性能:

(1)mysql是用一系列的默认设置预先配置的,从这些设置开始通过是很好的,但过一段时间后你可能需要调整内存分配、缓冲区大小等;查看当前设置:show variables 和 show status;

(2)MySql是一个多用户多线程的DBMS,即它经常同时执行多个任务,如果这些任务中的某一个执行缓慢,则所有请求都会执行缓慢;这时可使用 show processlist显示所有活动进程,还可以用kill命令终结某个特定的进程;

(3)总有不止一种方法编写同一条select语句,应该试验连接、并、子查询等,找出最佳的方法;

(4)使用explain语句让MySql解释它将如何执行一条select语句;

(5)多用存储过程;

(6)绝不要检索比需求还要多的数据,即尽量不要使用select *;

(7)应该总是使用正确的数据类型;

(8)在导入数据时,应该关闭自动提交;

(9)like很慢,一般来说,最好使用fulltext而不是like;

(10)最重要的规则是,每条规则在某些条件下都会被打破;

(11)经常查看MySql的参考手册:http://dev.mysql.com/doc/


你可能感兴趣的:(MySQL)