您的位置:首页 > 数据库 > MySQL

MySQL学习 --来自官方文档的翻译

2015-04-16 17:35 645 查看
通用知识:

1.mysql>sourcepath;

path:要执行的sql路径

学会使用helpcontent;里面会有详细的说明和例子

第一篇字符集

1.基础知识

级别:服务器、数据库、表、属性

characterset和collations的区别

字符集:一组符号和其编码的集合

排序规则:符合编码的比较规则,最简单的比较规则是二进制排序规则。

MySQL可以做的事情:

使用大量的字符集和排序规则组合来表示字符串,其应用水平可以在数据库、表、属性等级别。

然而要想知道如何高效利用MySQL这个优势,首先需要了解MySQL支持哪些字符集和相应的排序规则:

mysql>showcharacterset;--显示的是默认的排序规则

mysql>showcollationlike‘gb2312%’;--显示各种排序规则

collation命名规则:

以其相关联的字符集名开头结尾
_ci
(caseinsensitive),
_cs
(casesensitive),or
_bin
(binary).

常见字符集:

Charset|Description|Defaultcollation

ascii|USASCII|ascii_general_ci

gb2312|GB2312SimplifiedChinese|gb2312_chinese_ci

utf8|UTF-8Unicode|utf8_general_ci

latin1|cp1252WestEuropean|latin1_swedish_ci

gbk|GBKSimplifiedChinese|gbk_chinese_ci

2.指定字符集和排序规则(下面从四个级别说明)

Server:

way:

shell>mysqld--character-set-server=gb2312--collation-server=gb2312_chinese_ci

way:重编译

shell>
cmake.-DDEFAULT_CHARSET=gb2312


Database:


Syn:

1>创建数据库

CREATEDATABASEdb_name

[[DEFAULT]CHARACTERSETcharset_name]

[[DEFAULT]COLLATEcollation_name]

2>改变数据库

ALTERDATABASE

[[DEFAULT]CHARACTERSETcharset_name]

[[DEFAULT]COLLATEcollation_name]

Table:

CREATETABLEtb_name(column_list)

[[DEFAULT]CHARACTERSETcharset_name]

[[DEFAULT]COLLATEcollation_name]

Column:

每一个字符属性(比如char,varchar,text)都有相应的字符集和排序规则,这个可以在createtable和altertable

的从句中指定如下:

col_name{char|varchar|text}(col_length)

[CHARACTERSETcharset_name]

[COLLATEcollation_name]



col_name{set|enum}(val_list)

[CHARACTERSETcharset_name]

[COLLATEcollation_name]

第二篇SQL语句语法

1.数据定义语句

1.1数据库级别语句

1.1.1CREATEDATABASE

For:创建数据库

Syn:

CREATE{DATABASE|SCHEMA}[IFNOTEXISTS]db_name--注意绿色标记的位置和通用性

[create_specification]…

create_specification:

[DEFAULT]CHARACTERSET[=]charset_name|

[DEFAULT]COLLATE[=]collation_name

1.1.2ALTERDATABASE

For:改变数据库的默认排序规则和字符集--for表示语句的目的,后从之

Syn:--表示语法格式,后从之

ALTER{DATABASE|SCHEMA}[[code]db_name
]--当数据库为默认时可以忽略数据库名
alter_specification
...
ALTER{DATABASE|SCHEMA}
db_name

UPGRADEDATADIRECTORYNAME

alter_specification
:
[DEFAULT]CHARACTERSET[=]
charset_name

|[DEFAULT]COLLATE[=]
collation_name

1.2事件相关语句

注意:在使用事件要先开启,要查看是否开启事件:‘

mysql>SHOWVARIABLESLIKE'event_scheduler';

开启前事件:

1.动态开启,临时有效,数据库重启后恢复默认

SETGLOBALevent_scheduler=ON;

2.修改配置文件

1.2.1CREATEEVENT

For:创建事件(计划执行)

CREATE[DEFINER=username|CURRENT_USER]EVENT--username的格式:
'user_name
'@'[code]host_name'[/code]

