Mysql:SQL指令篇
目录
本章以MySQL的SQL指令为主,也会结合其他的DBMS。
DML
- 更新:update
- 用b表数据更新a表
-- MySQL UPDATE a INNER JOIN b ON a.id = b.id SET a.content = b.content;
- 用b表数据更新a表
- 插入:insert
- 用查询结果插入
INSERT INTO my_table(column1) SELECT column1 from table2;
- 用查询结果插入
- 删除:delete
DQL
- 基本流程顺序是:FROM、ON、JOIN、WHERE、GROUP BY、HAVING、ORDER BY、LIMIT、SELECT,流程中的每一步都会产生一个临时的虚拟表格,但是只有运算后满足条件的才会进入下一步产生的表格中1
- 对列的值进行翻译
-- 关键字 case when then else end SELECT ( CASE WHEN 列名 = "条件1" THEN '翻译名1' ELSE '翻译名2' END ) AS 新列名 FROM 你的表名;
- having子句
-- having子句的目标是提供对分组、聚合之后的结果的筛选能力,相对的where只能用在聚合和分组之前 SELECT 列名1, SUM(列名2) AS 聚合函数结果, COUNT(1) FROM 表名 WHERE 列名3=XXX GROUP BY 列名4 HAVING 聚合函数结果 > 1
- 各种连接
-- 左、右外连接(左右外连接) SELECT * FROM A LEFT JOIN B ON A.KEYA=B.KEYB; SELECT * FROM A RIGHT JOIN B ON A.KEYA=B.KEYB; -- 左、右内连接通过判断非NULL实现 SELECT * FROM A LEFT JOIN B ON A.KEYA=B.KEYB where B.KEYB IS NOT NULL SELECT * FROM A RIGHT JOIN B ON A.KEYA=B.KEYB where A.KEYA IS NOT NULL -- 内连接(MYSQL默认内连接) SELECT * FROM A INNER JOIN B ON A.KEYA=B.KEYB; SELECT * FROM A JOIN B ON A.KEYA=B.KEYB; -- 外连接用UNION(UNION默认去重) SELECT * FROM A LEFT JOIN B ON A.KEYA=B.KEYB UNION SELECT * FROM A RIGHT JOIN B ON A.KEYA=B.KEYB;
不同语言支持的SQL查询标准不同,当语法不兼容的时候,考虑用其他办法
DDL
- 修改表:alter
- 删除某列
-- alter table xxx drop column xxx;
- 删除某列
- 创建表:create
- 用已有数据创建
-- MySQL写法 CREATE TABLE temp_record SELECT * FROM record LIMIT 10;
- 用已有数据创建
- 删除表:drop
DCL
- revoke
- grant
ORM
- ORM(Object/Relational Mapping)就是一种能通过对实例对象的操作,直接完成数据库的数据操作的框架。
- 优点:封装程度高,安全,不用自己写SQL
- 缺点:难以控制SQL语句生成,复杂查询效率不如原生SQL
- 常见ORM框架:Hibernate
MyBatis并不是一个全自动化的持久层框架,它仍然需要开发者维护SQL和结果映射
坑
- count:count(*)或count(1)都不会跳过null,但如果count(column),即指定列名,则会跳过null
其他
- 表空间优化
- optimize命令,优化表,有使用限制,且不同存储引擎的实现不同,如InnoDB将会重建表
-- 优化表A(此时磁盘剩余控件必须大于A所需的表空间) optimize table A;
- 命令行
- 登录指定的MySQL数据库
mysql -u用户名 -p密码 -hIP地址
- MySQL数据库导出(.sql文件)
# 导出指定服务器,指定数据库,指定表的数据 mysqldump -u用户名 -p密码 --skip-lock-tables \ 你的库名 你的表名 > ./dump.sql
- 数据导出为csv(需提前设置secure_file_priv)
-- MySQL写法 SELECT * FROM temp LIMIT 10 INTO OUTFILE '/tmp/test.csv' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n'; -- 如出现权限禁止,则需要设定secure_file_priv为保存路径 -- 并重启MySQL