标签:
通用知识:
1.mysql>source path;
path:要执行的sql路径
学会使用help content;里面会有详细的说明和例子
第一篇 字符集
1.基础知识
级别:服务器、数据库、表、属性
character set和collations 的区别
字符集:一组符号和其编码的集合
排序规则:符合编码的比较规则,最简单的比较规则是二进制排序规则。
MySQL可以做的事情:
使用大量的字符集和排序规则组合来表示字符串,其应用水平可以在数据库、表、属性等级别。
然而要想知道如何高效利用MySQL这个优势,首先需要了解MySQL支持哪些字符集和相应的排序规则:
mysql>show character set; --显示的是默认的排序规则
mysql>show collation like ‘gb2312%’; --显示各种排序规则
collation命名规则:
以其相关联的字符集名开头结尾_ci
(case insensitive), _cs
(case sensitive), or _bin
(binary).
常见字符集:
Charset | Description | Default collation
ascii | US ASCII | ascii_general_ci
gb2312 | GB2312 Simplified Chinese | gb2312_chinese_ci
utf8 | UTF-8 Unicode | utf8_general_ci
latin1 | cp1252 West European | latin1_swedish_ci
gbk | GBK Simplified Chinese | 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>创建数据库
CREATE DATABASE db_name
[[DEFAULT] CHARACTER SET charset_name]
[[DEFAULT] COLLATE collation_name]
2>改变数据库
ALTER DATABASE
[[DEFAULT] CHARACTER SET charset_name]
[[DEFAULT] COLLATE collation_name]
Table:
CREATE TABLE tb_name(column_list)
[[DEFAULT] CHARACTER SET charset_name]
[[DEFAULT] COLLATE collation_name]
Column:
每一个字符属性(比如char,varchar,text)都有相应的字符集和排序规则,这个可以在create table和alter table
的从句中指定如下:
col_name {char|varchar|text} (col_length)
[CHARACTER SET charset_name]
[COLLATE collation_name]
或
col_name {set|enum} (val_list)
[CHARACTER SET charset_name]
[COLLATE collation_name]
第二篇 SQL语句语法
1.数据定义语句
1.1数据库级别语句
1.1.1CREATE DATABASE
For:创建数据库
Syn:
CREATE {DATABASE|SCHEMA} [IF NOT EXISTS] db_name --注意绿色标记的位置和通用性
[create_specification] …
create_specification:
[DEFAULT] CHARACTER SET [=] charset_name |
[DEFAULT] COLLATE [=] collation_name
1.1.2 ALTER DATABASE
For: 改变数据库的默认排序规则和字符集 --for表示语句的目的,后从之
Syn: --表示语法格式,后从之
ALTER {DATABASE | SCHEMA} [db_name
] --当数据库为默认时可以忽略数据库名
alter_specification
...
ALTER {DATABASE | SCHEMA} db_name
UPGRADE DATA DIRECTORY NAME
alter_specification
:
[DEFAULT] CHARACTER SET [=] charset_name
| [DEFAULT] COLLATE [=] collation_name
1.2 事件相关语句
注意:在使用事件要先开启,要查看是否开启事件:‘
mysql>SHOW VARIABLES LIKE ‘event_scheduler‘;
开启前事件:
1.动态开启,临时有效,数据库重启后恢复默认
SET GLOBAL event_scheduler = ON;
2.修改配置文件
1.2.1CREATE EVENT
For:创建事件(计划执行)
CREATE [DEFINER=username|CURRENT_USER] EVENT -- username 的格式:‘
user_name
‘@‘host_name
‘
[IF NOT EXISTS] [shema_name.]event_name --事件是和数据库相关联的,如果没有指定模式名,那么其数据库是当前使用的数据库
ON SCHEDULE shedule
[ON COMPLETION [NOT] PRESERVE]
[ENABLE|DIABLE|DISABLE ON SLAVE]
[COMMENT ‘comment’]
Do event_body;
注意1:schedule:
AT timestamp [+INTERVAL interval] | --常用的时间戳CURRENT_TIMESTAMP/
EVERY interval
[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语句,当事件被触发时执行事件。
其中可以使用begin end组合语句
示例:
delimiter |
CREATE EVENT e
ON SCHEDULE
EVERY 5 SECOND
DO
BEGIN
DECLARE v INTEGER;
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION BEGIN END;
SET v = 0;
WHILE v < 5 DO
INSERT INTO t1 VALUES (0);
UPDATE t2 SET s1 = s1 + 1;
SET v = v + 1;
END WHILE;
END |
delimiter ;
注意4:timestamp:
必须是日期+时间的格式:
(1)‘2006-02-10 23:59:00‘
(2)内置函数:NOW,CURRENT_TIMESTAMP
注意5:STARTS AND ENDS
EVERY 12 HOUR STARTS CURRENT_TIMESTAMP + INTERVAL 30 MINUTE ENDS CURRENT_TIMESTAMP + INTERVAL 4 WEEK
从当前时间的30分钟后开始,每隔12小时,直到四周之后
注意6:
通常情况下,一个事件一旦失效就会被遗弃,可以使用ON COMPLETION PRESERVE
1.2.2ALTER EVENT
For:修改事件
Syn:
ALTER [DEFINER ={user|CURRENT_USER}] --事件的定义者
EVENT event_name
[ON SHEDULE shedule]
[RENAME TO new_event_name]
[ENABLE|DISABLE|DIABLE ON SLAVE]
[COMMENT ‘comment’]
[DO event_body]
1>on shedule 可以使用mysql内建的函数和用户自己使用的变量但是不能够使用存储过程和用户自定义的函数。
2>rename to 可以使用此语句将一个数据库的事件转移到另一个数据库
1.3索引相关
基础知识:mysql如何使用索引
索引的作用:简单的说就是为了加快定位数据的速度。
索引的种类:
PRIMARY KEY,UNIQUE,INDEX, and FULLTEXT : B-tree
某些特殊数据上使用R-tree,内存表支持hash索引
1.3.1CREATE INDEX
CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name
[index_type]
ON tbl_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
|WITH PARSER parser_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:
Storage Engine | Permissible Index Types |
InnoDB |
BTREE |
MyISAM |
BTREE |
MEMORY /HEAP |
HASH ,
BTREE |
NDB |
HASH ,
BTREE (see note in text) |
如果没有被显示指明,则默认第一个。
1.4 创建创建存储过程和函数
1.4.1 CREATE PROCEDURE 过程
CREATE
[DEFINER={user|CURRENT_USER}]
PROCEDURE sp_name ([proc_parameter[,…]]) --可选的函数参数
[characteristic …] routine_body
1.4.2CREATE FUNCTION 函数
CREATE
[DEFINER={user|CURRENT_USER}]
FUNCTION sp_name ([func_parameter[,…]])
RETURNS type
[characteristic …] routine_body
characteristic
:
COMMENT ‘string
‘
| LANGUAGE SQL
| [NOT] DETERMINISTIC
| { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
| SQL SECURITY { DEFINER | INVOKER }
routine_body
:
Valid SQL routine statement
参数说明:
1.func_parameter:函数参数
过程的参数声明:IN,OUT,INOUT
函数:IN
IN:如无指定,每一个参数默认为IN,传递值给过程,过程可以修改其值但是对调用者不可见
OUT:从过程中传递一个值返回给调用者,初始值可以为空
INTOUT:参数可以被调用者初始化,并且可以被过程修改,返回可见。
param_name type(任何有效的数据类型)
2.characteristic
:
COMMENT ‘string
‘
| LANGUAGE SQL
| [NOT] DETERMINISTIC 当函数的结果总是不变的,应制定为DETERMINISTIC,
| { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
| SQL SECURITY { DEFINER | INVOKER }
注意1:
这些存储例程是和数据库相关联的,默认是当前数据库,若要创建某一数据库的例程,指定:db_name.sp_name
注意2:
函数可以直接在表达式中使用,而存储过程需使用call来进行调用。
函数示例:
mysql> CREATE FUNCTION hello (s CHAR(20))
mysql> RETURNS CHAR(50) DETERMINISTIC
-> RETURN CONCAT(‘Hello, ‘,s,‘!‘);
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT hello(‘world‘);
+----------------+
| hello(‘world‘) |
+----------------+
| Hello, world! |
+----------------+
1 row in set (0.00 sec)
注意3:rontine_body (function and procedure)
同:可以由有效的sql语句组成,可以是简单的sql语句也可以是多sql语句的组合
不同:
1.存储过程可以包含数据定义语言,也可以包含sql事务(commit、rollback),但是存储函数不行
2.存储过程可以包含带有返回结果集的语句,但函数不可以。如select,show,check table and so on
3.use皆不被允许
1.5表的语法 ***
1.5.1CREATE TABLE
For:创建数据中的表
Syn:
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
(create_definition,…)
[table_option]
[partition_option]
or:
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
[ (create_definition,…)
]
[table_option]
[partition_option]
select_statement
or:
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
{LIKE old_tbl_name | (LIKE old_tbl_name)}
create_definition:
coL_name column_definition
|[CONSTRAINT [symbol]] PRIMARY KEY [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]] FOREIGN KEY
[index_name] (index_col_name,...) reference_definition
| CHECK (expr)
深蓝色部分为对列定义的其他约定。
reference_definition :
[CONSTRAINT [symbol
]] FOREIGN KEY
[index_name
] (index_col_name
, ...) --index_name 外键ID,如果未明确指外定外键的索引,则使用这个
REFERENCES tbl_name
(index_col_name
,...)
[ON DELETE reference_option
]
[ON UPDATE reference_option
]
reference_option
:
RESTRICT | CASCADE | SET NULL | NO ACTION
CASCADE :当父表有更新或者删除操作时子表也发生相应的改变以保持一致。
SET NULL:当父表有更新或者删除操作时子表设置为空。
RESTRICT|NO ACTION:阻止父表的更新或者删除操作。
SET DEFAULT:当父表有更新或者删除操作时子表设置default value
CREATE TABLE …SELECT
For:可以创建来自select选择的所有列(包括数据)
拷贝或者复制表
CREATE TABLE new_tbl SELECT * FROM orig_tbl;
CREATE TABLE new_tbl LIKE orig_tbl;
1.5.2ALTER TABLE
修改外键:
ALTER TABLE tbl_name
ADD [CONSTRAINT [symbol]] FOREIGN KEY
[index_name] (index_col_name, ...)
REFERENCES tbl_name (index_col_name,...)
[ON DELETE reference_option]
[ON UPDATE reference_option]
注意:与create相比,这里的区别是多了一个add
启用外键:
ALTER TABLE tbl_name
DROP FOREIGN KEY fk_symbol
;
关于fk_symbol,如果在创建表的时候已经指定CONSTRAINT [symbol]那么就可以使用,
反之则可以通过:’‘
mysql>show CREATE TABLE tb_name ;来显示创建语法寻找fk_symbol
1.6视图相关
1.6.1CREATE VIEW
CREATE [OR REPLACE]
[ALGORITHM = {UNDEFINED |MERGE|TEMPTABLE}]
[DEFINER = {user |CURRENT_USER}]
[SQL SECURITY {DEFINER|INVOKER}]
VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED |LOCAL] CHECK OPTION]
CREATE VIEW 可以创建视图,或者如果使用 OR REPLACE可以替代已经存在的一个视图。
select_statement 是一个select 语句,也可以包含其他view.
视图可以“冻结”视图创建的时间,比如说select * from 若以后新的列以后被插入表中,那么视图
返回后的结果仍然是视图创建哪个时候的结果。
CHECK OPTION:限制被视图引用的表的数据被更新或者插入。
column_list:指定返回的列名,但是必须和返回的列的总数相等。
2.DML数据操作语言
1.CALL
For:调用存储过程
Syn:
CALL sp_name([parameter[,...]]) CALL sp_name[()]
2.DELETE
3.DO
For:执行不返回任何结果的表达式
DO expr [, expr] ...
4.HANDLER
5.INSERT
For:
6.LOAD DATA INFILE == mysqlimport
For:以非常高的速度从文本文件中读入行到table。是SELECT … INTO OUTFIEL的补集
Syn:
LOAD DATA [LOW_PRIORITY|CONCURRENT] [LOCAL] INFILE ‘file_name’
[REPLACE |IGNORE]
INTO TABLE tbl_name
[PARTITION (partition_name,…)]
[CHARACTER SET charaset_name] ---字符集设置
[{FIELDS | COLUMNS} ---列级,属性级别
[TERMINATED BY ‘string’] ---插入数据到表时
[[OPTIONALLY] ENCOLSED BY ‘char’]
[ESCAPED BY ‘char’]
]
[LINES ---行级
[STARTING BY ‘string’]
[TERMINATED BY ‘string’]
]/mysql5/mysql_local_sql/loaddata.txt‘ into table goods;
Query OK, 0 rows affected (0.00 sec)
注意在windows上使用的是后斜杠
注意1:
如果你使用LOW_PRIORITY ,其执行将被搁置直到所有的客户端都读完数据。当然这只有在支持表级别的锁的引擎上才可用。
如果你执行并发COCURRENT,那么当插入时可以执行读取操作
注意2:LOCAL
*local影响期望文件的位置和错误的处理。当local被指定的时候,文件应该被客户端的程序在客户端上读取
并且发送到服务器上。文件位置要指定全路径。如果指定相对路径那么位置,那么这里的位置将是相对于客户端程序的位置。
*local没有被指定的话,文件这一定是存放在服务器端的,定位规则:
《1.全路径不必说
《2.相对路径,如果给出了相对路径的主要部分,那么服务器将在相对于服务器数据目录的位置寻找;
如果没有给出,那么将在默认数据库的数据库文件位置寻找。
注意3:replace和ignore(处理冗余键值应该采取的行为)
如果都没有指定那么这要视有没有local被声明。
没有local:发生错误,其余部分被忽略。
有local:默认的行为跟ignore被指定一样
注意4:LINES和FIELDS在命令上和select … into outfile是一样的
缺省设置:
FIELDS TERMINATED BY ‘\t‘ ENCLOSED BY ‘‘ ESCAPED BY ‘\\‘ LINES TERMINATED BY ‘\n‘ STARTING BY ‘‘
注意5:
starting by 用法:
e.
b.txt
xxx44,铅笔,1,36
xxfafa78,88
hello xxx45,香蕉,6,30
mysql>load data infile ‘D:/b.txt‘ into table goods fields terminated by ‘,‘ lines starting by ‘xxx‘;
7.LAOD XML
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 ...] [FROM table_references [PARTITION partition_list] [WHERE where_condition] [GROUP BY {col_name | expr | position} [ASC | DESC], ... [WITH ROLLUP]] --ASC|DESC跟在group by 或者order by后 [HAVING where_condition] --在group by 之后,在order by 之前 [ORDER BY {col_name | expr | position} [ASC | DESC], ...] [LIMIT {[offset,] row_count | row_count OFFSET offset}] [PROCEDURE procedure_name(argument_list)] [INTO OUTFILE ‘file_name‘ [CHARACTER SET charset_name] export_options ---主要包括FIELDS 和 LINES | INTO DUMPFILE ‘file_name‘ | INTO var_name [, var_name]] [FOR UPDATE | LOCK IN SHARE MODE]]
注意1:having
having可以使用聚集函数而where不可以
注意2:limit
In other words, LIMIT
is equivalent to row_count
LIMIT 0,
.row_count
注意3:select into
(1) SELECT id, data INTO @x, @y FROM test.t1 LIMIT 1;
(2)The SELECT ... INTO OUTFILE
statement is intended primarily to let you very quickly dump a table to a text file on the server machine
如果是远程主机可以使用:shell>mysql –e “select …” >file_name
10.UPDATE
暂时先到这,后续补充~
标签:
原文地址:http://www.cnblogs.com/qianzhilan/p/4432752.html