MySQL笔记(一)
引擎
- InnoDB 是一个可靠的事务处理引擎,它不支持全文本搜索
- MEMORY在功能等同于MyISAM,但由于数据存储在内存(不是磁盘) 中,速度很快(特别适合于临时表)
- MyISAM是一个性能极高的引擎,它支持全文本搜索(参见第18章), 但不支持事务处理。
- 外键不能跨引擎混用引擎类型有一个大缺陷。外键(用于强制实施引用完整性)不能跨引擎,即使用一 个引擎的表不能引用具有使用不同引擎的表的外键。
使用 REGEXP:
1 | // shop_name 是测试数据,包含 --,比如 商家--1 |
Concat() 拼接串,即把多个串连接起来形成一个较长的串
Trim() 删除数据多余的空格,RTrim() 函数去掉值右边的所有空格,LTrim() 去掉串左边的空格
常见的情景:报表中的名字按照name(location)的格式,而表中数据存储在两个列name和country中
1 | SELECT Concat(Trim(`shop_name`), Trim(' ( '), Trim(`mail_type`), ' )') AS format_title |
SELECT shop_name
, mail_type
, distance
, service_time
, service_time
* distance
as total_price
FROM business
WHERE mail_type
LIKE ‘_通’
ORDER BY distance
DESC;
// 标题–9 中通 980 59 57820
1 |
|
– street 的行数
SELECT COUNT(*) AS street_count
FROM street;
– 最大值
SELECT MAX(distance
) AS max_distance,
– 最小值
MIN(distance
) AS min_distance,
– 平均值
AVG(distance
) AS avg_distance,
– 所有值的和
SUM(distance
) AS total_distance,
– 所有不同值的和(去重)
SUM(DISTINCT distance
) AS total_distance_distinct
FROM business;
1 |
|
SELECT mail_type
, COUNT(*) AS num_mail_type
FROM business
GROUP BY mail_type
;
SELECT mail_type
, COUNT(*) AS num_mail_type
FROM business
GROUP BY mail_type
WITH ROLLUP;
1 |
|
// 在联结两个表时,你实际上做的是将第一个表中的每一行与第二个表中的每一行配对。
// WHERE子句作为 过滤条件,它只包含那些匹配给定条件(这里是联结条件)的行。
// 没有WHERE子句,第一个表中的每个行将与第二个表中的每个行配对,而不管它们逻辑上是否可以配在一起。
SELECT p.name, c.name, d.name, s.name
FROM province
p, city
c, district
d, street
s
WHERE s.parent_code = d.code
AND d.parent_code = c.code
AND c.parent_code = p.code
AND p.name = ‘山西省’
ORDER BY c.name;
1 |
|
// 查询 distance
< 400 || mail_type
IN (‘顺丰’, ‘圆通’)
SELECT shop_name
, distance
FROM business
WHERE distance
< 400
UNION
SELECT shop_name
, distance
FROM business
WHERE mail_type
IN (‘顺丰’, ‘圆通’)
ORDER BY distance
;
1 |
|
UPDATE business
SET service_time
= round(rand() * 100)
WHERE service_time
< 60;
1 |
|
SELECT * FROM mysql.user;
—- hotdog
@%
:用户名 hotdog,% 表示允许任何ip地址,IDENTIFIEDBY 指定的口令为纯文本,MySQL 将在保存到user表之前对其进行加密。
CREATE USER hotdog
@%
IDENTIFIED BY ‘123456’;
—- 配置权限:对 hotdog 数据库有所有权限,不能访问其他数据库,GRANT 的反操作为 REVOKE
GRANT ALL PRIVILEGES ON hotdog.* TO hotdog
@%
IDENTIFIED BY ‘123456’;
—- 删除用户
DROP USER hotdog
@localhost
;
—- 配置完权限之后刷新MySQL的系统权限相关表方可生效
FLUSH PRIVILEGES;
—- 删除用户
DROP USER username
;
—- 查看赋予用户账号的权限
SHOW GRANT FOR username
;
—- 更改口令,新口令必须传递到Password()函 数进行加密。
SET PASSWORD FOR username
= Password(new_password
)
1 |
|
ALTER TABLE user
ADD COLUMN create_at
TIMESTAMP NOT NULL;
ALTER TABLE user
ADD COLUMN update_at
TIMESTAMP NOT NULL;
—- TIMESTAMP DEFAULT CURRENT_TIMESTAMP 表示插入的时候自动获取当前时间(格式为YY-mm-dd HH:ii:ss)
ALTER TABLE user
MODIFY create_at
TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL;
—- TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 表示更新的时候自动获取当前时间(格式为YY-mm-dd HH:ii:ss)
ALTER TABLE user
MODIFY update_at
TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP NOT NULL;
1 |
|
ALTER TABLE products
ADD CONSTRAINT fk_orders_customs
FOREIGN KEY (vend_id) REFERENCES vendors
(vend_id);
1 |
|
// 1. 用来检查表键是否正确
ANALYZE TABLE table_name
;
// 2. CHECK TABLE用来针对许多问题对表进行检查。在MyISAM表上还对 索引进行检查。CHECK TABLE支持一系列的用于MyISAM表的方式。 CHANGED检查自最后一次检查以来改动过的表。EXTENDED执行最 彻底的检查,FAST只检查未正常关闭的表,MEDIUM检查所有被删 除的链接并进行键检验,QUICK只进行快速扫描。如下所示,CHECK TABLE发现和修复问题
CHECK TABLE table_name
;
// 3. 如果从一个表中删除大量数据,应该使用OPTIMIZE TABLE来收回所用的空间,从而优化表的性能。
OPTIMIZE TABLE table_name
;
1 |
|
// 查看所支持的字符集完整列表
SHOW CHARACTER SET;
// 查看所支持校对的完整列表
SHOW COLLATION;
SHOW FULL COLUMNS FROM village
;
SHOW VARIABLES LIKE ‘%char%’;
1 |
|
- 但过一段时间后你可能需要调整内存分配、缓冲区大 小等。查看当前设置:
SHOW VARIABLES;
SHOW STATUS; - 显示所有活动进程(以及它们的线程ID和执行时间)
SHOW PROCESSLIST; - KILL命令终结某个特定的进程(使用这个命令需要作为管理员登录)。
- LIKE很慢。一般来说,最好是使用FULLTEXT而不是LIKE。
- 索引改善数据检索的性能,但损害数据插入、删除和更新的性能。如果你有一些表,它们收集数据且不经常被搜索,则在有必要之前不要索引它们。(索引可根据需要添加和删除。)// 触发器将在INSERT语句成功执行后执行。从 NEW.order_num 取得这个值并返回它,此触发器必须按照AFTER INSERT执行
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
1821. MySQL不允许对变长列(或一个列的可变部分)进行索引
22. MySQL中没有专门存储货币的数据类型,一般情况下使用DECIMAL(8, 2)
## MySQL 数据类型
1. 串数据类型
![串数据类型](/images/7EA9F5A0D8F1.png)
2. 数值数据类型
![数值数据类型](/images/5D37349650BC.png)
3. 日期和时间数据类型
![日期和时间数据类型](/images/5BC46C7A9A76.png)
4. 二进制数据类型
![二进制数据类型](/images/7058C7294EBE.png)
## 触发器
> 想要某条语句(或某些语句)在事件发生时自动执行。MySQL响应以下任意语句而 自动执行的一条MySQL语句(或位于BEGIN和END语句之间的一组语 句):DELETE; NSERT; UPDATE。
>
> 只有表才支持触发器,每个表最多支持6个触发器(每条INSERT、UPDATE 和DELETE的之前和之后),单一触发器不能与多个事件或多个表关联。
CREATE TRIGGERnew_order
AFTER INSERT ONorders
FOR EACH ROW SELECT NEW.order_num;
// 删除触发器
DROP TRIGGERnew_product
;// 在任意订单被删除前将执行此触发器。它使用一条INSERT语句将OLD中的值(要被删除的订单)1
2
3
4
5
6
7
8
9
1. *INSERT触发器*(在INSERT语句执行之前或之后执行):
1. 在INSERT触发器代码内,可引用一个名为NEW的虚拟表,访问被 插入的行;
2. 在BEFORE INSERT触发器中,NEW中的值也可以被更新(允许更改 被插入的值);
3. 对于AUTO_INCREMENT列,NEW在INSERT执行之前包含0,在INSERT 执行之后包含新的自动生成值。
2. *DELETE触发器*(在DELETE语句执行之前或之后执行):
1. 在DELETE触发器代码内,你可以引用一个名为OLD的虚拟表,访 问被删除的行;
2. OLD中的值全都是只读的,不能更新。
// 保存到一个名为archive_ orders的存档表中
CREATE TRIGGERdelete_order
BEFORE DELETE ONorders
FOR EACH ROW
BEGIN
INSERT INTOarchive_orders
(order_num
,order_date
,cust_id
)
VALUES(OLD.order_num, OLD.order_date, OLD.cust_id);
END;// 保证州名缩写总是大写1
2
3
4
5
3. *UPDATE触发器*(在UPDATE语句执行之前或之后执行):
1. 在UPDATE触发器代码中,你可以引用一个名为OLD的虚拟表访问 以前(UPDATE语句前)的值,引用一个名为NEW的虚拟表访问新更新的值;
2. 在BEFORE UPDATE触发器中,NEW中的值可能也被更新(允许更改 将要用于UPDATE语句中的值);
3. OLD中的值全都是只读的,不能更新。
CREATE TRIGGERupper_vendor
BEFORE UPDATE ONvendors
FOR EACH ROW
SET NEW.vend_state = Upper(NEW.vend_state);
```