九、增、改、查数据
1. 插入记录。
(1)不推荐的做法:不指定行。
mysql> insert into customers
-> values(NULL,
-> 'Pep E.LaPew'
-> ,'100 Main Street',
-> 'Los Angeles',
-> 'CA',
-> '90046',
-> 'USA',
-> NULL,
-> NULL);
像这种插入方式,意在给每一行的所有字段都插入一个值。但是在表的结构改变的时候,这种方式就起不到效果了。所以我们最好还是指定字段名字的形式插入数据。
(2) 推荐的做法:指定行。
mysql> insert into customers(cust_name,
-> cust_address,
-> cust_city,
-> cust_state,
-> cust_zip,
-> cust_country,
-> cust_contact,
-> cust_email)
-> values('Pep E.LaPew',
-> '100 Main Street',
-> 'Los Angeles',
-> 'CA',
-> '90046',
-> 'USA',
-> NULL,
-> NULL);
我们在表名的后面加一个括号指定了字段名,无论表结构是否改变,都可以插入。
注意点:
- 自动增量值我们如果不想指定,可以用NULL代替,MySQL会忽略NULL值。
- 推荐的做法中,可以有些字段不插入,但是这些字段必须允许为空值。
- insert操作有可能很耗时,尤其是在更新数据索引的时候。
- 如果数据检索是最重要的(通常是这样),则你可以通过在INSERT 和 INTO之间添加关键字LOW_PRIORITY,指示MySQL
降低 INSERT 语句的优先级。让查询操作优先。
(3) 插入多个行。
如上图两个框中所示,用一个values,把要插入的数据分别用括号括起来,中间逗号隔开即可。
此技术可以提高数据库处理的性能,因为MySQL用单条 INSERT 语句处理多个插入比使用多条 INSERT语句快。
(4) 插入检索出的数据。
我们可以把从一张表中检索出的数据直接插入到另一张表中,通过使用insert ... select语句。
mysql> insert into customers(cust_id,
-> cust_contact,
-> cust_email,
-> cust_name,
-> cust_address,
-> cust_city,
-> cust_zip,
-> cust_country)
-> select cust_id, //检索的数据
-> cust_contact,
-> cust_email,
-> cust_name,
-> cust_address,
-> cust_city,
-> cust_zip,
-> cust_country from custnew;
上述就是把select...from custnew中的数据检索出来,然后插入到customers表指定的字段中去。
注意:
- INSERT SELECT中的列名为简单起见,这个例子在INSERT和SELECT 语句中使用了相同的列名。但是,不一定要求列名匹配。
- 可以使用where来过滤检索的数据。
2. 修改操作。
update关键字用于修改表中数据,分为三部分:
- 更新的表名。
- set 字段名=新值。
- 过滤条件。
如下:
mysql> update customers
-> set cust_email = 'elmer@fudd.com'
-> where cust_id = 10005;
-
在更新多个列时,只需要使用单个SET命令,每个“列=值”对之间用逗号分隔(最后一列之后不用逗号)。
-
如果用 UPDATE 语句更新多行,并且在更新这些
行中的一行或多行时出一个现错误,则整个 UPDATE 操作被取消(错误发生前更新的所有行被恢复到它们原来的值)。为使是发生错误,也继续进行更新,可使用IGNORE关键字,如下所示:UPDATE IGNORE customers…
3. 删除操作。
更加简单:
-
delete 表明。
-
过滤条件。
如下:mysql> delete from customers
-> where cust_id = 10006; -
如果不加过滤条件,那么删除的将是整个表中的记录!同样的更新操作也一样,不加过滤条件那么所有记录的该字段都将被更新!
-
我们再进行更新和删除操作之前,应该先使用select语句,看过滤检索出来的数据是不是我们想要更新或者删除的记录,确保正确的值被更新。
4. 创建表。
(1) 创建表语法。
格式为:
create table 表名
(字段名1 数据类型1 备注1
字段名2 数据类型2 备注2...主键(字段名)
)引擎=引擎名;
例子:
CREATE TABLE customers
(
cust_id int NOT NULL AUTO_INCREMENT,
cust_name char(50) NOT NULL ,
cust_address char(50) NULL ,
cust_city char(50) NULL ,
cust_state char(5) NULL ,
cust_zip char(10) NULL ,
cust_country char(50) NULL ,
cust_contact char(50) NULL ,
cust_email char(255) NULL ,
PRIMARY KEY (cust_id)
) ENGINE=InnoDB;
- 上述的备注指定字段值是否可以为空,或者指定类型,比如自动增量。
- 字段名全都完毕之后可以指定主键:PRIMARY KEY(字段名)。
- 创建的表表名必须不存在,否则会出错。 MySQL只允许手工删除已存在的表名后重建一个同名表,不能简单的就直接覆盖这个表,这样容易出错。可以使用 if not exists来检查表名是否存在。
- if not exists只检查表名是否存在,不检查是否有相同的表模式已经存在(如字段值、类型等相同但是表名不同的表)。
最后理解NULL的意思:
不要把 NULL 值与空串相混淆。NULL值是没有值,它不是空串。如果指定''(两个单引号,其间没有字符),这在 NOT NULL 列中是允许的。空串是一个有效的值,它不是无值。NULL 值用关键字 NULL 而不是空串指定。
(2) 指定默认值。
CREATE TABLE orderitems
(
...
quantity int NOT NULL DEFAULT 1,
...
) ENGINE=InnoDB;
如上,我们可以指定默认值,当不给插入数据的时候不给quanlity指定值时,就用默认值1写入。
不允许函数作为默认值。
(3) 引擎小讲
- InnoDB是一个可靠的事务处理引擎.
- MEMORY在功能等同于MyISAM,但由于数据存储在内存(不是磁盘)中,速度很快(特别适合于临时表)。
- MyISAM是一个性能极高的引擎,它支持全文本搜索,但不支持事务处理。
5. 更新表
理想状态下,当表中存储数据以后,该表就不应该再被更新。在表的设计过程中需要花费大量时间来考虑,以便后期不对该表进行大的改动。
操作为:
- ALT TABLE 表名
- 更新操作。
(1) 添加一个列。
mysql> ALTER TABLE vendors
-> ADD vend_phone CHAR(20);
这条语句给 vendors表增加一个名为vend_phone的列,必须明确其数据类型。
(2) 删除一个列。
mysql> ALTER TABLE vendors
-> DROP COLUMN vend_phone;
注意要使用DROP COLUMN关键词。
(3) 删除表。
drop table table_name;
6. 重命名表。
RENAME TABLE table_name1 TO table_name2;