MySQL入门学习笔记之四

插入数据

插入完整的行

INSERT INTO customers
VALUES(NULL,   // 第一行是主键列
    'LZP',
    'CN',
    NULL);

不安全,尽量避免使用。

INSERT INTO customers
(cust_name,
cust_address,
cuss_city)
VALUES
('PEP',
'LOS',
'CA');

提高整体性能–降低INSERT语句的优先级

INSERT LOW_PRIORITY INTO

插入检索出的数据

INSERT INTO customers(cust_id,
    cust_contact)
SELECT cust_id,
    cust_contact
FROM custnew;

更新和删除数据

更新数据

【使用UPDATE一定要小心!!不能省略WHERE子句,否则会更新所有行!!】

UPDATE customers
SET cust_email = '[email protected]',
    cust_name = 'The Fudds'
WHERE cust_id = 1005;

为了删除某列的值可以将值设为NULL

删除数据

DELETE FROM customers
WHERE cust_id = 10006;

也可以删除表中所有行

一种更快的方法删除所有行
TRUNCATE TABLE
删除原表,创建新表,而不是逐行删除数据

注意

绝不使用不带WHERE子句的UPDATE/DELETE语句

对UPDATE/DELETE使用WHERE子句前,先用SELECT进行测试。

创建和操纵表

创建

CREATE TABLE customers
(
  cust_id int NOT NULL AUTO_INCREMENT,
  cust_name char(50) NOT NULL,
  cust_address char(50) NULL,
  PRIMARY KEY(cust_id)
)ENGINE=InnoDB;

NULL是默认设置

主键

主键使用单个列,则值必须唯一;
如果使用多个列,则列的组合值必须唯一

CREATE TABLE orderitems
(
order_num int NOT NULL,
order_item int NOT NULL,
prod_id char(10) NOT NULL
PRIMARY KEY(order_num, order_item)
)ENGINE=InnoDB;

AUTO_INCREMENT可以被覆盖,每个表只允许存在一个,且必须被索引。

获取AUTO_INCREMENT列值
SELECT last_insert_id()函数

指定默认值

quantity int NOT NULL DEFAULT 1,

【!!】MySQL不允许函数作为默认值,只支持常量
【!!】尽量使用默认值,而不是NULL列

存储引擎

InnoDB 是可靠的事务处理引擎,但不支持全文本搜索;
MEMORY 功能上等同于MyISAM,但是数据是存储在内存中的,速度很快,适合临时表;
MyISAM,性能很高,但是不支持事务处理。
【!!】外键不能跨引擎。

更新表– ALTER TABLE

给表添加列

ALTER TABLE vendors
ADD vend_phone CHAR(20);

删除列

ALTER TABLE vendors
DROP COLUMN vend_phone;

定义外键

ALTER TABLE orderitems
ADD CONSTRAINT fk_orderitems_orders
FOREIGN KEY (order_num) REFERENCES orders (order_num);

创建表时,定义外键

o_buyer_id int NOT NULL,
FOREIGN KEY(o_buyer_id) REFERENCES s_user(u_id)

复杂表结构处理

1 用新的列布局创建一个新表
2 使用INSERT SELECT 语句从旧表复制数据到新表
3 检验包含所需数据的新表
4 重命名旧表
5 用旧表的名字重命名新表
6 根据需要创建触发器、存储过程、索引、外键
【!!】使用ALTER TABLE要极为小心,改动前应该做一个完整的备份(模式和数据的备份)。

删除表

DROP TABLE customers2;

重命名表

将customers2名改为customers

RENAME TABLE customers2 TO customers;

使用视图

视图

视图是虚拟的表,只包含使用时动态检索数据的查询。

为什么用?

1 重用SQL语句
2 简化SQL操作
3 使用表的组成部分
4 保护数据
5 可以更改数据格式和表示

视图中不包含数据,返回的数据是从表中检索来的。
视图仅仅用来查看存储在别处的数据。

视图的限制

1 视图必须唯一命名
2 视图创建数据没有限制
3 创建视图,需要具有足够的访问权限
4 视图可以嵌套视图
5 order by可以用在视图中,但视图检索数据SELECT中也包含order by时,视图中order by被覆盖
6 视图不能索引,也不能关联触发器
7 视图可以和表一起使用(比如连接表和视图)

使用视图

创建CREATE VIEW
查看创建视图的语句:SHOW CREATE VIEW viewname
删除视图:DROP VIEW viewname
更新视图:先DROP 后 CREATE. 或者用CREATE OR REPLACE VIEW

简化联结

创建视图

CRATE VIEW productcustomers AS
SELECT cust_name, cust_contact, prod_id
FROM customers, orders, orderitems
WHERE customers.cust_id = orders.cust_id
    AND orderitems.order_num = orders.order_num;

使用视图

SELECT cust_name, cust_contact
FROM productcustomers
WHERE prod_id = 'TNT2';

重新格式化检索出来的数据

CREATE VIEW vendorlocations AS
SELECT Concat(RTrim(vend_name),'(', RTrim(vend_country),')') AS vend_title
FROM vendors
ORDER BY vend_name;

使用

SELECT * FROM vendorlocations;

更新视图

视图可更新,更新视图就是更新基表。

下列条件不允许更新:

  • 存在分组(使用GROUP BY/ HAVING)
  • 联结
  • 子查询
  • 聚集函数
  • DISTINCT
  • 导出计算列

你可能感兴趣的:(MySQL,MySQL成长之路)