-
MySQL使用LIMIT现在最多返回多少行
-
尽量少用*,以免数据库后期更新会对之前的代码造成影响
-
ORDER BY 排序
#排序方向关键词[ASC升序|DESC降序][作用域是其前一个字段] SELECT prod_id, prod_price, prod_name FROM Products ORDER BY prod_price DESC, prod_name; #可以按列位置排序[其中2->prod_price,3->prod_name;可以与实际列名混用] #由于其指定信息不够明确,平时不建议使用 SELECT prod_id, prod_price, prod_name FROM Products ORDER BY 2, 3;
-
数据应该在哪里过滤?
- 服务端?SQL语言处理
- 客户端?开发语言处理,服务器需要发送多余数据,导致带宽资源的浪费,安全性
-
WHERE子句操作符
操作符 说明 BETWEEN X AND Y 在指定的两个值之间[X,Y] IS NULL 为NULL <> 不等于 -
AND | OR
AND的优先级大于OR
SELECT products.prod_name, products.prod_price FROM products WHERE vend_id = 'DLL01' OR vend_id = 'BRS01' AND prod_price >= 10;
Tips: 如果出现同时又AND|OR条件的情况,建议使用()确定其优先级,可以消除歧义并提高可读性
-
IN操作符的优点
- 在有许多合法选项时,IN操作符更加直观
- 可以与AND和OR操作符组合使用
- IN操作符一般比一组OR操作符更快
- 可以包含其他SELECT语句,动态的建立WHERE子句
-
通配符过滤
-
使用LIKE操作符进行通配符过滤[MySQL会忽略其大小写]
扫描二维码关注公众号,回复: 10283967 查看本文章 -
通配符列表
含义 %可被替代为多个字符 __可被替代为单个字符 Tip:
- '%'无法匹配NULL
- 不要过度使用通配符,如果其他操作可以达到同样的效果,使用其他方法
- 确实要使用通配符时,尽量不要把他们用在搜索模式的开始处,将其置于开始处,搜索起来最慢
-
-
拼接字段[MySQL不支持'+'或'||']
- MySQL使用CONCAT函数实现拼接字段
- TRIM函数实现去掉空格[RTRIM右边的空格, LTRIM左边的空格, TRIM两端的空格]
-
聚集函数
-
过滤分组HAVING
WHERE在分组前进行过滤;HAVING在分组后进行过滤
```sql
SELECT cust_id, COUNT(*) AS orders
FROM orders
GROUP BY cust_id
HAVING COUNT(*)>=2;
```
-
UNION并集 UNION ALL不去除重复行
-
INSERT
指明需要插入的字段名,以免数据库发生变动,产生不必要的后果
#使用方法2替换方法1的写法 #方法1 INSERT INTO customers VALUES ('10000006', 'Toy Land', '123 ANy Street', 'New York', 'NY', '11111', 'USA', NULL, NULL); #方法2 INSERT INTO customers(cust_id, cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country, cust_contact, cust_email) VALUES ('10000006', 'Toy Land', '123 ANy Street', 'New York', 'NY', '11111', 'USA', NULL, NULL);
-
从一个表复制到另一个表
create table custcopy as SELECT * FROM customers;
-
删除表中的所有行使用TRUNCATE TABLE 替换 DELETE
-
更新表[ALTER TABLE]
#添加字段 ALTER TABLE vendors ADD vend_phone CHAR(20); #删除字段 ALTER TABLE vendors DROP COLUMN vend_phone;
-
复杂表的手动删除过程
- 用新的列布局创建一个新表
- 使用INSERT SELECT语句从旧表复制数据到新表
- 校验包含所需数据的新表
- 重命名/删除旧表
- 重命名新表
- 重新创建触发器、存储过程、索引和外键
-
RENAME
RENAME TABLE customers TO cuscopy; RENAME TABLE cuscopy TO customers;
-
视图
-
优点
- 重用SQL语句
- 简化复杂的SQL操作
- 使用表的一部分而不是整个表
- 保护数据
- 更改数据格式和表示[视图可以返回与底层表格式不同的数据]
-
缺点
- 视图不包含数据,每次使用视图的时候都需要处理查询执行时需要的所有检索。若使用了多个联结和过滤创建了复杂的视图或者嵌套了视图,性能可能会下降的很厉害
-
规则
- 视图必须唯一命名
- 视图数目没有限制
- 创建视图需要权限
- 视图可以嵌套
- 视图无法索引,也不能有关联的触发器或默认值
-
创建方法
CREATE 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语句
- 简化数据处理
- 保护基础数据
-
-
存储过程
- 优点[简单、安全、高性能]
- 简化复杂的操作
- 语句的复用
- 方便变动的管理
- 存储过程通常以编译过的形式存储,提高性能
- 可以编写功能更强更灵活的代码
- 缺点
- 存储过程难以移植
- 复杂,需要经验
- 执行存储过程
- 优点[简单、安全、高性能]
-
事务处理
-
作用:确保原子操作
-
术语:
- 事务:一组SQL语句
- 回退:撤销指定SQL语句的过程
- 提交:将未存储的SQL语句过程写入数据库表
- 保留点:事务处理中设定的临时占位符,可以对其发布回退
-
可以回退的语句:INSERT、UPDATE、DELETE
-
语句
START TRANSACTION ...
-
-
游标
-
约束
- 唯一约束
- 检查约束[CHECK]
-
索引
-
优点:
- 改善了检索操作的性能
-
缺点:
- 降低了数据插入、修改和删除的性能
- 占用大量的存储空间
-
语法:
CREATE INDEX prod_name_ind ON products(prod_name);
-
-
触发器--特殊的存储过程
- 特点:在特定的数据库活动发生后自动执行
- 数据访问权限:
- INSERT操作中的所有新数据
- UPDATE操作中的所有新数据和旧数据
- DELETE操作中删除的数据
- 用途:
- 保证数据一致
- 基于某个表的变动在其他表上执行活动
- 进行额外的验证并根据需要回退数据
- 计算计算列的值或更新时间戳
- 提醒:约束比触发器快,尽量使用约束