[IFNOTEXISTS][shema_name.]event_name--事件是和数据库相关联的,如果没有指定模式名,那么其数据库是当前使用的数据库

ONSCHEDULEshedule

[ONCOMPLETION[NOT]PRESERVE]

[ENABLE|DIABLE|DISABLEONSLAVE]

[COMMENT‘comment’]

Doevent_body;

注意1:schedule:

ATtimestamp[+INTERVALinterval]|--常用的时间戳CURRENT_TIMESTAMP/

EVERYinterval

[STARTS]timestamp[+interval]…

[ENDS]timestamp[+interval]…

注意2:interval:

quantity
{YEAR|QUARTER|MONTH|DAY|HOUR|MINUTE|WEEK|SECOND|

YEAR_MONTH|DAY_HOUR|DAY_MINUTE|DAY_SECOND|HOUR_MINUTE|HOUR_SECOND|MINUTE_SECOND}--时间单位组合

事件组合的用法示例:

INTERVAL'2:10'HOUR_MINUTE间隔为2小时10分钟


注意3:event_body:


这里是包含的SQL语句,当事件被触发时执行事件。

其中可以使用beginend组合语句

示例:

delimiter|

CREATEEVENTe
ONSCHEDULE
EVERY5SECOND
DO
BEGIN
DECLAREvINTEGER;
DECLARECONTINUEHANDLERFORSQLEXCEPTIONBEGINEND;

SETv=0;
WHILEv<5DO
INSERTINTOt1VALUES(0);
UPDATEt2SETs1=s1+1;
SETv=v+1;
ENDWHILE;
END|

delimiter;


注意4:timestamp:


必须是日期+时间的格式:


[code](1)'2006-02-1023:59:00'
[/code]
[code](2)内置函数:NOW,CURRENT_TIMESTAMP
[/code]
[code]注意5:STARTSANDENDS
[/code]

EVERY12HOURSTARTSCURRENT_TIMESTAMP+INTERVAL30MINUTEENDSCURRENT_TIMESTAMP+INTERVAL4WEEK

从当前时间的30分钟后开始,每隔12小时,直到四周之后

注意6:

通常情况下,一个事件一旦失效就会被遗弃,可以使用ONCOMPLETIONPRESERVE



1.2.2ALTEREVENT

For:修改事件

Syn:

ALTER[DEFINER={user|CURRENT_USER}]--事件的定义者

EVENTevent_name

[ONSHEDULEshedule]

[RENAMETOnew_event_name]

[ENABLE|DISABLE|DIABLEONSLAVE]

[COMMENT‘comment’]

[DOevent_body]

1>onshedule可以使用mysql内建的函数和用户自己使用的变量但是不能够使用存储过程和用户自定义的函数。

2>renameto可以使用此语句将一个数据库的事件转移到另一个数据库

1.3索引相关

基础知识:mysql如何使用索引

索引的作用:简单的说就是为了加快定位数据的速度

索引的种类:

PRIMARYKEY,UNIQUE,INDEX,andFULLTEXT:B-tree

某些特殊数据上使用R-tree,内存表支持hash索引

1.3.1CREATEINDEX

CREATE[UNIQUE|FULLTEXT|SPATIAL]INDEXindex_name

[index_type]

ONtbl_name(index_col_name,…)--。。。表示可以创建多列索引

[index_option]

[algorithm_option|lock_option]…

index_col_name:

col_name[(length)][ASC|DESC]--指定表的哪个列可以使用索引

index_type:

USING{BTREE|HASH}--index的实现方法

index_option:

KEY_BLOCK_SIZE[=]value---仅在innoDB中受支持

|index_type

|WITHPARSERparser_name

|COMMENT‘string’

algorithm_option:

ALGORITHM[=]{DEFAULT|INPLACE|COPY}

--算法

lock_option:

LOCK[=]{DEFAULT|NONE|SHARED|EXCLUSIVE}--并行有关,是共享还是独占还是其他

注意1:index_col_name

索引可以仅用每一列列值的主要部分来创建,使用col_name(length)来指定每一列的前length个

