表中的数据库对象包括列、索引、触发器。在创建表时,必须指定列的名字和数据类型。
表的操作包括创建表、查看表、删除表、修改表。
本文所用的例子和语法均参考《SQL基础教程》第2版。
1 命名规则
在数据库名称、表名、列名的命名中,只可以出现1.半角英文字母 2.半角数字 3.下划线,且名称必须以半角英文字母开头。
在同一个数据库中,不能出现相同的表,在同一个表中,列名也不可相同。
2 表的创建
在创建表之前,首先要建立一个数据库,在这里,我们首先先建立一个名为shop的数据库,创建方法如下(没有区分大小写):
mysql> create database shop;
接着,我们就可以创建表了,通常,创建表的create table语句如下:
create table <表名>
(<列名1> <数据类型> <该列所需约束>,
<列名2> <数据类型> <该列所需约束>,
<列名3> <数据类型> <该列所需约束>,
<列名4> <数据类型> <该列所需约束>,
…
<该表的约束1>,<该表的约束2>,……);
需要注意的是,数据类型是创建表时必须要指定的,约束有无都可以,约束也可以在定义列的时候设置,也可以在语句的末尾进行设置,但是 NOT NULL 约束只能以列为单位进行设置。
接下来,我们创建一个名为Product的表。
mysql> create table Product
-> (product_id char(4) not null,
-> product_name varchar(100) not null,
-> product_type varchar(32) not null,
-> sale_price integer ,
-> purchase_price integer ,
-> regist_date date ,
-> primary key (product_id));
Query OK, 0 rows affected (0.22 sec)
primary key (product_id)是用来给product_id设置主键约束的,即如果把 product_id列指定为主键,就可以通过该列取出特定的数据商品了。但若在product_id中输入了重复数据,就无法取出唯一的特定数据了。
3 表的删除和更新
表的删除
删除的表是无法恢复的,由于后续还要用到Product表,故这里只将语句写出 。
drop table <表名>;
表定义的更新
创建了表之后,如果发现少了列数,可以用alter table语句进行列的添加和删除。其中,添加的语句为:
alter table <表名> add column <列的定义>;
我们向Product表中添加product_name_pinyin列,该列可以存储100位的可变长字符串。
mysql> alter table Product add column product_name_pinyin varchar(100);
删除列的语句为:
alter tabble <表名> drop column <列名>;
接下来,我们删除刚刚添加的列。
mysql> alter table Product drop column product_name_pinyin;
需要注意的是,alter table 语句和drop table语句一样,执行之后都无法恢复。
向Product表中插入数据
mysql> start transaction;
mysql> insert into Product values('0001','T恤衫','衣服',1000,500,'2009-09-20'),
-> ('0002','打孔器','办公用品',500,320,'2009-09-11'),
-> ('0003','运动T恤','衣服',4000,2800,null),
-> ('0004','菜刀','厨房用具',3000,2800,'2009-09-20'),
-> ('0005','高压锅','厨房用具',6800,5000,'2009-01-15'),
-> ('0006','叉子','厨房用具',500,null,'2009-09-20'),
-> ('0007','擦菜板','厨房用具',880,790,'2008-04-28'),
-> ('0008','圆珠笔','办公用品',100,null,'2009-11-11');
Query OK, 7 rows affected (0.00 sec)
Records: 7 Duplicates: 0 Warnings: 0
mysql> commit;
Query OK, 0 rows affected (0.02 sec)
开头的 start transaction语句是开始插入行的指令语句,结尾的commit语句是确定插入行的指令语句。
若想要查看表中的全部数据,则可用
mysql> select * from Product;
结果为
+------------+--------------+--------------+------------+----------------+-------------+
| product_id | product_name | product_type | sale_price | purchase_price | regist_date |
+------------+--------------+--------------+------------+----------------+-------------+
| 0001 | T恤衫 | 衣服 | 1000 | 500 | 2009-09-20 |
| 0002 | 打孔器 | 办公用品 | 500 | 320 | 2009-09-11 |
| 0003 | 运动T恤 | 衣服 | 4000 | 2800 | NULL |
| 0004 | 菜刀 | 厨房用具 | 3000 | 2800 | 2009-09-20 |
| 0005 | 高压锅 | 厨房用具 | 6800 | 5000 | 2009-01-15 |
| 0006 | 叉子 | 厨房用具 | 500 | NULL | 2009-09-20 |
| 0007 | 擦菜板 | 厨房用具 | 880 | 790 | 2008-04-28 |
| 0008 | 圆珠笔 | 办公用品 | 100 | NULL | 2009-11-11 |
+------------+--------------+--------------+------------+----------------+-------------+
表名的修改
在MySQL中,表明的修改的语句为:
rename table <变更前的名称> to <变更后的名称>;
mysql> rename table Product to produc;
Query OK, 0 rows affected (0.11 sec)
4 select语句基础
列的查询
基本的select语句如下:
select <列名>,……
from <表名>;
接下来,我们尝试从Product表中查询product_id、product_name、purchase_price三列。
mysql> select product_id,product_name,purchase_price from Product;
+------------+--------------+----------------+
| product_id | product_name | purchase_price |
+------------+--------------+----------------+
| 0001 | T恤衫 | 500 |
| 0002 | 打孔器 | 320 |
| 0003 | 运动T恤 | 2800 |
| 0004 | 菜刀 | 2800 |
| 0005 | 高压锅 | 5000 |
| 0006 | 叉子 | NULL |
| 0007 | 擦菜板 | 790 |
| 0008 | 圆珠笔 | NULL |
+------------+--------------+----------------+
8 rows in set (0.00 sec)
查询中列的顺序与select语句中的顺序是相同的。
若想要查出表中的所有列,可用*,表示全部的意思,但是若使用星号,则列的显示顺序就是表中的顺序,不能改变。
mysql> select * from product;
+------------+--------------+--------------+------------+----------------+-------------+
| product_id | product_name | product_type | sale_price | purchase_price | regist_date |
+------------+--------------+--------------+------------+----------------+-------------+
| 0001 | T恤衫 | 衣服 | 1000 | 500 | 2009-09-20 |
| 0002 | 打孔器 | 办公用品 | 500 | 320 | 2009-09-11 |
| 0003 | 运动T恤 | 衣服 | 4000 | 2800 | NULL |
| 0004 | 菜刀 | 厨房用具 | 3000 | 2800 | 2009-09-20 |
| 0005 | 高压锅 | 厨房用具 | 6800 | 5000 | 2009-01-15 |
| 0006 | 叉子 | 厨房用具 | 500 | NULL | 2009-09-20 |
| 0007 | 擦菜板 | 厨房用具 | 880 | 790 | 2008-04-28 |
| 0008 | 圆珠笔 | 办公用品 | 100 | NULL | 2009-11-11 |
+------------+--------------+--------------+------------+----------------+-------------+
8 rows in set (0.00 sec)
为列设别名(使用as)
mysql> select product_id as id,product_name as name,
-> purchase_price as price from Product;
+------+------------+-------+
| id | name | price |
+------+------------+-------+
| 0001 | T恤衫 | 500 |
| 0002 | 打孔器 | 320 |
| 0003 | 运动T恤 | 2800 |
| 0004 | 菜刀 | 2800 |
| 0005 | 高压锅 | 5000 |
| 0006 | 叉子 | NULL |
| 0007 | 擦菜板 | 790 |
| 0008 | 圆珠笔 | NULL |
+------+------------+-------+
8 rows in set (0.00 sec)
但是,当用 select * from product 查询全部时,列名还是原来的列名。
起别名时可是使用中文,需要用双引号括起来(不能为单引号)
mysql> select product_id as "商品编号",product_name as "商品名称",purchase_price as "进货单价" from product;
+--------------+--------------+--------------+
| 商品编号 | 商品名称 | 进货单价 |
+--------------+--------------+--------------+
| 0001 | T恤衫 | 500 |
| 0002 | 打孔器 | 320 |
| 0003 | 运动T恤 | 2800 |
| 0004 | 菜刀 | 2800 |
| 0005 | 高压锅 | 5000 |
| 0006 | 叉子 | NULL |
| 0007 | 擦菜板 | 790 |
| 0008 | 圆珠笔 | NULL |
+--------------+--------------+--------------+
常数的查询
mysql> select '商品' as string,38 as number,'2009-02-24' as date,product_id,product_name from product;
+--------+--------+------------+------------+--------------+
| string | number | date | product_id | product_name |
+--------+--------+------------+------------+--------------+
| 商品 | 38 | 2009-02-24 | 0001