[隐藏]

一、入门

连接服务器:

shell> mysql -h host -u user -p

Enter password: ********

断开服务器:

QUIT(或\q)

基本查询:

mysql> SELECT SIN(PI()/4), (4+1)*5;select NOW();

执行后结果:

+——————–+———+

| SIN(PI()/4)        | (4+1)*5 |

+——————–+———+

| 0.7071067811865475 |      25 |

+——————–+———+

1 row in set (0.00 sec)

+———————+

| NOW()               |

+———————+

| 2013-03-29 21:51:32 |

+———————+

1 row in set (0.00 sec)

mysql>

从上面可以知道:

  • 一个命令通常由SQL语句组成,随后跟着一个分号(有一些例外不需要分号,比如QUIT)
  • 当发出一个命令时,mysql将它发送给服务器并显示执行结果,然后显示另一个mysql>显示它准备好接受其它命令
  • mysql用表格(行和列)方式显示查询输出。第一行包含列的标签,随后的行是查询结果。通常,列标签是你取自数据库表的列的名字。如果你正在检索一个表达式而非表列的值,mysql用表达式本身标记列
  • mysql显示返回了多少行,以及查询花了多长时间,它给你提供服务器性能的一个大致概念。因为他们表示时钟时间(不是 CPU 或机器时间),并且因为他们受到诸如服务器负载和网络延时的影响,因此这些值是不精确的
  • 关键字不区分大小写
  • 可以在一行上输入多条语句,每条语句用分号隔开

也可以在多行中输入一个命令:

mysql> SELECT * FROM user

->WHERE username=”

“>admin”;

注意到提示符从mysql>变为->,表明mysql没见到完整的语句并且正在等待剩余的部分。

mysql中的提示符及含义如下所示:

提示符 含义
mysql> 准备好接受新命令
-> 等待多行命令的下一行
‘> 等待下一行,等待以单引号(“’”)开始的字符串的结束
“> 等待下一行,等待以双引号(“””)开始的字符串的结束
> 等待下一行,等待以反斜点(‘’)开始的识别符的结束
/*> 等待下一行,等待以/*开始的注释的结束

在MySQL中,可以写由‘’’或‘”’字符括起来的字符串 (例如,’hello’或”goodbye”),并且mysql允许输入跨越多行的字符串。

当一条语句输入错误时,可输入  \c 取消执行:

 

mysql> SELECT * FROM user  WHERE usernaem=”

“>\c

 

二、基础语句

 

查看服务器上当前存在的数据库:

SHOW DATABASES;

创建数据库:

CREATE DATABASE mytest;

删除数据库:

DROP DATABASE mytest;

选择数据库:

USE mytest

这条语句不需要分号结束,当然,加上也是可以的。

数据库只需要创建一次,但是必须在每次启动mysql会话时在使用前先选择它。也可以在启动mysql时选择它:

shell> mysql -h host -u user -p mytest

查看数据库中有哪些表:

SHOW TABLES;

创建表:

CREATE TABLE pet (name VARCHAR(20), owner VARCHAR(20),species VARCHAR(20), sex CHAR(1), birth DATE, death DATE);

这条语句创建了一个宠物表,它有名字、主人、种类、性别、出生和死亡日期这几种属性。name、owner和species的数据类型是VARCHAR,它的列值是变长的,这些列的长度不必都相同,最长为20,这个值可选1到65535的任意值。sex的长度固定为1个字符的长度。birth和death列选用DATE数据类型。

DROP TABLE pet;

重命名表名:

RENAME TABEL pet TO newpet;

查看表结构:

DESCRIBE pet;

可以从文本文件装载数据,文本的格式为每行包含一个记录,用定位符(tab)把值分开,并且以CREATE TABLE语句中列出的列次序给出。NULL使用\N(反斜线,字母N)表示:

tler    Gwen    bird    \N  1997-12-09  \N

装载命令:

LOAD DATA LOCAL INFILE ‘/path/pet.txt’ INTO TABLE pet;

由于安全问题,该命令有可能执行失败,这时可以用下面的命令启动mysql:

mysql –local-infile -uroot -pandsoon

或者在mysql的配置文件中加入:

local-infile

如果用的Windows中的编辑器(使用\r\n做为行的结束符)创建文件,应使用:

LOAD DATA LOCAL INFILE ‘/path/pet.txt’ INTO TABLE pet LINES TERMINATED BY ‘\r\n’;

在OS X的Apple机上,应使用行结束符’\r’。

如果想要一次增加一个新记录,可以使用INSERT语句。最简单的形式是,提供每一列的值,其顺序与CREATE TABLE语句中列的顺序相同:

INSERT INTO pet VALUES (‘Puffball’,’Diane’,’hamster’,’f’,’1999-03-30′,NULL);

用SELECT语句检索数据:

SELECT what_to_select FROM which_table WHERE conditions_to_satisfy;

what_to_select指出你想要得到的内容,可以是表的一个字段,或*表示“所有的列”。which_table指出你想要从哪个表中检索数据。WHERE子句是可选项,conditions_to_satisfy指定行必须满足的检索条件。例如:

SELECT * FROM pet;
SELECT * FROM pet WHERE name = ‘Bowser’;

用UPDATE语句更新数据:

UPDATE pet SET birth = ’1989-08-31′ WHERE name = ‘tler’;

字符串串比较时大小写也不敏感。

用ORDER BY子句对数据排序:

SELECT name, birth FROM pet ORDER BY birth;

对于等同但大小写不同的列,ORDER BY并未对其定义顺序。对于某一列,可以使用BINARY强制执行区分大小写的分类功能,如:ORDER BY BINARY name。

默认排序是升序,最小的值在第一。要想以降序排序,在你正在排序的列名上增加DESC(降序 ),DESC仅作用于在它前面的列名。

可以对多个列进行排序,并且可以按不同的方向对不同的列进行排序:

SELECT name, species, birth FROM pet ORDER BY species, birth DESC;

模式匹配

SQL模式匹配允许你使用“_”匹配任何单个字符,而“%”匹配任意数目字符(包括零字符)。在MySQL中,SQL的模式默认是忽略大小写的。使用SQL模式时,不能使用=或!=;而应使用LIKE或NOT LIKE比较操作符。

SELECT * FROM pet WHERE name LIKE ‘t%’;

使用扩展正则表达式时,应使用REGEXP和NOT REGEXP操作符(或RLIKE和NOT RLIKE,它们是同义词):

SELECT * FROM pet WHERE name REGEXP ‘^t’;

为了强制使REGEXP比较区分大小写,使用BINARY关键字使其中一个字符串变为二进制字符串:

SELECT * FROM pet WHERE name REGEXP BINARY ‘^t’;

计数行

SELECT COUNT(*) FROM pet;

如果你想要知道每个主人有多少宠物,你可以使用COUNT( )函数:

SELECT owner, COUNT(*) FROM pet GROUP BY owner;

注意,使用GROUP BY对每个owner的所有记录分组,没有它,将报错。

 

三、列类型

MySQL支持3种列类型:数字类型、日期和时间类型以及字符串(字符)类型。

数字类型

 

列类型 所占字节 范围
TINYINT 1 字节 有符号的范围是-128127,无符号的范围是0255
SMALLINT 2 个字节 有符号的范围是-3276832767,无符号的范围是065535
MEDIUMINT 3 个字节 有符号的范围是-83886088388607,无符号的范围是016777215
INT 4 个字节 有符号的范围是-21474836482147483647,无符号的范围是04294967295
INTEGER 4 个字节 这是INT的一个同义词
BIGINT 8 个字节 有符号的范围是-92233720368547758089223372036854775807,无符号的范围是018446744073709551615
FLOAT(X) 4 如果 X < = 24 或 8 如果 25 < = X < = 53 不能无符号。允许的值是-3.402823466E+38-1.175494351E-380 和1.175494351E-383.402823466E+38
FLOAT 4 个字节
DOUBLE 8 个字节 不能无符号。允许的值是-1.7976931348623157E+308到-2.2250738585072014E-308、 0和2.2250738585072014E-308到1.7976931348623157E+308
8 个字节 DOUBLE同义词
REAL 8 个字节 DOUBLE同义词
DECIMAL(M,D) M字节(D+2 , 如果M < D) 一个未压缩(unpack)的浮点数字。不能无符号。行为如同一个CHAR列:“未压缩”意味着数字作为一个字符串被存储,值的每一位使用一个字符。小数点,并且对于负数,

“-”符号不在M中计算。如果D是0,值将没有小数点或小数部分。DECIMAL值的最大范围与DOUBLE相同,但是对一个给定的DECIMAL列,实际的范围可以通过M和D的选择被限制。如果D被省略,它被设置为0。如果M被省掉,它被设置为10

NUMERIC(M,D) M字节(D+2 , 如果M < D) DECIMAL的同义词

 

日期和时间类型

列类型 所占字节 范围
DATE 3 个字节 日期。支持的范围是'1000-01-01''9999-12-31'。MySQL以'YYYY-MM-DD'格式来显示DATE值,但是允许你使用字符串或数字把值赋给DATE列
DATETIME 8 个字节 日期和时间组合。支持的范围是'1000-01-01 00:00:00''9999-12-31 23:59:59'。MySQL以'YYYY-MM-DD HH:MM:SS'格式来显示DATETIME值,但是允许你使用字符串或数字把值赋给DATETIME的列
TIMESTAMP[M] 4 个字节 时间戳记。范围是’1970-01-01 00:00:00′到2037年的某时。MySQL以YYYYMMDDHHMMSS、YYMMDDHHMMSS、YYYYMMDD或YYMMDD格式来显示TIMESTAMP值,取决于是否M是14(或省略)、12、8或6,但是允许你使用字符串或数字把值赋给TIMESTAMP列
TIME 3 个字节 一个时间。范围是'-838:59:59''838:59:59'。MySQL以'HH:MM:SS'格式来显示TIME值,但是允许你使用字符串或数字把值赋给TIME列
YEAR[(2|4)] 1 字节 一个2或4位数字格式的年(缺省是4位)。允许的值是1901到2155,和0000(4位年格式),如果你使用2位,1970-2069( 70-69)。MySQL以YYYY格式来显示YEAR值,但是允许你把使用字符串或数字值赋给YEAR列

 

串类型

列类型 所占字节 范围
CHAR(M) M字节 定长字符串,当存储时,总是是用空格填满右边到指定的长度。M的范围是065535个字符
VARCHAR(M) L+1 字节, 在此L <= M 变长字符串。注意:当值被存储时,尾部的空格不被删除(遵循ANSI SQL规范)。M的范围是065535个字符
TINYBLOB, TINYTEXT L+1 字节, 在此L< 2 ^ 8 最大长度为255(2^8-1)个字符
BLOB, TEXT L+2 字节, 在此L< 2 ^ 16 最大长度为65535(2^16-1)个字符
MEDIUMBLOB, MEDIUMTEXT L+3 字节, 在此L< 2 ^ 24 最大长度为16777215(2^24-1)个字符
LONGBLOB, LONGTEXT L+4 字节, 在此L< 2 ^ 32 最大长度为4294967295(2^32-1)个字符
ENUM(‘value1′,’value2′,…) 1 或 2 个字节, 取决于枚举值的数目(最大值65535) 枚举。一个仅有一个值的字符串对象,这个值式选自与值列表’value1′、’value2′, …,或NULL。一个ENUM最多能有65535不同的值
SET(‘value1′,’value2′,…) 1,2,3,4或8个字节, 取决于集合成员的数量(最多64个成员) 一个集合。能有零个或多个值的一个字符串对象,其中每一个必须从值列表’value1′, ‘value2′, …选出。一个SET最多能有64个成员