字符(char,varchar,text)或者字节来组成。

前缀可以给CHAR,VARCHAR,BINARY,VARBINARY来指定,如果要指定BLOB和TEXT必须指定长度

前缀的长度和前缀支持是和存储引擎相关的。

注意2:几种索引形式

1.UNIQUE限定索引上的值必须是不同的,如果是前缀那么前缀必须是不同的。

2.FULLTEXT所以仅仅被InnoDB和MyISAM支持,并且仅支持CHAR,VARCHAR,TEXT列,不支持前缀

注意3:index_type:

StorageEnginePermissibleIndexTypes
InnoDB
BTREE
MyISAM
BTREE
MEMORY
/
HEAP

HASH
,
BTREE
NDB
HASH
,
BTREE
(seenoteintext)
如果没有被显示指明,则默认第一个。

1.4创建创建存储过程和函数

1.4.1CREATEPROCEDURE过程

CREATE

[DEFINER={user|CURRENT_USER}]

PROCEDUREsp_name([proc_parameter[,…]])--可选的函数参数

[characteristic…]routine_body

1.4.2CREATEFUNCTION函数

CREATE

[DEFINER={user|CURRENT_USER}]

FUNCTIONsp_name([func_parameter[,…]])

RETURNStype

[characteristic…]routine_body

characteristic
:
COMMENT'
string
'
|LANGUAGESQL
|[NOT]DETERMINISTIC
|{CONTAINSSQL|NOSQL|READSSQLDATA|MODIFIESSQLDATA}
|SQLSECURITY{DEFINER|INVOKER}

routine_body
:
ValidSQLroutinestatement

参数说明:

1.func_parameter:函数参数

过程的参数声明:IN,OUT,INOUT

函数:IN

IN:如无指定,每一个参数默认为IN,传递值给过程,过程可以修改其值但是对调用者不可见

OUT:从过程中传递一个值返回给调用者,初始值可以为空

INTOUT:参数可以被调用者初始化,并且可以被过程修改,返回可见。

param_nametype(任何有效的数据类型)

2.characteristic
:
COMMENT'
string
'
|LANGUAGESQL
|[NOT]DETERMINISTIC当函数的结果总是不变的,应制定为DETERMINISTIC,
|{CONTAINSSQL|NOSQL|READSSQLDATA|MODIFIESSQLDATA}
|SQLSECURITY{DEFINER|INVOKER}[/code]

注意1:

这些存储例程是和数据库相关联的,默认是当前数据库,若要创建某一数据库的例程,指定:[code]db_name.sp_name

注意2:

函数可以直接在表达式中使用,而存储过程需使用call来进行调用。

函数示例:

mysql>[code]CREATEFUNCTIONhello(sCHAR(20))

mysql>
RETURNSCHAR(50)DETERMINISTIC

->
RETURNCONCAT('Hello,',s,'!');

QueryOK,0rowsaffected(0.00sec)

mysql>
SELECThello('world');

+----------------+
|hello('world')|
+----------------+
|Hello,world!|
+----------------+
1rowinset(0.00sec)[/code]
注意3:rontine_body(functionandprocedure)

同:可以由有效的sql语句组成,可以是简单的sql语句也可以是多sql语句的组合

不同:

1.存储过程可以包含数据定义语言,也可以包含sql事务(commit、rollback),但是存储函数不行

2.存储过程可以包含带有返回结果集的语句,但函数不可以。如select,show,checktableandsoon

3.use皆不被允许


1.5表的语法***


1.5.1CREATETABLE


For:创建数据中的表

Syn:

CREATE[TEMPORARY]TABLE[IFNOTEXISTS]tbl_name
(create_definition,…)

[table_option]

[partition_option]

or:

CREATE[TEMPORARY]TABLE[IFNOTEXISTS]tbl_name
[(create_definition,…)
]

[table_option]

[partition_option]

select_statement

or:

CREATE[TEMPORARY]TABLE[IFNOTEXISTS]tbl_name

