写在前面:读书就要做笔记,这篇文章是读MySQL官方参考手册后做的笔记,其中加入了自己的一些总结和汇总,为了自己以后需快速复习时使用。
官方参考手册(Reference)地址:
中文:http://dev.mysql.com/doc/refman/5.1/zh/tutorial.html
英文:http://dev.mysql.com/doc/refman/5.1/en/tutorial.html
目录
MySQL官方文档第三章
1 连接和断开
1.1 连接
1.2 断开
2 命令基本原则
2.1 几条基本特征
2.2 提示符
3 创建并使用数据库
3.1 创建并选择数据库
3.2 创建表
3.3 将数据装入表中
3.4 修改(更新)数据
3.5 从表中检索数据
4 获得数据库和表的信息
5 批处理模式下
5.1 在MySQL提示符的交互式环境中
5.2 批处理模式下(即在shell命令行)
1 连接和断开
1.1 连接
1.1.1 推荐方法(不直接输入密码)
shell> mysql -h host -u user -p
Enter password: ********
说明:host为MySQL服务器主机名;user为MySQL用户账户名;
1.1.2 直接输入密码
shell> mysql -h host -u user –p****
说明:****表示账户对应的密码;
注意:“-p”后面与密码之间不能有空格。
1.1.3 如果是使用本机的MySQL数据库,因为默认是localhost,不需要”-h”参数
shell> mysql -u user -p
1.1.4 指定要使用数据库
shell> mysql -h host -u user -p 数据库名称
Enter password: ********
1.1.5 如果安装MySQL时,允许匿名登陆,可以在命令行直接用mysql登陆
shell> mysql
1.2 断开
1.2.1 在mysql>提示下输入 quit 或者 /q 退出;
1.2.2 在Windows下,可以使用exit或者control-C键;
1.2.3 在Unix下,可以使用control-D键;
2 命令基本原则
2.1 几条基本特征
举例:获得服务器的版本号和当前日期;
clip_image001[10]
2.1.1 每行首部的“mysql>”,表示它准备好接受其它命令。
2.1.2 sql语句要以分号(;)结尾。有个别例外情况,如断开数据库的quit指令。
2.1.3 可以在一行输入多行命令,以分号分割; 也可以在多行输入一条命令,这是可以使用(/c)来取消当前命令;
2.1.4 和其他数据库一样,MySQL用表格(行和列)方式显示查询输出。第一行包含列的标签,随后的行是查询结果。通常,列标签是你取自数据库表的列的名字。
2.1.5 在结果输出以后,显示返回了多少行,以及查询花了多长时间,它给你提供服务器性能的一个大致概念。注意:这里的时间不是精确时间。
2.1.6 对于关键字大小写不敏感,以下几条语句等价。
mysql> SELECT VERSION(), CURRENT_DATE;
mysql> select version(), current_date;
mysql> SeLeCt vErSiOn(), current_DATE;
但是对于标识符,如数据库名称、表名称和列名称,在Unix系统中是大小写敏感的。在Windows系统中仍然是不敏感的。
2.1.7 可以在一行上输入多条语句,只需要以一个分号间隔开各语句;
mysql> SELECT VERSION(); SELECT NOW();
2.1.8 一条命令也可以在多个行中,它收集输入行但直到看见分号才执行。这时,可以使用(/c)来取消当前命令;。例如:
mysql> SELECT
-> USER()
-> ,
-> CURRENT_DATE;
mysql> SELECT
-> USER()
-> /c
mysql>
2.2 提示符
2.2.1 mysql> 准备好接受新命令。
2.2.2 -> 等待多行命令的下一行。
2.2.3 '> 等待下一行,等待以单引号(“'”)开始的字符串的结束。
2.2.4 "> 等待下一行,等待以双引号(“"”)开始的字符串的结束。
2.2.5 `> 等待下一行,等待以反斜点(‘`’)开始的识别符的结束。
2.2.6 /*> 等待下一行,等待以/*开始的注释的结束。
用途:当输入错误后,可以根据提示符的变化来判断。
注意:但是对于后四种情况,在取消命令的时候,要先将引号等等待符号结束以后才可以输入(/c)取消命令。例如:
mysql> SELECT * FROM my_table WHERE name = 'Smith AND age < 30;
'> '/c
mysql>
这里如果直接输入(/c),会被认为是引号字符串的一部分,不会跳出。通过输入观察提示符可以看出现在是需要单引号('),必须要先结束引号。
3 创建并使用数据库
3.1 创建并选择数据库
3.1.1 显示存在的数据库:show databases;
3.1.2 选择一个存在的数据库:use ****; 这里“****”代表数据库名称。
说明:①可以使用分号结束,也可以不适用;②必须在一行内,即use和数据库名称必须在一行内。
3.1.3 创建数据库:CREATE DATABASE 数据库名称;
注意:create database 是大小写不敏感的。如果在Windows系统中,数据库名称也是大小写不敏感的,但是在Unix系统中,数据库名称是大小写敏感的。
3.1.4 判断当前使用的数据库:select database();
3.2 创建表
3.2.1 显示已选择的数据库中的表:SHOW TABLES; 必须先选择(use)数据库,然后才能正确使用此命令。
3.2.2 创建表:使用CREATE TABLE 表名(列名 类型,限制等)。例如:
mysql> create table pet(
-> name varchar(20),
-> owner varchar(20),
-> species varchar(20),
-> sex char(1),
-> birth DATE,
-> death DATE);
3.2.3 显示表的详细信息: DESCRIBE 表名;
3.3 将数据装入表中:
有两种方式,使用load data 和使用insert语句。
3.3.1 使用load data方式:
①每行包含一个记录,②用定位符(tab)把值分开,并且以CREATE TABLE语句中列出的列次序给出。③在文本文件中使用/N(反斜线,字母N),表示NULL。
例如:
LOAD DATA LOCAL INFILE '/path/pet.txt' INTO TABLE pet;
说明:默认行结束标记是定位符和换行符。也可以自行指定在LOAD DATA语句中指出列值的分隔符和行尾标记。
注意:如果是使用的Windows系统中的编辑器创建的文本(windows编辑器使用/r/n作为行结束符),需要在命令中指定行结束符,即指定为”/r/n”。同理,在运行OS X的Apple机上,应使用行结束符‘/r’。例如:
mysql> LOAD DATA LOCAL INFILE '/path/pet.txt' INTO TABLE pet
-> LINES TERMINATED BY '/r/n';
3.3.2 使用insert语句:
该方法最简单的形式是:提供每一列的值,其顺序与CREATE TABLE语句中列的顺序相同。
mysql> INSERT INTO pet
-> VALUES ('Puffball','Diane','hamster','f','1999-03-30',NULL);
注意:这里和load data方式不同的是:不再使用(/N),而是使用NULL。
3.4 修改(更新)数据
使用UPDATE语句。
mysql> UPDATE pet SET birth = '1989-08-31' WHERE name = 'Bowser';
说明:如果是通过load data导入的数据,在导入后没有其他数据变化,可以通过先删除表,然后在导入的文本中修改,最后再重新导入的方法。
mysql> DELETE FROM pet;
mysql> LOAD DATA LOCAL INFILE 'pet.txt' INTO TABLE pet;
注意:这里“delete from 表名称”是清空表中的数据;删除一个表的语句是 drop table 表名称。
3.5 从表中检索数据
3.5.1 从表中检索信息,使用select语句,一般格式为:
SELECT what_to_select
FROM which_table
WHERE conditions_to_satisfy;
3.5.2 选择所有数据:SELECT * FROM pet;
3.5.3 查找特定的行:在where语句中添加限制条件。
注意:可以同时使用and和or等逻辑操作符,但是and的优先级要高。
3.5.4 查找特定的列:在select后面跟上列名,多个列名时用逗号分隔;
注意:使用distinct关键字来检索每个唯一的输出记录。
3.5.5 排序查询结果:使用order by子句。
mysql> SELECT name, birth FROM pet ORDER BY birth;
说明:①默认是升序的。若需要降序排序,在列名后加desc,且desc仅仅影响紧跟的那一列。
下面的查询表示:按升序对动物的种类进行排序,然后按降序根据生日对各个动物种类进行排序(最年轻的动物在最前面)。这里,DESC关键字仅适用于在它前面的列名(birth);不影响species列的排序顺序。
mysql> SELECT name, species, birth FROM pet
-> ORDER BY species, birth DESC;
②排序时默认是不区分大小写的(case-insensitive),如果希望区分大小写,使用关键字BINARY。(注意:在官方的中文文档中,翻译为“以区分大小写的方式执行”,通过查看英文文档发现,中文文档翻译错误,应该为不区分大小写)。
3.5.6 简单日期计算函数
3.5.6.1 几个日期部分的提取函数,YEAR( )、MONTH( )和DAYOFMONTH( )。参数是date或datetime类型。
3.5.6.2 已知出生日期,来计算年龄age:
SELECT name, birth, CURDATE(),
(YEAR(CURDATE())-YEAR(birth)) - (RIGHT(CURDATE(),5)<RIGHT(birth,5))
AS age
FROM pet ORDER BY age;
3.5.6.3 已知用户是否已经死亡、出生日期、死亡日期,计算已经死亡的动物的死亡年龄:
mysql> SELECT name, birth, death,
-> (YEAR(death)-YEAR(birth)) - (RIGHT(death,5)<RIGHT(birth,5))
-> AS age
-> FROM pet
-> WHERE death IS NOT NULL
-> ORDER BY age;
3.5.6.4 查询在用户中,下个月过生日的用户:
①第一种方法:使用DATE_ADD方法;
mysql> SELECT name, birth FROM pet
-> WHERE MONTH(birth) = MONTH(DATE_ADD(CURDATE(),INTERVAL 1 MONTH));
②第二种方法:使用mod函数;
mysql> SELECT name, birth FROM pet
-> WHERE MONTH(birth) = MOD(MONTH(CURDATE()), 12) + 1;
3.5.7 NULL值计算
3.5.7.1 与NULL比较时,只能使用is null和is not null操作符;不能使用=、<>、<、>、!=等符号。
3.5.7.2 在order by时,两个null值被认为是相同的。升序时null排在前面,降序时排在后面。
①为保证null一直都排在最后,使用isnull函数:
SELECT * FROM my_table ORDER BY ISNULL(field), field [ ASC | DESC ]
②保证结果集中没有空值,在where子句中添加判断:
select distinct monthname(sale_date)
from parts_acc_sales
where sale_date is not null
3.5.7.3 在not null的列内插入0或者空字符串(””),会被认为是非空。
3.5.8 模式匹配
3.5.8.1 标准的SQL模式匹配:
说明:①不区分大小写;②不能使用=或者!=,而是要使用like或者not like。
3.5.8.1.1 ‘_’ 匹配单个字符;
3.5.8.1.2 ‘%’ 匹配任意多字符,包括零个字符;
3.5.8.2 扩展正则表达式(这里主要是正则表达式的知识,下面是一些常用的简单匹配)
说明:使用regexp和not regexp操作符(或者rlike和not rlike)。
3.5.8.2.1 ‘.’ 匹配任何单个的字符;
3.5.8.2.2 ‘[...]’ 匹配在方括号内的任何一个字符。可以使用[a-z]范围匹配。
3.5.8.2.3 ‘*’ 匹配零个或多个在它前面的字符。例如:
“x*”匹配任何数量的“x”字符
“[0-9]*”匹配任何数量的数字
“.*”匹配任何数量的任何字符
3.5.8.2.4 ‘^’ 匹配开头
3.5.8.2.5 ‘$’ 匹配结尾
3.5.8.2.6 ‘{n}’ 重复n次
举例:
找出以“b”或“B”开头的名字:
mysql> SELECT * FROM pet WHERE name REGEXP '^b';
找出以小写字母“b”开头的名字:
mysql> SELECT * FROM pet WHERE name REGEXP BINARY '^b';
找出以“fy”结尾的名字:
mysql> SELECT * FROM pet WHERE name REGEXP 'fy$';
找出包含一个“w”的名字:
mysql> SELECT * FROM pet WHERE name REGEXP 'w';
找出包含正好5个字符的名字(^和$之间有5个“.”):
mysql> SELECT * FROM pet WHERE name REGEXP '^.....$';
可以使用“{n}”“重复n次”操作符重写前面的查询:
mysql> SELECT * FROM pet WHERE name REGEXP '^.{5}$';
注意:①使用regexp模式与被测试值的任何地方匹配,则模式就算匹配成功。而在标准匹配(使用like)中,整个匹配表达式全部匹配才算匹配成功。
②为了使REGEXP在比较时区分大小写,使用BINARY关键字(原理:使字符串变为二进制字符串)。
关于在MySQL中使用正则表达式的详细信息,可以查看官方文档(版本为MySQL5.1):http://dev.mysql.com/doc/refman/5.1/zh/regexp.html(中文),http://dev.mysql.com/doc/refman/5.1/en/regexp.html(英文)。
3.5.9 计算行数
使用count函数,在select子句中。有时使用group by子句来区分各个小组。
注意:如果MySQL处于“ONLY_FULL_GROUP_BY”模式下,在select列表中出现的列名必须在group by子句中出现。
(Do not permit queries for which the SELECT list refers to nonaggregated columns that are not named in the GROUP BY clause.)
mysql> SET sql_mode = 'ONLY_FULL_GROUP_BY';
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT owner, COUNT(*) FROM pet;
ERROR 1140 (42000): Mixing of GROUP columns (MIN(),MAX(),COUNT()...)
with no GROUP columns is illegal if there is no GROUP BY clause
如果不是在“ONLY_FULL_GROUP_BY”模式下,执行查询时将所有行当做是一个组,但是对于select列表中出现的列,返回结果时随机选择值。(the query is processed by treating all rows as a single group, but the value selected for each named column is indeterminate. The server is free to select the value from any row)。例如:
mysql> SET sql_mode = '';
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT owner, COUNT(*) FROM pet;
+--------+----------+
| owner | COUNT(*) |
+--------+----------+
| Harold | 8 |
+--------+----------+
1 row in set (0.00 sec)
3.5.10 使用两个或多个表
在from语句中添加多个表名,在where语句中添加判断条件(一般通过查询的表共有的列)。
注意:如果列名出现重复,那么再引用列的时候要使用“table.column”的形式,中间使用符号“.”。也可以将表自身与自身连接,这是要为表声明别名。例如:在宠物中查找能够繁殖的配偶(类别相同,且性别不同)。
mysql> SELECT p1.name, p1.sex, p2.name, p2.sex, p1.species
-> FROM pet AS p1, pet AS p2
-> WHERE p1.species = p2.species AND p1.sex = 'f' AND p2.sex = 'm';
4 获得数据库和表的信息
下面这4种方法在上面都用到过,这里总结一下。
4.1 show databases; 列出服务器管理的数据库。
4.2 select database(); 进入一个数据库以后,打出当前使用的数据库。
4.3 show tables; 列出当前数据库的所有表。
4.4 describe 表名; 列出当前表的所有信息
其他的获得数据库和表的方法
4.5 在交互式模式下,输入status或者 /s,获得MySQL的状态。
5 批处理模式下
直接运行MySQL的由两种:①在交互式命令行中运行;②在批处理模式下运行(也就是在shell命令行中)。
5.1 在MySQL提示符的交互式环境中
5.1.1 输入help获得帮助;
5.1.2 运行脚本:使用“source命令”或者“/.”来运行脚本。
例如:mysql> source filename;
mysql> /. filename
5.2 批处理模式下(即在shell命令行):
5.2.1 输入mysql –help获得帮助;
5.2.2 一般格式:shell> mysql < batch-file;
5.2.3 在Windows系统中,使用”-e”参数来处理包含特殊字符的文件。
C:/> mysql -e "source batch-file"
5.2.4 如果语句出现错误,仍想继续执行脚本,则应使用命令”-f”或者”--force”。
5.2.5 当查询结果较多,需要分屏显示时:
shell>mysql < batch-file | more
5.2.6 将结果输出到文件:
shell> mysql < batch-file > mysql.out
注意:“交互式模式”和“批处理模式”两种方式的结果显示方式不相同:在交互式模式下,显示结果为表格模式;在批处理模式下为文本模式,如果在批处理模式下显示为表格模式,使用参数’-t’或者’--table’。
--转自