注意:其实备份后的文件就是那个数据的从创建开始的所有 SQL 语句;一般存放在 MySQL 自己的 bin 文件夹中。
2.1.5 备份恢复数据库的表
其实我推荐别指定在那个盘,直接用文件名.sql。因为你用那种具体的盘的位置,到时候恢复的时候会报Fail to open file,erro:2就是 MySQL 找不到那个文件,直接这样名字创建,文件就在 MySQL bin 下面就不会出问题。
2.2 表
2.2.1 创建表
演示:
简约:create table table_name( field datetype 。。。);
其实其他的他又默认值的,咱也是这样简洁用的多。
2.2.2 数据类型
2.2.2.1 总览
2.2.2.2 整数
2.2.2.3 小数
2.2.2.3 无符号整数
2.2.2.4 bit
2.2.2.5 小数
2.2.2.6 字符串
2.2.2.7 日期
2.2.3 修改表
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
#添加列 ALTER TABLE demo01 ADD (gender CHAR(1)); #修改列 ALTER TABLE demo01 MODIFY `name` VARCHAR(200); #删除列 ALTER TABLE demo01 DROP word; #修改表名 RENAME TABLE demo1 TO demo01; #显示表结构 DESC demo01; #修改表的字符集 ALTER TABLE demo01 CHARACTER SET utf8; #修改列名 ALTER TABLE demo01 CHANGE `name` `user_name` VARCHAR(63); #查找 SELECT * FROM demo01;
2.2.4 表的复制
蠕虫复制:
1 2 3 4 5 6 7 8 9 10
-- 演示如何自我复制 -- 1. 先把 emp 表的记录复制到 my_tab01 INSERT INTO my_tab01 (id, `name`, sal, job,deptno) SELECT empno, ename, sal, job, deptno FROM emp; -- 2. 自我复制 INSERT INTO my_tab01 SELECT * FROM my_tab01;
#insert 插入数据 #简约方式 INSERT INTO demo01 VALUES(1,'张三','男'); #标准方式 INSERT INTO demo01(id,user_name) VALUES(2,'李四'); #一次性插入多条语句 INSERT INTO demo01 VALUES(3,'王五','女'),(4,'托尼','男'),(5,'杰克','女'); #查询表中情况 SELECT * FROM demo01;
补充:
如果添加是给表中所有字段都加就不用写table_name后的字段名称;
如果没有赋值,有默认值,可以创建表时指定也可以是各类型的默认值;
注意插入的数据顺序对应,长度合适;
如果数据是日期或者字符加上英文单引号;
某列某行上可以为空,前提是可以为 null;
3.3 update
修改表中数据
细节:
代码:
1 2 3 4 5 6 7 8
#更新表中数据 update demo01 set gender = '女' where id = 4; #同时更新多行 update demo01 set user_name = '大石头',id = 666 where gender = '男';
3.4 delete
代码:
1 2 3 4 5
#删除一条数据 DELETE FROM demo01 WHERE id = 2; #删除一个表所有数据 DELETE FROM demo01;
细节:
四,DQL_数据查询
DQL (Data Query Language)
4.1 语法
解释:
代码演示:
1 2 3 4 5 6 7
#整表查询 SELECT * FROM demo01; #去重整表查询 SELECT DISTINCT * FROM demo01; #指定查询 SELECT id,user_name FROM demo01 WHERE gender = '女';
4.2 查询加工
查询中加列计算加as改名
1 2 3 4 5 6 7 8 9 10 11 12 13 14
#演示查询中加计算和改名 CREATE TABLE student ( `name` VARCHAR(55), math INT, chinese INT, english INT ); INSERT INTO student VALUES('张三',10,10,10), ('李四',20,20,20), ('王五',30,30,30); SELECT `name`,(math+chinese+english) AS total_scores FROM student;
4.3 运算符
1 2 3
运算符在过滤查询中的使用 select * from student where (math+chinese+english) between 40 and 100 and math = 20 ;
4.4 排序查找
代码:
1 2 3
#按照总分降序输出 select *,(math+chinese+english) as total_scores from student order by total_scores desc;
4.5 加强表查询
mysql 中日期类型可以直接比较,需要注意格式;
%:表示0到多个任意字符 _:表示任意字符;
详细的要在实战中体现,这里就不在赘述;
4.6 分页查询
4.7 数据分组的总结
4.8 多表查询
就是我们要查询的信息来源于两个表以上,这时候注意我们的条件至少要是 表的个数-1
1 2 3
SELECT ename,sal,dname,emp.deptno FROM emp, dept WHERE emp.deptno = dept.deptno
4.9 自连接
在同一张表上的连接查询,将一张表看成两张表
注意给表取个别名,列也可以这样加一个
1 2 3
SELECT worker.ename AS '职员名' , boss.ename AS '上级名' FROM emp worker, emp boss WHERE worker.mgr = boss.empno;
4.10 子查询
就是查询语句嵌套在其他 SQL 语句中
找 smith 同部门的人
1 2 3 4 5 6 7
SELECT * FROM emp WHERE deptno = ( SELECT deptno FROM emp WHERE ename = 'SMITH' )
找和10号部门的工作相同但是不是 10 号部门的人
1 2 3 4 5 6 7
select ename, job, sal, deptno from emp where job in ( SELECT DISTINCT job FROM emp WHERE deptno = 10 ) and deptno <> 10
子查询额结果也可以作为临时表使用
子查询中加 all/any:
当然了,你把 all 换成 any 就是查大于部门 30 中的任意一个就符合条件
查询一个表中各个类别最贵的商品:
1 2 3 4 5 6 7 8
select goods_id, ecs_goods.cat_id, goods_name, shop_price from ( SELECT cat_id , MAX(shop_price) as max_price FROM ecs_goods GROUP BY cat_id ) temp , ecs_goods where temp.cat_id = ecs_goods.cat_id and temp.max_price = ecs_goods.shop_price
多列子查询
举例:找和 allen 部门和岗位完全相同的所有雇员,除了他自己:
1 2 3 4 5 6 7
SELECT * FROM emp WHERE (deptno , job) = ( SELECT deptno , job FROM emp WHERE ename = 'ALLEN' ) AND ename != 'ALLEN'
子查询作为临时表:
1 2 3 4 5 6 7
SELECT ename, sal, temp.max_sal, emp.deptno FROM emp, ( SELECT deptno, MAX(sal) AS max_sal FROM emp GROUP BY deptno ) temp WHERE emp.deptno = temp.deptno AND emp.sal = temp.max_sal
4.11 合并查询
下面的有笔误
代码:
1 2 3 4 5 6 7 8
-- union all 就是将两个查询结果合并, 不会去重 SELECT ename,sal,job FROM emp WHERE sal>2500 -- 5 UNION ALL SELECT ename,sal,job FROM emp WHERE job='MANAGER' -- 3 -- union 就是将两个查询结果合并, 会去重 SELECT ename,sal,job FROM emp WHERE sal>2500 -- 5 UNION SELECT ename,sal,job FROM emp WHERE job='MANAGER' -- 3
五,DCL_数据控制
DCL(Date control Language)
考完回来继续~
5.1 表外连接
1 2 3 4 5 6 7 8 9
-- 使用左外连接实现 SELECT dname, ename, job FROM dept LEFT JOIN emp ON dept.deptno = emp.deptno -- 使用右外连接实现 SELECT dname, ename, job FROM emp RIGHT JOIN dept ON dept.deptno = emp.deptno --
5.2 约束
5.2.1 primary key
1 2 3 4 5 6
CREATE TABLE t20 (id INT , `name` VARCHAR(32) , email VARCHAR(32), PRIMARY KEY(id,`name`) -- 在表定义最后写 primary key(列名)复合主键:也就是说两个元素一致才是叫重复 );
5.2.2 not null (非空)
5.2.3 unique(唯一)
5.2.4 foreign key (外键)
1 2 3 4 5 6 7 8 9 10 11 12
-- 外键演示 -- 创建 主表 my_class CREATE TABLE my_class ( id INT PRIMARY KEY , -- 班级编号 `name` VARCHAR(32) NOT NULL DEFAULT ''); -- 创建 从表 my_stu CREATE TABLE my_stu ( id INT PRIMARY KEY , -- 学生编号 `name` VARCHAR(32) NOT NULL DEFAULT '', class_id INT , -- 学生所在班级的编号 -- 下面指定外键关系 FOREIGN KEY (class_id) REFERENCES my_class(id))
5.2.5 check
1 2 3 4 5 6 7
-- 测试 CREATE TABLE t23 ( id INT PRIMARY KEY, `name` VARCHAR(32) , sex VARCHAR(6) CHECK (sex IN('man','woman')), sal DOUBLE CHECK ( sal > 1000 AND sal < 2000) );
5.3 自增长
5.4 索引
5.4.1 入门
可以优化查询速度,但是索引也会暂用空间
1 2 3
-- empno_index 索引名称 -- ON emp (empno) : 表示在 emp 表的 empno 列创建索引 CREATE INDEX empno_index ON emp (empno)
注意创建的索引只对有索引的行有用。
5.4.2 索引原理
5.4.3 索引类型
5.4.4 索引使用
5.4.5 适合
5.5 事务
事务就是一种捆绑关系,把几句DML MySQL 语句捆在一起,要么都执行要么就都不执行。比如转账,没用事务你这边钱扣了,她那边没收到,你说麻烦不?所以这个事务的必要性呼之欲出了,它保证了数据的一致性。
#查各个部门平均工资 SELECT dept,FORMAT(AVG(salary),2)AS salary_avg FROM worker GROUP BY dept;
6.1.6 having
对分组后的结果进行再过滤
解释:我们想找出每个部门中(分组了),工资高于10000的 (进一步筛选,用 having)
1 2 3 4
#查那个部门的最高工资=200 SELECT MAX(salary)AS salary_max,dept FROM worker GROUP BY dept HAVING salary_max = 200;
6.2 字符串函数
dual表 是亚元表,系统表可以用来做测试
6.3 数学函数
6.4 时间日期函数
6.5 加密/系统函数
6.6 控制流程函数
1 2 3 4 5 6 7
#控制函数 SELECT IF(FALSE,'你好','我好')FROM DUAL; SELECT IFNULL(NULL,'杰哥不要啊')FROM DUAL; SELECT CASE WHEN FALSE THEN 'jack' WHEN FALSE THEN 'tony' ELSE 'HL' END AS AAA