{LIKEold_tbl_name|(LIKEold_tbl_name)}

create_definition:

coL_namecolumn_definition

|[CONSTRAINT[symbol]]PRIMARYKEY
[index_type](index_coL_name,…)

[index_option]….

|{INDEX|KEY}[index_name]
[index_type](index_coL_name,…)

|[CONSTRAINT[symbol]]UNIQUE[INDEX|KEY]
[index_name][index_type](index_col_name,...)
[index_option]...
|{FULLTEXT|SPATIAL}[INDEX|KEY][index_name](index_col_name,...)
[index_option]...
|[CONSTRAINT[symbol]]FOREIGNKEY
[index_name](index_col_name,...)reference_definition
|CHECK(expr)


深蓝色部分为对列定义的其他约定。

reference_definition:

[CONSTRAINT[[code]symbol
]]FOREIGNKEY
[
index_name
](
index_col_name
,...)--index_name外键ID,如果未明确指外定外键的索引,则使用这个
REFERENCES
tbl_name
(
index_col_name
,...)
[ONDELETE
reference_option
]
[ONUPDATE
reference_option
]

reference_option
:
RESTRICT|CASCADE|SETNULL|NOACTION[/code]
CASCADE:当父表有更新或者删除操作时子表也发生相应的改变以保持一致。

SETNULL:当父表有更新或者删除操作时子表设置为空。

RESTRICT|NOACTION:阻止父表的更新或者删除操作。

SETDEFAULT:当父表有更新或者删除操作时子表设置defaultvalue

CREATETABLE…SELECT

For:可以创建来自select选择的所有列(包括数据)

拷贝或者复制表

CREATETABLEnew_tblSELECT*FROMorig_tbl;

CREATETABLEnew_tblLIKEorig_tbl;

1.5.2ALTERTABLE

修改外键:

ALTERTABLEtbl_name
ADD[CONSTRAINT[symbol]]FOREIGNKEY
[index_name](index_col_name,...)
REFERENCEStbl_name(index_col_name,...)
[ONDELETEreference_option]
[ONUPDATEreference_option]

注意:与create相比,这里的区别是多了一个add

启用外键:

ALTERTABLE[code]tbl_name
DROPFOREIGNKEY
fk_symbol
;[/code]
关于[code]fk_symbol,如果在创建表的时候已经指定CONSTRAINT[symbol]那么就可以使用,

反之则可以通过:’'

mysql>showCREATETABLEtb_name;来显示创建语法寻找fk_symbol

[/code]
1.6视图相关


1.6.1CREATEVIEW


CREATE[ORREPLACE]

[ALGORITHM={UNDEFINED|MERGE|TEMPTABLE}]

[DEFINER={user|CURRENT_USER}]

[SQLSECURITY{DEFINER|INVOKER}]

VIEWview_name[(column_list)]

ASselect_statement

[WITH[CASCADED|LOCAL]CHECKOPTION]


CREATEVIEW可以创建视图,或者如果使用ORREPLACE可以替代已经存在的一个视图。


select_statement是一个select语句,也可以包含其他view.

视图可以“冻结”视图创建的时间,比如说select*from若以后新的列以后被插入表中,那么视图

返回后的结果仍然是视图创建哪个时候的结果。


CHECKOPTION:限制被视图引用的表的数据被更新或者插入。

column_list:指定返回的列名,但是必须和返回的列的总数相等。



2.DML数据操作语言


1.CALL

For:调用存储过程

Syn:

CALLsp_name([parameter[,...]])
CALLsp_name[()]

2.DELETE

3.DO

For:执行不返回任何结果的表达式

DOexpr[,expr]...

4.HANDLER

5.INSERT

For:

6.LOADDATAINFILE==mysqlimport

For:以非常高的速度从文本文件中读入行到table。是SELECT…INTOOUTFIEL的补集

Syn:

LOADDATA[LOW_PRIORITY|CONCURRENT][LOCAL]INFILE‘file_name’

[REPLACE|IGNORE]

INTOTABLEtbl_name

[PARTITION(partition_name,…)]

