`
ihuashao
  • 浏览: 4555121 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

MySql语法笔记

阅读更多
摘要
连结MySQL
->mysql -u username -p
username 是你的账号名称。

远端连结
->mysql -h hostname -u username -p
hostname 是 MySQL 主机的名称。

显示全部的数据库
SHOW DATABASES;
mysql 是 MySQL 用来储存帐号和权限的数据库,不能删除。

选择数据库
USE database_name;

显示数据库里的数据表
SHOW TABLES;

显示数据表的信息
DESCRIBE table_name;

退出MySQL显示器
\q

SQL 的执行指令可以从文本文件內输入。
SOURCE file_name
如果沒有登入 MySQL 的显示器,用:
->mysql -u username -p < file_name

Primary key - 用来识别关键字的 key。
Foreign key - 代表连接的数据表,再另一个数据里的 primary key。

使用 MySQL
建立数据库
CREATE DATABASE employee;
建立一个叫 employee 的数据库。

建立数据表
CREATE TABLE table_name (table definition) [type=table_type];
完整格式:
程序码:
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] table_name [(create_definition, ...)]
[table_options] [select_statement];
or
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] table_name LIKE old_table_name;
create_definition:
col_name TYPE [NOT NULL | NULL] [DEFAULT default_value] [AUTO_INCREMENT]
[PRIMARY KEY] [reference_definition]
orPRIMARY KEY (index_col_name,...)
orKEY [index_name] (index_col_name,...)
orINDEX [index_name] (index_col_name,...)
orUNIQUE [INDEX] [index_name] (index_col_name,...)
or FULLTEXT [INDEX] [index_name] (index_col_name,...)
or[CONSTRAINT symbol] FOREIGN KEY [index_name] (index_col_name,...)
[reference_definition]
orCHECK (expression)
TEMPORARY 关键字是用來建立临时的数据表,当你的连结阶段结束后会自动删除。
CREATE TEMPORARY TABLE table_name;
IF NOT EXISTS 只有在数据表不存在时才会建立。
CREATE TABLE IF NOT EXISTS table_name;
LIKE old_table_name 会依照 old_table_name 的构造来建立新的数据表。
列定义(column definition) 可用的选项:
NOT NULL 或 NULL 來定义列不能包括 NULL (NOT NULL) 或可以包括 NULL (NULL)。
预设值是可以包括 NULL。
DEFAULT 可用來宣告列的预设值。
AUTO_INCREMENT 会自动产生连续的数字。产生的数字会大于数据表内的最大数值。
每个数据表只能有一个 AUTO_INCREMENT 列。他必须是索引。
任何 PRIMARY KEY 的列会自动建立索引。
PRIMARY KEY 可用來宣告 PRIMARY KEY 的列。
REFERENCES 可用來宣告列是 FOREIGN KEY,只能用在 InnoDB 数据表。
下面的关键字可用來宣告列的信息:
PRIMARY KEY 來设定多列的 PRIMARY KEY,跟着是列的名称。
INDEX 和 KEY 是一关键字,用来设定索引。
UNIQUE 表示列是独特的,一样是索引。
FULLTEXT 可用来建立 FULLTEXT 索引,可用于 TEXT, CHAR, VARCHAR 类型。
FULLTEXT 只能用在 MyISAM 数据表。
FOREIGN KEY 可用来宣告 FOREIGN KEY。
下面的选项可以不用,通常是用在最佳化:
AUTO_INCREMENT = #
设定开始的 AUTO_INCREMENT 数值.
AVG_ROW_LENGTH = #
可用来估计你要的列长度。
CHECKSUM = 1
开启数据表的核对值。可用来修复损坏的数据表。只能用在 MyISAM。
COMMENT = "字串"
用来输入数据表的注解。
MAX_ROWS = #
设定数据表允许的列值 (最大)。
MIN_ROWS = #
设定数据表允许的列值 (最小)。
PACK_KEYS = {0 | 1 | DEFAULT}
MySQL 的预设是会压缩 CHAR, VARCHAR, 和 TEXT 的字串。
如要关闭选 0。
DELAY_KEY_WRITE = {0 | 1}
延后 key 的更新,直到关团数据库。只能用在 MyISAM。
ROW_FORMAT = {default | dynamic | fixed | compress}
用来设定列的储存方式。只能用在 MyISAM。
RAID_TYPE = {1 | STRIPED | RAID0} RAID_CHUNKS = # RAID_CHUNKSIZE = #
RAID 的设定。
UNION = (table_name, [table_name...])
用于 MERGE 数据表。允许你设定 MERGE 使用的数据表。
INSERT_METHOD = {NO | FIRST | LAST}
用于 MERGE 数据表。设定要插入信息到哪个数据表。
DATA_DIRECTORY = "绝对路径"
储存信息的目录。
INDEX_DIRECTORY = "绝对路径"
储存索引的目录。

列和信息类型
數字类型
INT 和 FLOAT
例:salary decimal(10, 2) -宽度 10 和 2 个小数点。
可以用 UNSIGNED 和 ZEROFILL 关键字。
UNSIGNED 只能包括零或整數。ZEROFILL 会显示数字前的零数。
整數和变化
可以缩写成 INT,大小是 4 bytes。
TINYINT 是 1 byte,跟 BIT 和 BOOL 相同。
SMALLINT 是 2 bytes。
MEDIUMINT 是 3 bytes。
BIGINT 是 8 bytes。
FLOAT 是单精度的浮点数。DOUBLE 是双精度的浮点数,跟 REAL 和 DOUBLE PRECISION 相同。
字串和文字类型
CHAR 可用來储存固定长度的字串,如果不设定长度,预设是 CHAR(1)。
最大值是 255 个字元。
固定长度有时候会比 VARCHAR 来的快。
如果跟着的是 BINARY 关键字,比较字串的时侯必须注意大小写。
VARCHAR 可用来储存动态的字串,如果预先不知道字串的长度,范围是 0 到 255。
TEXT 可储存较长的字串,最大到 65535 個字元或 bytes。
BLOB 代表 binary large object,用来储存 binary 信息,最大到 65535 个字元或 bytes。比较字串时需要注意大小写。
TINYTEXT 或 TINYBLOB 可储存小于 255 个字元或 bytes 的字串。
MEDIUMTEXT 或 MEDIUMBLOB 可储存到 16777215 个字元或 bytes 的字串。
LONGTEXT 或 LONGBLOB 可储存到 4294,967,295 个字元或 bytes 的字串。
ENUM 可用来储存自订的值。
例:gender enum('m', 'f')
表示储存的值是 m 和 f。也可储存 NULL,所以可能的直是 m, f, NULL, 或 error。
SET 跟 ENUM 类似不过可以储存其它的 ENUM 值。
日期和时间类型
date 可用来储存日期,以 YYYY-MM-DD 显示。
time 可用来储存时间,以 HH:MM:SS 显示。
datetime 包含了日期和时间,以 YYYY-MM-DD HH:MM:SS 显示。
timestamp 储存插入列或改变的时间。
版本 4.0 之前可以用 timestamp(10) 来改变显示的宽度。
year 可用来储存年份,可以用 year(2) 或 year(4) 来设定显示格式,预设是 year(4)。
year(2) 代表从 1970 到 2069 的年份。

建立索引
任何宣告为 PRIMARY KEY, KEY, UNIQUE, 或 INDEX 的列都会自动建立索引。
要将索引建立到列用:
CREATE INDEX name ON employee(name);
这会建立一个叫 name 的索引到 employee 数据表里的 name 列。

刪除数据库,数据表,和索引
刪除整个数据库,包括里面的信息:
DROP DATABASE employee;
可以在 employee 的前面加上 IF EXISTS。
刪除一个数据表:
DROP TABLE assignment;
完整格式:
程序码:
DROP [TEMPORARY] TABLE [IF EXISTS] table_name [, table_name...]
刪除索引:
DROP INDEX index_name ON employee;

改变数据表结构
如果要改变数据表的结构,建立 name 的索引在 employee 里面的 name 列:
ALTER TABLE employee;
ADD INDEX name (name);
完整格式:
程序码:
ALTER [IGNORE] TABLE table_name alter_spec [, alter_spec ...]
alter_spec:
ADD [COLUMN] create_definition [FIRST | AFTER col_name]
orADD [COLUMN] (create_definition, create_definition,...)
orADD INDEX [index_name] (index_col_name,...)
orADD PRIMARY KEY (index_col_name,...)
or ADD UNIQUE [index_name] (index_col_name,...)
orADD FULLTEXT [index_name] (index_col_name,...)
orADD [CONSTRAINT symbol] FOREIGN KYE [index_name] (index_col_name,...)
[reference_definition]
orALTER [COLUMN] col_name {SET DEFAULT literal | DROP DEFAULT}
orCHANGE [COLUMN] old_col_name create_definition
[FIRST | AFTER column_name]
orMODIFY [COLUMN] create_definition [FIRST | AFTER col_name]
or DROP [COLUMN] col_name
or DROP PRIMARY KEY
orDROP INDEX index_name
or DISABLE KEYS
orENABLE KEYS
orRENAME [TO] new_table_name
or ORDER BY col_name
ortable_options
因为 ALTER 非常有弹性所以有很多的查询子句。
CHANGE 和 MODIFY 相同,可以让你改变列的定义或位置。
DROP COLUMN 会刪除数据表里的列。
DROP PRIMARY KEY 和 DROP INDEX 会删除相连的列索引。
DISABLE KEYS会告诉 MySQL 停止更新索引,只能用在 MyISAM。
ENABLE KEYS 会继续更新索引。
RENAME 可以让你改变数据表的名称。
ORDER BY 会重新排序列。

使用 INSERT
INSERT 可以让你输入列到数据表里。
完整格式:
程序码:
INSERT [LOW_PRIORITY | DELAYED] [IGNORE]
[INTO] table_name [(col_name,...)]
VALUES ((expression | DEFAULT),...),(...),...
[ON DUPLICATE KEY UPDATE col_name=expression, ...]
or
INSERT [LOW_PRIORITY | DELAYED] [IGNORE]
[INTO] table_name [(col_name,...)]
SELECT ...
or
INSERT [LOW_PRIORITY | DELAYED] [IGNORE]
[INTO] table_name
SET col_name=(expression | DEFAULT), ...
[ON DUPLICATE KEY UPDATE col_name=expression, ...]
例:
程序码:
INSERT INTO department VALUES
(42, 'Finance'),
(128, 'Research and Development'),
(NULL, 'Human Resources');
INTO 可以不用。
INSERT INTO department
SELECT ...
可以从其它的数据表里取得信息,存到 department 这个数据表。
INSERT INTO department
SET name = 'Asset Management';
这会输入一个列的信息,只提供 name 的列。其他沒有信息的列会是 NULL。
其它查询子句:
LOW PRIORITY 或 DELAYED 会等其他用戶读取完资料后再输入资料。
LOW PRIORITY 会阻止要输入资料的用户,所以在跑完查询后需要等待一段时间。
DELAYED 不会阻止用户,但是输入资料要等沒人使用数据表后才会完成。
例:INSERT DELAYED INTO ...
IGNORE 会忽略输入跟列的 PRIMARY KEY 或 UNIQUE 值的冲突所产生的错误信息。
DEFAULT 会用预设值建立列。
例:INSERT INTO department VALUES(DEFAULT)
ON DUPLICATE KEY UPDATE 会解决跟 PRIMARY KEY 或 UNIQUE 的冲突。
例:
INSERT INTO warning (employeeID)
VALUES(6651)
ON DUPLICATE KEY UPDATE count = count+1;

使用 REPLACE
使用方法跟 INSERT 相同。
REPLACE 可以解决有冲突的输入。如果有冲突列会被更新。

使用 DELETE
用來刪除列。
例:DELETE FROM department;
会刪除 department 里面所有的列。
如果要选择哪个列,用 WHERE。
例:DELETE FROM department WHERE name='Asset Management';
如果有开启 --safe-updates 或 --i-am-a-dummy 选项可以避免一次刪除全部的列。
所以必須选择要刪除的列。
完整格式:
程序码:
DELETE [LOW_PRIORITY] [QUICK] FROM table_name
[WHERE where_definition]
[ORDER BY ...]
[LIMIT rows]
or
DELETE [LOW_PRIORITY] [QUICK] table_name[.*] [, table_name[.*] ...]
FROM table-references
[WHERE where_definition]

or
DELETE [LOW_PRIORITY] [QUICK]
FROM table_name[.*] [, table_name[.*] ...]
USING table-references
[WHERE where_definition]
后两个格式可以用来刪除其他数据表里的列。
例:
程序码:
DELETE employee, employeeSkills
FROM employee, employeeSkills, department
WHERE employee.employeeID = employeeSkills.employeeID
AND employee.departmentID = department.departmentID
AND department.name='Finance';
上面的会删除全部的有在 Finance department 里面工作的 employees,然后刪除他们的 employeeSkills。
FROM 里面的列不会被删除,他们只是用来搜寻。只有在 employee 和 employeeSkills 里面的列会被刪除。
AND 是包含的条件。employee.employeeID 表示 employee 数据表里的 employeeID 列。
第三个格式跟第二个差不多,但是刪除 FROM 里面的数据表,用 USING 来表示被搜寻的数据表。
例:
程序码:
DELETE FROM employee, employeeSkills
USING employee, employeeSkills, department
WHERE employee.employeeID = employeeSkills.employeeID
AND employee.departmentID = department.departmentID
AND department.name='Finance';
跟上面一样,不同的表示方法。
额外的查询子句:
LOW_PRIORITY 跟 INSERT 里的意思相同。
QUICK 可用来加快 DELETE 的速度。
ORDER BY 是用來刪除列的順序。
LIMIT 可用来限制被刪除的列数量。

使用 TRUNCATE
可用来刪除全部的列。
TRUNCATE TABLE employee;
速度比 DELETE 还快。

使用 UPDATE
可以用來更新列。
程序码:
UPDATE employee
SET job='DBA'
WHERE employeeID='6651';
完整格式:
程序码:
UDPATE [LOW_PRIORITY] [IGNORE] table_name
SET col_name1=expr1 [, col_name2=expr2 ...]
[WHERE where_definition]
[ORDER BY ...]
[LIMIT rows]
or
UPDATE [LOW_PRIORITY] [IGNORE] table_name [, table_name ...]
SET col_name=expr1 [, col_name2=expr2 ...]
[WHERE where_definition]
WHERE 可以用来选择要更新哪个列。
第二个格可以用来更新多个数据表。
LOW_PRIORITY 和 IGNORE 跟在 INSERT 里的相同,ORDER BY 和 LIMIT 跟在 DELETE 的相同。

用 LOAD DATA INFILE 上传文本信息文件内容
可以让你用文件来输入信息到一个数据表。
文本信息文件范例:
程序码:
42Finance
128Research and Development
NULLHuman Resources
NULLMarketing
载入文本信息文件内容:
程序参:
LOAD DATA LOCAL INFILE 'department_infile.txt'
INTO TABLE department;
LOAD DATA INFILE 需要 FILE 的权限。
完整格式:
程序码:
LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'fileName.txt'
[REPLACE | IGNORE]
INTO TABLE table_name
[FIELDS
[TERMINATED BY '\t']
[[OPTIONALLY] ENCLOSED BY '']
[ESCAPED BY '\\']
]
[LINES TERMINATED BY '\n']
[IGNORE number LINES]
[(col_name, ...)]
额外的查询子句:
LOW_PRIORITY 跟 INSERT 里的类似,会等用户读取完数据表后在继续。
CONCURRENT 允许其他用户读数据表里的资料。
LOCAL 表示文本信息文件在用户的电脑里,如果不用 MySQL 会在主机内读取文本文件内容。
REPLACE 会覆蓋旧的列,IGNORE 会留旧的列,如果有冲突。
FIELDS 和 LINES 可以用来规定数据表的格式,预设的格式是
每行一个列,列信息用 tabs 来分开,要或不要用单引号,和用 \来來跳脱字元。
IGNORE number LINES 会会忽略文件内行数,number 表示行数。
最后一个子句可以用来设定只输入信息到某些列。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics