【翻译】MySQL-Tutorial ( 3 )

来源:互联网 发布:inode for mac 10.11 编辑:程序博客网 时间:2024/06/05 16:52

学好MySQL要有好的教程,这里翻译了几篇官方的MySQL教程(MySQL-Tutorial)和大家分享下。
MySQL Tutorial.pdf–链接里有这几篇Tutorial的英文原版pdf,可供英文较好的朋友们学习。

MYSQL初学者实例

1.总结MySQL命令全部语法

如果希望了解更详细语法,请查阅MySQL手册 http://dev.mysql.com/doc/refman/5.5/en/sql-syntax.html

– 数据库级语法
DROP DATABASE databaseName – 删除数据库 (无法挽回!)
DROP DATABASE IF EXISTS databaseName – 删除数据库,如果存在的话
CREATE DATABASE databaseName – 创建新数据库
CREATE DATABASE IF NOT EXISTS databaseName – 当不存在时创建新数据库
SHOW DATABASES – 显示服务器中所有的数据库
USE databaseName – 将数据库设置为默认的(当前的)
SELECT DATABASE() – 显示默认数据库
SHOW CREATE DATABASE databaseName – 显示创建数据库的语法

– 表级语法
DROP TABLE [IF EXISTS] tableName, …
CREATE TABLE [IF NOT EXISTS] tableName (
columnName columnType columnAttribute, …
PRIMARY KEY(columnName),
FOREIGN KEY (columnNmae) REFERENCES tableName (columnNmae) )
SHOW TABLES – 显示默认数据库中所有的表
DESCRIBE|DESC tableName – 描述这张表的所有属性
ALTER TABLE tableName … – 修改一张表的属性
ALTER TABLE tableName ADD columnDefinition
ALTER TABLE tableName DROP columnName
ALTER TABLE tableName ADD FOREIGN KEY (columnNmae) REFERENCES tableName (columnNmae)
ALTER TABLE tableName DROP FOREIGN KEY constraintName
SHOW CREATE TABLE tableName – 显示创建表的语法

– 行级语法
INSERT INTO tableName
VALUES (column1Value, column2Value,…) – 插入一条数据
INSERT INTO tableName
VALUES (column1Value, column2Value,…), … – 连续插入多行数据
INSERT INTO tableName (column1Name, …, columnNName)
VALUES (column1Value, …, columnNValue) – 按照特定的属性插入一条数据
DELETE FROM tableName WHERE criteria
UPDATE tableName SET columnName = expr, … WHERE criteria
SELECT * | column1Name AS alias1, …, columnNName AS aliasN
    FROM tableName
    WHERE criteria
    GROUP BY columnName
    ORDER BY columnName ASC|DESC, …
    HAVING groupConstraints
    LIMIT count | offset count

– 其他
SHOW WARNINGS; – 显示前一语句的警告
[译者补充] SHOW VERSION(); –显示当前版本情况

2. 一个初学者的例子(但并不简单)

MySQL数据库服务器包含许多数据库。每个数据库由一个或多个表组成。表由列(字段)和行(记录)组成。
SQL关键字和命令不区分大小写。为了清晰起见,它们用大写字母显示。在某些系统中,名称或标识符(数据库名称、表名、列名等)是区分大小写的。因此,我们最好为标识符区分大小写。
SHOW DATABASE这句命令可以列出服务器中所有数据库。
mysql、information_ schema和performance_schema是MySQL内置的系统数据库。让我们从一个简单的例子开始——产品销售数据库。产品销售数据库通常由许多表格组成,例如,产品,客户,供应商,订单,付款,员工等等。让我们给我们的数据库起名为:“Southwind”(灵感来自微软的Northwind交易员示例数据库)。我们将从第一个表:“产品”开始设计,产品这张表具有如下的行和列属性:

2.1 创建和删除数据库

mysql> CREATE DATABASE southwind;
Query OK, 1 row affected (0.03 sec)