[CHARACTERSETcharaset_name]---字符集设置

[{FIELDS|COLUMNS}---列级,属性级别

[TERMINATEDBY‘string’]---插入数据到表时

[[OPTIONALLY]ENCOLSEDBY‘char’]

[ESCAPEDBY‘char’]

]

[LINES---行级

[STARTINGBY‘string’]

[TERMINATEDBY‘string’]

]/mysql5/mysql_local_sql/loaddata.txt'intotablegoods;
QueryOK,0rowsaffected(0.00sec)

注意在windows上使用的是后斜杠

注意1:

如果你使用LOW_PRIORITY,其执行将被搁置直到所有的客户端都读完数据。当然这只有在支持表级别的锁的引擎上才可用。

如果你执行并发COCURRENT,那么当插入时可以执行读取操作

注意2:LOCAL

*local影响期望文件的位置错误的处理。当local被指定的时候,文件应该被客户端的程序在客户端上读取

并且发送到服务器上。文件位置要指定全路径。如果指定相对路径那么位置,那么这里的位置将是相对于客户端程序的位置。

*local没有被指定的话,文件这一定是存放在服务器端的,定位规则:

《1.全路径不必说

《2.相对路径,如果给出了相对路径的主要部分,那么服务器将在相对于服务器数据目录的位置寻找;

如果没有给出,那么将在默认数据库的数据库文件位置寻找。

注意3:replace和ignore(处理冗余键值应该采取的行为)

如果都没有指定那么这要视有没有local被声明。

没有local:发生错误,其余部分被忽略。

有local:默认的行为跟ignore被指定一样

注意4:LINES和FIELDS在命令上和select…intooutfile是一样的

缺省设置:

FIELDSTERMINATEDBY'\t'ENCLOSEDBY''ESCAPEDBY'\\'
LINESTERMINATEDBY'\n'STARTINGBY''

注意5:

startingby用法:

e.

b.txt

xxx44,铅笔,1,36
xxfafa78,88
helloxxx45,香蕉,6,30

mysql>loaddatainfile'D:/b.txt'into
tablegoodsfieldsterminatedby','lines
starting
by'xxx';

7.LAODXML

8.REPLACE

9.SELECT

SELECT语句

SELECT
[ALL|DISTINCT|DISTINCTROW]--distinct是distinctrow的同名
[HIGH_PRIORITY]
[MAX_STATEMENT_TIME=N]
[STRAIGHT_JOIN]
[SQL_SMALL_RESULT][SQL_BIG_RESULT][SQL_BUFFER_RESULT]
[SQL_CACHE|SQL_NO_CACHE][SQL_CALC_FOUND_ROWS]
select_expr[,select_expr...]
[FROMtable_references
[PARTITIONpartition_list]
[WHEREwhere_condition]
[GROUPBY{col_name|expr|position}
[ASC|DESC],...[WITHROLLUP]]--ASC|DESC跟在groupby或者orderby后
[HAVINGwhere_condition]--在groupby之后,在orderby之前
[ORDERBY{col_name|expr|position}
[ASC|DESC],...]
[LIMIT{[offset,]row_count|row_countOFFSEToffset}]
[PROCEDUREprocedure_name(argument_list)]
[INTOOUTFILE'file_name'
[CHARACTERSETcharset_name]
export_options---主要包括FIELDS和LINES
|INTODUMPFILE'file_name'
|INTOvar_name[,var_name]]
[FORUPDATE|LOCKINSHAREMODE]]

注意1:having

having可以使用聚集函数而where不可以

注意2:limit

Inotherwords,[code]LIMITrow_countisequivalentto[code]LIMIT0,row_count.

注意3:selectinto

(1)SELECTid,dataINTO@x,@yFROMtest.t1LIMIT1;

(2)TheSELECT...INTOOUTFILE

statementisintendedprimarilytoletyouveryquicklydumpatabletoatextfileontheservermachine

如果是远程主机可以使用:shell>mysql–e“select…”>file_name

10.UPDATE

暂时先到这,后续补充~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: