MySQL 练习手稿
MySQL 介绍
MySQL AB是由MySQL创始人和主要开发人创办的公司。MySQL AB最初是由David Axmark、Allan Larsson和Michael“Monty ”Widenius在瑞典创办的。
公司名中的“AB”是瑞典语“aktiebolag ”或“股份公司”的首字母缩写。可将其翻译为“MySQL有限公司”。事实上,MySQL有限公司和MySQLGmbH均是MySQL AB子公司的名称。它们分别位于美国和德国。
MySQL是最流行的开放源码SQL数据库管理系统,它是由MySQL AB公司开发、发布并支持的。MySQL AB是由多名MySQL开发人创办的一家商业公司。它是一家第二代开放源码公司,结合了开放源码价值取向、方法和成功的商业模型。
MySQL的主要特性
1、使用C和C++编写
2、能够工作在众多不同的平台上
3、使用GNU Automake、Autoconf和Libtool进行移植
4、提供了用于C、C++、Eiffel、Java、Perl、PHP、Python、Ruby和Tcl的API
5、提供了事务性和非事务性存储引擎
创建并使用数据库
知道怎样输入命令,便可以访问数据库了。
1、创建数据库
2、创建数据库表
3、装载数据到数据库表
4、以各种方法从表中检索数据
5、使用多个表
show variables like 'character_set_client'; -- 客户端字符集
show variables like 'character_set_database'; -- 数据库字符集
show variables like 'character_set_server'; -- 服务器字符集
show variables like '%character_set_%'; -- 查看当前的状态
SET character_set_client = utf8;
SET character_set_results = utf8;
SET character_set_connection = utf8;
mysqldump -uA9d1m6i4n -pA9d1m6i4n --default-character-set=latin1 test > F:/test_table.sql
使用SHOW 语句找出服务器上当前存在什么数据库:
mysql> SHOW DATABASES ;
+-------------+
| Database |
+-------------+
| mysql |
| test |
| tmp |
+-------------+
可能你的机器上的数据库列表是不同的,但是很可能有mysql和test数据库。
mysql是必需的,因为它描述用户访问权限,test数据库经常作为用户试身手的工作区。
如果test数据库存在,尝试访问它:
mysql> USE test
注意,USE,类似QUIT,不需要一个分号。(如果你喜欢,你可以用一个分号终止这样的语句;这无碍)
你需要自己创建数据库:
mysql> CREATE DATABASE pet;
创建数据库并不表示选定并使用它,你必须明确地操作。为了使pet成为当前的数据库,使用这个命令:
mysql> USE pet
创建数据库是很容易的部分,但是在这时它是空的,正如SHOW TABLES将告诉你的:
mysql> SHOW TABLES;
较难的部分是决定你的数据库结构应该是什么:你需要什么数据库表,各数据库表中有什么样的列。
使用一个CREATE TABLE 语句指定你的数据库表的布局:
CREATE TABLE pet_table
(
name VARCHAR(20),
owner VARCHAR(20),
species VARCHAR(20),
sex CHAR(1),
birth DATE,
death DATE
);
为了验证你的表是按你期望的方式创建,使用一个DESCRIBE 语句:
mysql> DESCRIBE pet_table;
+------------+---------------+------+------+-----------+--------+
| Field | Type | Null | Key | Default | Extra |
+------------+---------------+------+------+-----------+--------+
| name | varchar(20) | YES | | NULL | |
| owner | varchar(20) | YES | | NULL | |
| species | varchar(20) | YES | | NULL | |
| sex | char(1) | YES | | NULL | |
| birth | date | YES | | NULL | |
| death | date | YES | | NULL | |
+-----------+----------------+-------+------+----------+--------+
你可以随时使用DESCRIBE,例如,如果你忘记表中的列的名称或类型时。
如果想要一次增加一个新记录,可以使用INSERT 语句。
mysql> INSERT INTO pet_table VALUES ('Puffball','Harold ','cat','f','1993-02-04',NULL);
注意,这里字符串和日期值均为引号扩起来的字符串。另外,可以直接用INSERT语句插入NULL代表不存在的值。
SELECT 语句用来从数据表中检索信息。语句的一般格式是:
SELECT what_to_select
FROM which_table
WHERE conditions_to_satisfy ;
what_to_select指出你想要看到的内容,可以是列的一个表,或*表示“所有的列”。which_table指出你想要从其检索数据的表。WHERE子句是可选项,如果选择该项,conditions_to_satisfy指定行必须满足的检索条件。
SELECT 最简单的形式是从一个表中检索所有记录:
mysql> SELECT * FROM pet_table;
+-----------+--------+-----------+------+----------------+------------+
| name | owner | species | sex | birth | death |
+-----------+--------+-----------+------+----------------+------------+
| Puffball | Harold | cat | f | 1993-02-04 | NULL |
+-----------+--------+-----------+------+----------------+------------+
用一个UPDATE 语句修正前面新增的错误记录:
mysql> UPDATE pet_table SET death = '1998-10-24' WHERE name = ' Puffball';
再检索一下刚才修正的记录:
mysql> SELECT * FROM pet_table;
+-----------+----------+----------+------+--------------------+-------------- -+
| name | owner | species | sex | birth | death |
+-----------+----------+----------+------+--------------------+----------------+
| Puffball | Harold | cat | f | 1993-02-04 | 1998-10-24 |
+-----------+----------+----------+------+--------------------+--------------- +
你可以在任何列上指定条件,不只仅仅是name。
例如,如果你想要知道哪个动物在1998以后出生的,测试birth列:
mysql> SELECT * FROM pet_table WHERE birth > '1998-1-1';
+----------+----------+----------+------+----------------+--------+
| name | owner | species | sex | birth | death |
+----------+----------+----------+-------+----------------+-------+
| Chirpy | Gwen | bird | f | 1998-09-11 | NULL |
| Puffball | Diane | hamster | f | 1999-03-30 | NULL |
+----------+----------+-----------+------+----------------+-------+
也可以组合条件,例如,找出雌性的狗:
mysql> SELECT * FROM pet_table WHERE species = 'dog' AND sex = 'f';
+--------+----------+----------+------+----------------+---------+
| name | owner | species | sex | birth | death |
+--------+----------+----------+------+----------------+---------+
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
+---------+---------+----------+------+----------------+---------+
上面的查询使用AND 逻辑操作符,也有一个OR 操作符:
mysql> SELECT * FROM pet_table WHERE species = 'snake' OR species = 'bird';
+-----------+---------+-----------+-------+----------------+--------+
| name | owner | species | sex | birth | death |
+-----------+---------+-----------+-------+----------------+--------+
| Chirpy | Gwen | bird | f | 1998-09-11 | NULL |
| Whistler | Gwen | bird | NULL | 1997-12-09 | NULL |
| Slim | Benny | snake | m | 1996-04-29 | NULL |
+-----------+---------+-----------+-------+----------------+--------+
AND 和OR 可以混用,但AND 比OR 具有更高的优先级 。
如果你使用两个操作符,使用圆括号指明如何对条件进行分组是一个好主意:
mysql> SELECT * FROM pet_table WHERE (species = 'cat' AND sex = 'm')
-> OR (species = 'dog' AND sex = 'f');
+------------+---------+----------+-------+----------------+---------+
| name | owner | species | sex | birth | death |
+------------+---------+----------+-------+----------------+---------+
| Chirpy | Gwen | bird | f | 1998-09-11 | NULL |
| Whistler | Gwen | bird | NULL | 1997-12-09 | NULL |
| Slim | Benny | snake | m | 1996-04-29 | NULL |
+------------+--------+-----------+-------+----------------+---------+
可以使用一个WHERE 子句结合行选择与列选择。
例如,要想查询狗和猫的出生日期,使用这个查询:
mysql> SELECT name, species, birth FROM pet_table
-> WHERE species = 'dog' OR species = 'cat';
+----------+----------+---------------+
| name | species | birth |
+----------+----------+---------------+
| Fluffy | cat | 1993-02-04 |
| Claws | cat | 1994-03-17 |
| Buffy | dog | 1989-05-13 |
| Fang | dog | 1990-08-27 |
| Bowser | dog | 1989-08-31 |
+----------+----------+---------------+
你可能已经注意到前面的例子中结果行没有以特定的顺序显示。
然而,当行按某种方式排序时,检查查询输出通常更容易。为了排序结果,使用ORDER BY 子句。
这里是动物生日,按日期排序:
mysql> SELECT name, birth FROM pet_table ORDER BY birth;
+-----------+----------------+
| name | birth |
+-----------+----------------+
| Buffy | 1989-05-13 |
| Slim | 1996-04-29 |
| Whistler | 1997-12-09 |
| Chirpy | 1998-09-11 |
| Puffball | 1999-03-30 |
+-----------+----------------+
在字符类型列上,与所有其他比较操作类似,分类功能正常情况下是以区分大小写的方式执行的。
这意味着,对于等同但大小写不同的列,并未定义其顺序。
对于某一列,可以使用BINARY 强制执行区分大小写的分类功能,如:ORDER BY BINARY col_name.
默认排序是升序,最小的值在第一。要想以降序排序,在你正在排序的列名上增加DESC (降序 )关键字:
mysql> SELECT name, birth FROM pet_table ORDER BY birth DESC;
+------------+-----------------+
| name | birth |
+------------+-----------------+
| Puffball | 1999-03-30 |
| Chirpy | 1998-09-11 |
| Whistler | 1997-12-09 |
| Slim | 1996-04-29 |
| Claws | 1994-03-17 |
| Fluffy | 1993-02-04 |
| Fang | 1990-08-27 |
| Bowser | 1989-08-31 |
| Buffy | 1989-05-13 |
+------------+-----------------+
可以对多个列进行排序,并且可以按不同的方向对不同的列进行排序。
例如,按升序对动物的种类进行排序,然后按降序根据生日对各动物种类进行排序(最年轻的动物在最前面),使用下列查询:
mysql> SELECT name, species, birth FROM pet_table
-> ORDER BY species, birth DESC ;
+-----------+------------+----------------+
| name | species | birth |
+-----------+------------+----------------+
| Chirpy | bird | 1998-09-11 |
| Whistler | bird | 1997-12-09 |
| Claws | cat | 1994-03-17 |
| Fluffy | cat | 1993-02-04 |
| Fang | dog | 1990-08-27 |
| Bowser | dog | 1989-08-31 |
| Buffy | dog | 1989-05-13 |
| Puffball | hamster | 1999-03-30 |
| Slim | snake | 1996-04-29 |
+-----------+------------+---------------+
注意DESC关键字仅适用于在它前面的列名(birth);不影响species列的排序顺序。
MySQL 提供了几个函数,可以用来计算日期,例如,计算年龄或提取日期部分。
要想确定每个宠物有多大,可以计算当前日期的年和出生日期之间的差。
如果当前日期的日历年比出生日期早,则减去一年。以下查询显示了每个宠物的出生日期、当前日期和年龄数值的年数字。
mysql> SELECT name, birth, CURDATE (),
-> (YEAR (CURDATE())-YEAR (birth))
-> - (RIGHT (CURDATE(),5)<RIGHT (birth,5))
-> AS age
-> FROM pet_table;
+-----------+----------------+---------------+------+
| name | birth | CURDATE() | age |
+-----------+----------------+---------------+------+
| Fluffy | 1993-02-04 | 2003-08-19 | 10 |
| Claws | 1994-03-17 | 2003-08-19 | 9 |
| Buffy | 1989-05-13 | 2003-08-19 | 14 |
| Fang | 1990-08-27 | 2003-08-19 | 12 |
| Bowser | 1989-08-31 | 2003-08-19 | 13 |
| Chirpy | 1998-09-11 | 2003-08-19 | 4 |
| Whistler | 1997-12-09 | 2003-08-19 | 5 |
| Slim | 1996-04-29 | 2003-08-19 | 7 |
| Puffball | 1999-03-30 | 2003-08-19 | 4 |
+-----------+----------------+----------------+------+
此处,YEAR()提取日期的年部分,RIGHT()提取日期的MM-DD (日历年)部分的最右面5个字符。
比较MM-DD值的表达式部分的值一般为1或0,如果CURDATE()的年比birth的年早,则年份应减去1。
整个表达式有些难懂,使用alias (age)来使输出的列标记更有意义。
尽管查询可行,如果以某个顺序排列行,则能更容易地浏览结果。
添加ORDER BY name子句按照名字对输出进行排序则能够实现。
mysql> SELECT name, birth, CURDATE (),
-> (YEAR (CURDATE())-YEAR (birth))
-> - (RIGHT (CURDATE(),5)<RIGHT (birth,5))
-> AS age
-> FROM pet_table ORDER BY name;
+-----------+----------------+---------------+-------+
| name | birth | CURDATE() | age |
+-----------+----------------+----------------+------+
| Bowser | 1989-08-31 | 2003-08-19 | 13 |
| Buffy | 1989-05-13 | 2003-08-19 | 14 |
| Chirpy | 1998-09-11 | 2003-08-19 | 4 |
| Claws | 1994-03-17 | 2003-08-19 | 9 |
| Fang | 1990-08-27 | 2003-08-19 | 12 |
| Fluffy | 1993-02-04 | 2003-08-19 | 10 |
| Puffball | 1999-03-30 | 2003-08-19 | 4 |
| Slim | 1996-04-29 | 2003-08-19 | 7 |
| Whistler | 1997-12-09 | 2003-08-19 | 5 |
+-----------+----------------+---------------+-------+