mysql> DROP DATABASE southwind;
Query OK, 0 rows affected (0.11 sec)

mysql> CREATE DATABASE IF NOT EXISTS southwind;
Query OK, 1 row affected (0.01 sec)

mysql> DROP DATABASE IF EXISTS southwind;
Query OK, 0 rows affected (0.00 sec)

:使用SQL删除数据库的命令务必谨慎,因为删除数据库是不可恢复的。没有撤销!!!
显示创建数据库语法
创建数据库的命令使用一些默认值。你可以发布一个”显示创建数据库的语句”来显示完整的命令和检查这些默认值。我们使用\G(而不是“;”)显示结果。(可以试比较“;”和“G“的输出不同之处)

mysql> CREATE DATABASE IF NOT EXISTS southwind;
mysql> SHOW CREATE DATABASE southwind \G
*************************** 1. row ***************************
Database: southwind
Create Database: CREATE DATABASE `southwind` /*!40100 DEFAULT CHARACTER SET latin1 */

反引号的标识符(`name`)
不带引号的名称或标识符(如数据库名、表名和字段名)不能包含空格和特殊字符,或MySQL中存在的关键词(如ORDER和DESC等)。您可以包括空白和特殊字符或使用MySQL关键字作为标识符,但要用一对反引号将其括起来。
注释和版本信息
MySQL多行注释 : /* */;行尾注释在行末一个空格之后使用:–(两个短减号)或#。上面的/ *!40100 ……* /被称为注释版本,它的含义是:只能运行版本号4.01.00或以上的服务器中。如果你想检查你的MySQL服务器的版本,可以使用查询语法”SHOW VERSION()”。

2.2 设置默认数据库

“USE databaseName”可以设置一个特定的数据库作为默认(当前)数据库。当使用默认数据库的表时,你可以直接引用表名。但当你要使用默认数据库之外的表时,需要使用完全限定databasename.tablename来引用表。
显示当前的默认数据库,可以使用指令“SELECT DATABASE()”。

2.3 创建和删除一张表

你可以使用”CREATE TABLE tableName”和”DROP TABLE tableName”来创建表和删除表。您也可以使用条件”IF EXISTS”和”IF NOT EXISTS”进行一些判断。若要创建表,需要通过提供列的名称、类型和属性来定义其所有列。
让我们在数据库southwind中创建一个表”products”。
– 如果存在名为southwind的数据库,则将其删除
– 小心删除(删除)操作是不可逆的,不能恢复!
mysql> DROP DATABASE IF EXISTS southwind;
Query OK, 1 rows affected (0.31 sec)

– 创建数据库 “southwind”
mysql> CREATE DATABASE southwind;
Query OK, 1 row affected (0.01 sec)

– 显示所有的数据库
– 确认“南风”数据库已创建
mysql> SHOW DATABASES;
– 将southwind数据库设置为默认数据库,以便于直接引用方便
mysql> USE southwind;
Database changed

– 显示默认数据库
mysql> SELECT DATABASE();
– 显示当前数据库中所有的表
– “southwind” 中没有任何表.
mysql> SHOW TABLES;
Empty set (0.00 sec)

