MySQL 基础知识
0.MySQL的常用操作
SHOW DATABASES;显示所有的数据库
USE database;切换到某一个数据库
SHOW TABLES;显示当前数据库中的所有的表
SHOW COLUMNS FROM table;详细显示某一个表的信息
SHOW STATUS;显示服务器状态
SHOW CREATE DATABASE database/SHOW CREATE TABLE table;显示创建某一个数据库/表的语句
SHOW GRANTS;显示用户的权限
SHOW ERRORS/SHOW WARNINGS
1.检索
SELECTG DISTINCT xxx; 表示只检索返回不同的值
SELECT xxx FROM xxx LIMIT 5; 表示返回不多于 5 行
SELECT xxx FROM xxx LIMIT 5, 5; 第一个数表示开始的位置,第二个数表示要检索的行数
~ LIMIT 4 OFFSET 3; 从第 3 开始取 4 行
~ ORDER BY A, B; 先按照 A 排序,如果 A 一样,按照 B 排序
~ ORDER BY A DESC; 降序排序 (默认升序 ASC)
~ WHERE A IS NULL; 当取不到值的时候符合要求
LIKE %:任意多个字符 _:一个字符
REGEXP ‘xxx’ 正则表达式匹配
Concat:字符拼接
SELECT Concat(name, “=”, name) FROM ~
SELECT AVG() FROM ~ 所检索出来的值的平均值
SELECT COUNT(*) FROM ~ 把所有取到的值计算进来,然后得出检索出的总数据条数
SELECT COUNT(column) FROM ~ 写指定的列的名字,只对该列为非空的情况下计算为一条数据
~ GROUP BY a HAVING b > 10; 分组查询
~ GROUP BY a HAVING b > 10 ORDER BY a LIMIT 5 OFFSET 2; 一条包含常见检索条件的SQL语句
UNION 指示MySQL执行多条SELECT语句,并把输出组合成单个查询结果
UNION 必须由两条或者两条以上的SELECT语句组成,检索的数据应该相同
UNION ALL 取出所有的行(包括重复的行),UNION 在检索时默认会去除重复的行
2.插入
INSERT INTO table (aa, bb) VALUES (cc, dd); 插入数据
INSERT LOW_PRIORITY INTO ~ 降低插入相对于检索来说的优先级
3.更新
UPDATE table SET aa = bb WHERE cc = dd; 数据更新操作
UPDATE IGNORE table ~ 如果更新时遇到错误,也要继续更新
4.删除
DELETE FROM table WHERE aa = bb; 删除一整条数据
DELETE从表中删除行,甚至是删除所有的行,但是DELETE不删除表本身
表的清空:TRUNCATE table; 此条语句实际上是删除原来的表并重新创建一个表,而不是逐行删除表中的数据,所以速度很快
5.创建表
PRIMARY KEY (a, b) 创建主键
AUTO_INCREMENT 自增
SELECT last_insert_id() 获得最后一个AUTO_INCREMENT 的值
DEFAULT a 制定默认值
InnoDB 可靠的事务处理引擎,不支持全文本搜索
MEMORY 功能上等同于 MyISAM,数据存储在内存,速度很快
MyISAM 性能极高,支持全文本搜索,不支持事务处理
6.重命名表
RENAME TABLE a TO b, c TO d;
7.更新表
ALTER TABLE table ~
~ ADD a CHAR(20) 增加一个列a
~ DROP COLUMN a 删除列a
8.删除表
DROP TABLE a;
9.视图
视图是虚拟的表。
可以把某整个查询包装成一个视图
优点:
- 重用SQL语句
- 简化复杂的SQL操作
- 使用表的的组成部分而不是整个表
- 保护数据
视图可以嵌套,即一个视图可以从其他视图获得数据
视图的操作语句:
- CREATE VIEW; 创建视图
- SHOW CREATE VIEW viewname;查看创建视图的语句
- DROP VIEW viewname;删除视图
- CREATE OR REPLACE VIEW 视图存在,则更新;不存在,则创建
CREATE VIEW aaa AS SELECT ~ 创建一个视图
接下来,可以对视图进行操作,例如:SELECT * FROM aaa;
*视图可以用于数据的更新、插入和删除,但是一般来说,应该只将视图用于数据的检索
10.存储过程
创建存储过程:
CREATE PROCEDURE aaa()
BEGIN
SELECT a FROM b;
END;
DELIMITER // 把//作为新的语句结束符
DELIMITER ; 重新把;作为MySQL语句结束符号
调用上面的存储过程:
CALL aaa();他将会执行定义的操作过程
删除过程:DROP PROCEDURE aaa;
优化版本:DROP PROCEDURE IF EXISTS aaa;
SHOW CREATE PROCEDURE aaa; 显示存储过程的CREATE语句
SHOW PROCEDURE STATUS; 显示存储过程的详细信息,可以通过 LIKE 语句对过程名进行过滤
如何使用一个存储过程:
CREATE PROCEDURE ordertotal(
IN onumber INT,
OUT ototal DECIMAL(8,2)
)
BEGIN
SELECT sum(item_price*quantity)
FROM orderitems
WHERE order_number = onumber
INTO ototal;
END;
CALL ordertotal(20005, @total);
SELECT @total;
上面的操作中:
第一步是创建一个存储过程,并且IN表明这是一个输入的参数,OUT表明这是一个要输出的参数。INTO ototal表示把下面查询操作所检索出来的值放到ototal中。
第二步是调用存储过程,把20005传入,存储过程传出的参数用变量@total来保存
第三步是取得变量@total的值
11.游标
声明(定义)游标
打开游标
操作
关闭游标
DECLARE ordernumbers CURSOR FOR ~ OPEN ordernumbers; CLOSE ordernumbers;
游标的操作要依附于存储过程来进行。
12.触发器
当发生DELETE、INSERT、UPDATE时,会自动进行某些操作
CREATE TRIGGER newproduct AFTER INSERT ON products FOR EACH ROW SELECT "Product added";--创建触发器
DROP TRIGGER newproduct; --删除触发器
只有表才支持触发器,视图不支持触发器。
CREATE TRIGGER newproduct AFTER INSERT ON products FOR EACH ROW SELECT NEW.product; -- 检索最新插入的那条数据的product列
CREATE TRIGGER deleteorder BEFORE DELETE ON orders FOR EACH ROW
BEGIN
INSERT INTO archive_orders(order_num) VALUES(OLD.oreder_num);
END;
– UPDATE 的触发器:NEW代表更新之后的值,OLD表示跟新之前的值
CREATE TRIGGER updateevendor BEFORE UPDATE ON vendors FOR EACH ROW SET NEW.vend_state = Upper(NEW.vend_state);
13.事务处理
START TRANSACTION;
DELETE FROM ordertotals;
ROLLBACK;/COMMIT;
SAVEPOINT delete1;
ROLLBACK TO delete1;
SET autocommit = 0;
关闭自动提交(只对每一个连接有效,对数据库服务器无效)。