表操作
创建表
CREATE TABLE 表名(列名 类型 要求(NOT NULL等),PRIMARY KEY(列名)
)
AUTO_INCREMENT 在没有指定数值时自动增加,一般设置在id上,
CREATE TABLE 表名(列名 类型 AUTO_INCREMENT,PRIMARY KEY(列名)
)
每个表只能有1个列写AUTO_INCREMENT,该列必须为索引
设置默认值DEFAULT 值
CREATE TABLE 表名(列名 类型 AUTO_INCREMENT,列名2 类型 NOT NULL DEFAULT 1,PRIMARY KEY(列名)
)
修改表
-- 增加1列
ALTER TABLE 表名
ADD 列名 类型;-- 删除1列
ALTER TABLE 表名
DROP COLUMN 列名;
另一个常用用途——定义外键
ALTER TABLE 要添加外键的表名
ADD CONSTRAINT 约束名称
FOREIGN KEY (添加外键的列名)
REFERENCES 主表名 (主表被引用列)
[ON DELETE 操作] [ON UPDATE 操作];
CONSTRAINT 约束名称
:外键约束的名称(建议命名为fk_子表名_主表名
格式,如fk_orders_customer
),用于后续管理(如删除约束)。FOREIGN KEY (子表外键列)
:子表中用于关联的列(需与主表被引用列数据类型一致)。REFERENCES 主表名 (主表被引用列)
:指向主表的主键或唯一键列(必须已存在且有唯一性约束)。ON DELETE/UPDATE
(可选):定义主表数据删除 / 更新时,子表的联动行为(如CASCADE
级联删除、RESTRICT
拒绝操作等)。
删除表
DROP TABLE 表名;-- 修改表名
RENAME TABLE a TO b;
视图
类似于封装宏定义宏操作。把某一条件的SQL封装成一个虚拟表。
- 复用sql
- 简化sql
- 保护数据,设置权限
CREATE VIEW 视图名 AS SELECT
DROP VIEW 视图名
存储过程
相当于数据库中创建、使用函数
- 适合使用:需要强事务性、高频重复执行、跨多表复杂操作的场景(如金融、传统企业信息化系统)。
- 谨慎使用:互联网高并发、需要快速迭代或可能跨数据库的系统。
-- 执行
CALL productpricing(@pricelow,@pricehigh,@priceaverage);-- 建立存储过程
CREATE PROCEDURE productpricing()
BEGINSELECT ...
END;
-- 调用
CALL productpricing();-- 删除
DROP PROCEDURE productpricing;
游标
能够对检索出来的结果 前进一行、后退一行等操作
CREATE PROCEDURE processorders()
BEGINDECLARE ordernumbers CURSORFORSELECT order_num FROM orders;
END;OPEN ordernumber;CLOSE ordernumbers;-- close或在end之前可以使用fetch访问
FETCH ordernumbers INTO o;
触发器
在时间发生时自动执行的 语句,以下是支持的事件
DELETE
INSERT
UPDATE
-- 创建时显示打印
CREATE TRIGGER 触发器名 AFTER INSERT ON 表名
FOR EACH ROW SELECT 'Product add';
-- 删除
DROP TRIGGER 触发器名;
也能够使用BEFORE 等控制触发时机,不过多解释。
管理事务处理
几个术语:
事务:一组SQL语句
回退:撤销知道SQL语句的过程
提交:将为存储的SQL语句结果写入数据表
保留点:设置的临时占位符,可以对它发布回退
事务开始START TRANSACTION
回滚
SELECT * FROM ordertotals;
START TANSACTION;
DELETE FROM ordertotals;
ROLLBACK;
SELECT * FROM ordertotals;
提交(只有事务内都成功提交才会成功)
START TRANSACTION;
DELETE FROM XXX WHERE xx=xx;
DELETE FROM XXX WHERE xx2=xx2;
COMMIT;
保留点SAVEPOINT xx1
ROLLBACK TO xx1
事务的特性:ACID 原子、一致、隔离、持久
权限控制
调试中会使用root
账号进行控制,但在实际应用不可以。
应该创建多个用户区分权限
MySQL中用户存在mysql表中
USE mysql;
SELECT user FROM user;
创建用户 CREATE USER xxx IDENTIFIED BY '密码'
;
重命名 RENAME USER xxx TO bforta;
删除DROP USER xxx;
赋予权限GRANT SELECT ON 表名.* TO 用户名
取消权限REVOKE SELECT ON XXX.* TO 用户名
修改用户密码:SET PASSWORD FOR 用户 = Password('密码')
改善性能
最简单的3方面:
1、加索引:在常用的列上增加,检查索引是否正常生效
2、优化SQL本身:不使用SELECT *,使用正确的条件连接还是交集并集
3、查看数据库本身:表中数据是否超2千万条分表,硬件功能。