– 创建products表。输入下面的列定义
mysql> CREATE TABLE IF NOT EXISTS products (
    productCode CHAR(3) NOT NULL DEFAULT ”,
    name VARCHAR(30) NOT NULL DEFAULT ”,
    quantity INT UNSIGNED NOT NULL DEFAULT 0,
    price DECIMAL(7,2) NOT NULL DEFAULT 99999.99,
    PRIMARY KEY (productID)
);
Query OK, 0 rows affected (0.08 sec)
– 显示所有的表以证明products表被创建
mysql> SHOW TABLES;
– 显示products表中的属性
mysql> DESCRIBE products;
– 显示MySQL使用的完整创建表语句来创建此表
mysql> SHOW CREATE TABLE products \G
*************************** 1. row ***************************
Table: products
Create Table: CREATE TABLE `products` ( `productID` int(10) unsigned NOT NULL AUTO_INCREMENT,
`productCode` char(3) NOT NULL DEFAULT ”,
`name` varchar(30) NOT NULL DEFAULT ”,
`quantity` int(10) unsigned NOT NULL DEFAULT ‘0’,
`price` decimal(7,2) NOT NULL DEFAULT ‘99999.99’,
PRIMARY KEY (`productID`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1

解释
我们定义了5个表中的列产品:productID,productCode,name, quantity和price。他们的类型是:
1. productID是int unsigned即为非负整数。
2. productCode是char(3)即一个固定长度的字母数字字符串的3个字符。
3. name是varchar(30)-可变长度可达30个字符的字符串。
4. quantity也是int无符号非负整数。
5. price是小数(10,2)一个2位小数的十进制数。

我们使用ProductCode固定长度的字符串,我们假定ProductCode正好包含3个字符。另一方面,我们name使用的变长字符串,其长度变化varchar比char更有效。
DECIMAL是精确的(用固定小数点表示为整数)。另一方面,float和double是不精确的和近似。DECIMAL是一种强烈推荐的做法。
属性“NOT NULL”指定列不能包含空值。NULL是一个特殊的值,表示“没有值”,“未知值”或“遗漏值”。在本例中,这些列应有适当的值,我们还设置列的默认值。如果记录创建期间没有指定值,则列将执行默认值。
我们设置列ProductID作为所谓的主键。主键列的值必须是唯一的。每个表都应包含主键。这确保了每一行可以区别于其他行。你可以指定一列或一组列(如FirstName和LastName)作为主键。在主键列上自动生成索引,以便快速搜索。主键也可作为其他表的引用。我们设置列ProductID为auto_increment。默认启动值为1。当你在AUTO_INCREMENT标注的属性上插入一个null(推荐)(或0,或一个缺失值)时,最大值加1,列将被插入。你还可以插入一个有效值的auto_increment值,从而避开自动增量。

2.4 插入

让我们在我们的products表中插入一些行。我们组的第一个记录为1001,并插入一个空记录的其余部分使用auto_increment。注意字符串必须用一对单引号(或双引号)括起来。
– 插入一行数据包含所有列的属性
mysql> INSERT INTO products VALUES (1001, ‘PEN’, ‘Pen Red’, 5000, 1.23);
Query OK, 1 row affected (0.04 sec)
– 一次性插入多条数据
– 在auto_increment修饰的属性处填入null,让其自动增加
mysql> INSERT INTO products VALUES
(NULL, ‘PEN’, ‘Pen Blue’, 8000, 1.25),
(NULL, ‘PEN’, ‘Pen Black’, 2000, 1.25);
Query OK, 2 rows affected (0.03 sec)
Records: 2 Duplicates: 0 Warnings: 0

– 在表后写出插入的部分属性
– 在auto_increment修饰的属性处填入null,让其自动增加
mysql> INSERT INTO products (productCode, name, quantity, price) VALUES
(‘PEC’, ‘Pencil 2B’, 10000, 0.48),
(‘PEC’, ‘Pencil 2H’, 8000, 0.49);
Query OK, 2 row affected (0.03 sec)

– 没有填写的属性会被赋予默认值
mysql> INSERT INTO products (productCode, name) VALUES
(‘PEC’, ‘Pencil HB’);
Query OK, 1 row affected (0.04 sec)

– 第二列的属性被定义为非空,下面的语句会报错
mysql> INSERT INTO products values
(NULL, NULL, NULL, NULL, NULL);
ERROR 1048 (23000): Column ‘productCode’ cannot be null

– 查询所有的行
mysql> SELECT * FROM products;
6 rows in set (0.02 sec)

– 删除最后一行
mysql> DELETE FROM products WHERE productID = 1006;