public class OperatingMySQLOfCommend {
/*
* 一、库的的使用语法
* 1,创建数据库
* CREATE DATABASE db1;
*
* 2,查所有数据库
* SHOW DATABASES;
* SELECT DATABASE(); (查看正在使用的库)
* SHOW CREATE DATABASE db1; (查看库的自定义信息)
*
* 3,使用库
* USE db1;
*
* 4,查看是否存在某个库并创建库
* CREATE DATABASE IF NOT EXISTS db2;
*
* 5,查看是否存在某个库并删除库
* DROP DATABASE IF NOT EXISTS db2;
* 或直接删除库:DROP DATABASE db2;
*
* 6,创建数据库并指定字符类型或修改库的字符集格式
* CREATE DATABASE CHARACTER SET gbk(utf8); (创建库指定字符集)
* ALTER DATABASE 数据库名 DEFAULT CHARACTER SET 字符集; (修改库的字符集格式)
*
* 二、表的使用语法
* 1,创建表
* CREATE TABLE 表名(
* 字段名1 字段类型1,
* 字段名2 字段类型2,
* );
* 蠕虫复制: CREATE TABLE 新表名 LIKE 旧表名; (快速创建一个表结构相同的表)
=============================================================== *
* 2,查看表
* (1)表名和表结构及语句
* SHOW TABLES; (查看该库下的所有表)
* DESC 表名; (查看表结构)
* SHOW CREATE TABLE 表名; (查看表的创建表的SQL语句)
*
* (2)查表数据
* SELECT * FROM 表名; (查看表所有数据,) * 代表所有列
* SELECT 字段名1, 字段名2, 字段名3, ... FROM 表名;
* 例: SELECT id, NAME ,age, sex, address FROM student;
* SELECT 字段名1, 字段名2, ... FROM 表名; (查询表中的部分列)
* 例: SELECT NAME, age FROM student;
*
* (3)别名查询 (需要多表查询才能体现好处)
* SELECT 字段名1 AS 别名, 字段名2 AS 别名... FROM 表名; (需要到多表查询的时候才能体现出好处 AS关键字可以省略)
* 例: SELECT NAME AS 姓名, age AS 年龄 FROM student; (查询sudent表中name 和 age 列,name列的别名为”姓名”,age列的别名为”年龄”)
* SELECT NAME, age FROM student AS s; (查询student表中name和age列,student表别名为s)
*
* (4)清除重复值
* SELECT DISTINCT 字段名 FROM 表名; (查询指定列并且结果不出现重复数据)
* 例: SELECT DISTINCT NAME, age FROM student; (查询name,age列并且结果不出现重复name和age)
* 上诉例子意思是: 如果查询姓名和年龄列,有两个人姓名都为张三,年龄都为20,那么结果只输出一次 (姓名,年龄) (张三,20)
* 查询指定某些列,如果出现列列数据相同,即使其他列数据不同也只输出一次.
*
* (5)查询结果参与运算(注意: 参与运算的必须是数值类型)
* SELECT 列名1 + 固定值 FROM 表名; (某列数据和固定值运算)
* SELECT 列名1 + 列名2 FROM 表名; ( 某列数据和其他列数据参与运算)
*
* (6)条件查询
* SELECT 字 段名 FROM 表名 WHERE 条件; (查询表获取满足条件的数据)
* > 大于 < 小于 <= 小于等于 >= 大于等于 = 等于 <> 、 != 不等于:
* SELECT * FROM student3 WHERE math>80; (比较运算符)
* and(&&) 多个条件同时满足 or(||) 多个条件其中一个满足 not(!) 不满足:
* SELECT * FROM student3 WHERE age>35 AND sex='男'; (逻辑运算符)
* in关键字 语法格式: SELECT 字段名 FROM 表名 WHERE 字段 in (数据1, 数据2...); in 里面的每个数据都会作为一次条件,只要满足条件的就会显示:
* SELECT * FROM student3 WHERE id IN (1,3,5); (即是id>1 && id<5)
* BETWEEN 值1 AND 值2 表示从值1到值2范围,包头又包尾:
* age BETWEEN 80 AND 100 相当于: age>=80 && age<=100
*
* (7) 模糊查找 LIKE
* LIKE 表示模糊查询 SELECT * FROM 表名 WHERE 字段名 LIKE '通配符字符串'; 满足 通配符字符串 规则的数据就会显示出来,
* 所谓的 通配符字符串 就是 含有通配符的字符串 MySQL通配符有两个: % : 表示0个或多个字符(任意个字符) _ : 表示一个字符.
* SELECT * FROM student3 WHERE NAME LIKE '马%'; (查询姓马的人)
* SELECT * FROM student3 WHERE NAME LIKE '马__'; (查询姓马,且姓名有三个字的人)
=========================================================================================================================== *
* 3,删除表
* (1)删除表或列
* ALTER TABLE 表名 DROP 列名; (删除列)
* DROP TABLE 表名; (直接删除表)
* DROP TABLE IF EXISTS 表名; ( 判断表是否存在并删除表)
*
* (2)删除表记录
* DELETE FROM 表名 WHERE 字段名 字段名=值; (带条件删除数据)
* DELETE FROM 表名; (不带条件删除表记录)
* TRUNCATE TABLE 表名; (truncate删除表记录)
* truncate和delete的区别:
* delete是将表中的数据一条一条删除
* truncate是将整个表摧毁,重新创建一个新的表,新的表结构和原来表结构一模一样.
==========================================================================================*
* 4,修改表
* (1) 修改表名和表结构及字符集
* ALTER TABLE 表名 ADD 列名 类型; (添加表列)
* ALTER TABLE 表名 MODIFY列名 新的类型; ( 修改列类型 )
* ALTER TABLE 表名 CHANGE 旧列名 新列名 类型; (修改列名)
* RENAME TABLE 表名 TO 新表名; (修改表名)
* ALTER TABLE 表名 character set 字符集; (修改表的字符集)
*
* (2)插入字段
* INSERT INTO 表名 VALUES (值1,值2,值3...); (插入全部字段方式一) (插入全部字段,此处省略方式二);
* INSERT INTO 表名 (字段名1,字段名2,...) VALUES (值1,值2,...);
* 注意: (1) 值与字段必须对应,个数相同,类型相同
* (2) 值的数据大小必须在字段的长度范围内
* (3) 除了数值类型外,其它的字段类型的值必须使用引号引起。(建议单引号)
* (4) 如果要插入空值,可以不写字段,或者插入null
*
* (3)更新表记录
* UPDATE 表名 SET 字段2,字段3,... WHERE 字段1=值1;
* 例:UPDATE student SET sex='男' WHERE id=2;(把id=2的列中 sex字段改成'男')
* UPDATE 表名 SET 字段; (不带条件修改数据)
* 例:UPDATE student SET sex='女'; (将表中所有sex字段改成'女')
* UPDATE: 修改数据
* SET: 修改哪些字段
* WHERE: 指定条件
*
*
* 三、DQL语句排序
* 1,单列排序(对一个字段进行排序): 升序: ASC 降序: DESC
* SELECT * FROM student3 ORDER BY age DESC;
* 组合排序(类推字段进行排序):
* SELECT 字段名 FROM 表名 WHERE 字段=值 ORDER BY 字段1 [ASC | DESC],字段2[ASC | DESC]...;
*
* 2,聚合函数: 聚合函数是纵向查询,另外聚合函数会忽略空值 注意: 函数与字段不能存在空格
* (1)count统计指定列记录数
* SELECT COUNT(english) FROM student3; (此语句会忽略null空值)
* SELECT COUNT(IFNULL(english,0)) FROM student3;
* SELECT COUNT(*) FROM student3; (统计横列个数)
* SELECT COUNT(*) FROM student3 WHERE age>40;
* (2)sum计算指定列的数据和,如果不是数据值类型,那么计算结果为0
* (3)max指定列的最大值 (4)min指定列的最小值
* (5)avg计算指定列的平均值,如果不是数据类型,那么计算结果为0
* 3,分组: 对查询信息进行分组, 相同数据作为一组
* SELECT 字段1,字段2... FROM 表名 GROUP BY 分组字段 [HAVING 条件];
* 例:SELECT sex, COUNT(*) FROM student3 GROUP BY sex; (先按性别分组再统计)
* SELECT sex, COUNT(*) FROM student3 WHERE age > 25 GROUP BY sex; (先过滤WHERE条件再分组最后统计)
* SELECT sex, COUNT(*) FROM student3 WHERE age > 25 GROUP BY sex HAVING COUNT(*) >2; (分组后统计人数再筛选)
* 注意:
* having后面可以使用聚合函数
* where后面不可以使用聚合函数 (重点)
* having是在分组后对数据进行过滤.
* where是在分组前对数据进行过滤
* 4,limit语句 作用:限制查询记录的条数 即分页查询
* SELECT *|字段列表 [as 别名] FROM 表名 [WHERE子句] [GROUP BY子句][HAVING子句][ORDER BY子句][LIMIT子句]; (limit放在末尾)
* LIMIT语法格式: LIMIT offset,length; 或者limit length; offset 是指偏移量,默认为0 计算:off=(当前页码数-1)*length
*
* 四、数据库其他操作
* 1,数据库备份
* (1)source 命令备份还原
* 备份格式: mysqldump -u用户名 -p密码 数据库 > 文件的路径
* mysqldump -uroot -proot day22 > C:\work\课改\MYSQL课改资料\Day02-MYSQL多表查询\code\bak.sql; (备份day22数据库中的数据)
* 还原格式: SOURCE 导入文件的路径;
* 注意:还原的时候需要先登录MySQL,并选中对应的数据库
* 2,数据库约束 作用:保证数据的正确性、有效性和完整性
* (1) 增加主键 特点: 唯一、不为空 允许自增(字段类型必须是整数类型,且默认从1开始自增)
* a,在创建表的时候给字段添加主键
* 字段名 字段类型 PRIMARY KEY;
* 如果想在创建表的同时改变自增默认值: 在写完表");"前写: auto_increment=100
* b,在已有表中添加主键
* ALTER TABLE 表名 ADD PRIMARY KEY(字段名);
* 在已有表后添加并改变自增默认值 ???添加
* ALTER TABLE 表名 auto_increment=100; (已有自增改变默认值)
* 删除主键
* ALTER TABLE 表名 DROP PRIMARY KEY;
* DELETE和TRUNCATE的区别:
* a,DELETE 删除表数据不会重置auto_increment的默认值;
* b,TRUNCATE 摧毁表,重建表 数据将auto_increment的默认值置为1.
* (2) 唯一
* 字段名 字段类型 UNIQUE
* (3) 非空
* 字段名 字段类型 NOT NULL
* (4) 默认值
* 字段名 字段类型 DEFAULT 默认值 (默认值格式)
* 注意:
* 一张表中只有一个字段可以设置为主键
* 一张表中可以多个字段非空与唯一约束
* 主键可以自动增长,非空与唯一约束的字段不能自动增长
* (5)增加外键 (一张表中的某个字段引用另一个表的主键 主表: 约束别人 副表/从表: 使用别人的数据,被别人约束)
* a, 新建表时增加外键:
* [CONSTRAINT] [外键约束名称] FOREIGN KEY(外键字段名) REFERENCES 主表名(主键字段名)
* 例: CONSTRAINT emp_depid_ref_dep_id_fk FOREIGN KEY(dep_id) REFERENCES department(id) (在");"前)
* b, 已有表增加外键
* ALTER TABLE 从表 ADD [CONSTRAINT] [外键约束名称] FOREIGN KEY (外键字段名) REFERENCES 主表(主键字段名);
* 例: ALTER TABLE employee ADD CONSTRAINT emp_depid_ref_dep_id_fk FOREIGN KEY(dep_id) REFERENCES department(id);
* CONSTRAINT -- 约束关键字
* FOREIGN KEY(外键字段名) –- 某个字段作为外键dept
* REFERENCES -- 主表名(主键字段名) 表示参照主表中的某个字段
* 删除外键
* ALTER TABLE 从表 drop foreign key 外键名称;
* 例: ALTER TABLE employee DROP FOREIGN KEY emp_depid_ref_dep_id_fk;
* (6)级联
* 在修改和删除主表的主键时,同时更新或删除副表的外键值,称为级联操作
* ON UPDATE CASCADE -- 级联更新,主键发生更新时,外键也会更新
* ON DELETE CASCADE -- 级联删除,主键发生删除时,外键也会删除
* (7)建表原则
* 一对一(1:1)
* 外键唯一: 主表的主键和从表的外键(唯一),形成主外键关系.
* 外键是主键: 主表的主键和从表的主键,形成主外关系
* 一对多(1:n)
* 在从表(多方)创建一个字段作为外键指向主表(一方)的主键
* 多对多(m:n)
* 需要建立中间表来维护表之间的关系
*
* 六大范式(一般满足三种):第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。
* 第一范式:每一列不能再拆分
* 第二范式: 一张表只描述一件事情
* 第三范式:从表的外键必须使用主表的主键
*
* 3,多表查询
* (1)内连接: (用左边表的记录去匹配右边表的记录,如果符合条件的则显示)
* 隐式内连接
* SELECT 字段名 FROM 左表, 右表 WHERE 条件 ;
* 例: SELECT d.name,e.name FROM emp e,dept d WHERE d.name=e.name;
* 显示内连接
* SELECT 字段名 FROM 左表 INNER JOIN 右表 ON 条件 ;
* 例: SELECT d.name,e.name FROM emp e INNER JOIN dept d ON d.name=e.name;
* 当出现多表连接时,SELECT 字段名1,字段名2,... FROM 表1 表别名1 INNER JOIN 表2 表别名2,表3 表别名3... ON 条件1 ON 条件2...; (如果条件之间还有连接用 字段1 BETWEEN 字段2 AND 字段3)
* 例:
* SELECT e.`ename`, e.`salary`, j.`jname`, j.`description`, d.`dname`, d.`loc`, s.`grade`
* FROM emp e
* INNER JOIN job j INNER JOIN dept d INNER JOIN salarygrade s
* ON e.job_id=j.id AND e.dept_id=d.id
* AND e.salary BETWEEN s.losalary AND hisalary; (低到高)
* 区别:
* 隐式内连接要加另外条件的话: SELECT 字段名 FROM 左表, 右表 WHERE 条件 AND 条件 ;
* 显式内连接要加条件的话: SELECT 字段名 FROM 左表 INNER JOIN 右表 ON 条件 WHERE 条件 ;
*
* `外连接: 左外连接 (如果左表未匹配到右表数据,那么右表数据显示为NULL)
* SELECT 字段名 FROM 左表 LEFT OUTER JOIN 右表 ON 条件;
* 例: SELECT * FROM dept LEFT OUTER JOIN emp ON emp.`dept_id`=dept.`id`;
*
* 右外链接 (如果右表未匹配到左表数据,那么左表数据显示为NULL)
* SELECT 字段名 FROM 左表 RIGHT OUTER JOIN 右表 ON 条件;
* 例: SELECT * FROM dept RIGHT OUTER JOIN emp ON emp. dept_id =dept. id ;
*
* (2)子查询: (查询条件, 查询结果, 表) 子查询结果只要是单列 ,肯定在 WHERE 后面作为 条件 子查询结果只要是多列 ,肯定在 FROM 后面作为表
* SELECT 查询字段 FROM 表 WHERE 查询条件;
* 例:SELECT * FROM employee WHERE salary=(SELECT MAX(salary) FROM employee);
* SELECT 查询字段 FROM 表 WHERE 字段=(子查询); (查询结果一个值)
* 例: SELECT * FROM emp WHERE salary=(SELECT MAX(salary) FROM emp);
* SELECT 查询字段 FROM 表 WHERE 字段 IN (子查询); (查询结果单列多行)
* 例:SELECT id FROM dept WHERE NAME IN('开发部','财务部');
* SELECT * FROM emp WHERE dept_id IN (SELECT id FROM dept WHERE NAME IN('开发部','财务部'));
* SELECT 查询字段 FROM (子查询) 表别名 WHERE 条件; (FROM 后面作为表,表需要取别名 "AS"可以省略)
* 例: SELECT * FROM dept d, (SELECT * FROM emp WHERE join_date > '2011‐1‐1') e WHERE e.dept_id = d.id;
*
* 4,事务
* (1)操作事务
* 手动事务 (每一条增删语句都是一个单独的事务 当有多个事务进行操作就需要开启事务)
* start transaction 开启事务 savepoint abc 设置事务回滚点 rollback to abc 回到事务回滚点
* commit 提交事务(会清空事务,不可修改) rollback 回滚事务 (可修改)
* 开启事务 -> 执行SQL语句 ->成功 -> 提交事务 (会对数据库数据的数据进行改变)
* 开启事务 -> 执行SQL语句 ->失败 -> 回滚事务 (会回退到开启事务时的状态)
*
* (2)自动提交事务: 单独的一个事务不需要开启事务回滚 它是提交自动事务
* 修改MySQL全局变量"autocommit",取消自动事务提交
* 0:OFF(关闭自动提交) set autocommit = 0;
* 1:ON(开启自动提交)
* 修改权限: show variables like '%commit%';
* set autocommit = 0; (事务自动提交关闭)
* (3) 事务四大特性:
* 原子性(Atomicity): 事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
* 一致性(Consistency): 事务前后数据的完整性必须保持一致.
* 隔离性(Isolation): 是指多个用户并发访问数据库时,一个用户的事务不能被其它用户的事务所干扰,多个并发事务之间数据要相互隔离,不能相互影响。
* 持久性(Durability): 指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响
* (4) 事务的隔离级别
* a, 脏读: 一个事务读取到了另一个事务中尚未提交的数据
* 不可重复读: 一个事务中两次读取的数据内容不一致,要求的是一个事务中多次读取时数据是一致的,这是事务update时引发的问题
* 幻读: 一个事务中两次读取的数据的数量不一致,要求在一个事务多次读取的数据的数量是一致的,这是insert或delete时引发的问题
* b,四种隔离级别:
* 级别 名字 隔离级别 脏读 不可重读 幻读 数据库默认隔离级别
* --1 读未提交( read uncommitted ) : 是 是 是
* --2 读已提交( read committed ) : 否 是 是 Oracle 和 SQL Serve
* --3 可重复读 ( repeatable read ) : 否 否 是 MySQL
* --4 串行化 ( serializable) : 否 否 否
* c, 事务隔离级别相关命令
* [1]查询事务隔离级别:
* show variables like '%isolation%';
* -- 或
* select @@tx_isolation;
* [2]设置事务隔离级别,需要退出MSQL再进入MYSQL才能看到隔离级别的变化
* set global transaction isolation level 级别字符串;(修改全局的)
* set session transaction isolation level read uncommitted;(修改当次)
* -- 如:
* set global transaction isolation level read uncommitted;
*
* 5, DCL
* (1) 创建用户:
* CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码';
* 例:-- user1用户只能在localhost这个IP登录mysql服务器
* CREATE USER 'user1'@'localhost' IDENTIFIED BY '123';
* -- user2用户可以在任何电脑上登录mysql服务器
* CREATE USER 'user2'@'%' IDENTIFIED BY '123';
* (2) 权限修饰符(SELECT,INSERT,UPDATE等,所有权限用 "ALL") 数据库名.表名: (所有库'*.*' ;所有表 `.*`)
* 授权用户:
* GRANT 权限1, 权限2... ON 数据库名.表名 TO '用户名'@'主机名';
* 例: GRANT CREATE,ALTER,DROP,INSERT,UPDATE,DELETE,SELECT ON test.* TO 'user1'@'localhost';
* 撤销权限
* REVOKE 权限1, 权限2... ON 数据库.表名 FROM '用户名'@'主机名';
* 查看权限:
* SHOW GRANTS FOR '用户名'@'主机名';
* (3) 删除用户
* DROP USER '用户名'@'主机名';
* (4) 修改用户密码
* a,修改管理员密码 ( 需要在未登陆MySQL的情况下操作。)
* mysqladmin -uroot -p password 新密码 -- 新密码不需要加上引号
* b,修改普通用户密码 ( 需要在登陆MySQL的情况下操作。)
* set password for '用户名'@'主机名' = password('新密码');
*
* */
// 888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
/*
MySQL:
│-- bin:mysql相关的可执行文件*.ex
│-- MySQLInstanceConfig.exe mysql的配置程序
│-- data: mysql自带的数据库文件
│-- include: c语言的头文件(不用关注)
│-- lib: 存放mysql使用到的dll动态库(相当于jar包,不用关注)
│-- my.ini mysql的配置文件,配置了mysql的相关信息*/
}
另一位博主也挺全面的学习笔记:https://blog.csdn.net/Guet_Kite/article/details/100538576