在my.ini文件中,我们可以设置各种MySQL的配置,例如字符集、端口号、目录地址等;
主要分为两大部分:客户端配置信息、数据库配置信息
client :配置图形界面的设置
mysql : 配置命令行客户端的设置
mysqld : 配置数据库的设置
修改配置文件后,需关闭数据库服务,然后重启,才能使新的配置文件生效
# CREATE DATABASE 逻辑库名称;
CREATE DATABASE test;
# SHOW DATABASES; 查看有哪些逻辑库 schemes
#DROP DATABASE 逻辑库名称;
DROP DATABASE test;
CREATE TABLE interview.student1student1(
id INT UNSIGNED PRIMARY KEY COMMENT "主键",
name VARCHAR(20) NOT NULL COMMENT "姓名",
age INT unsigned NOT NULL COMMENT "年龄"
)COMMENT "这是一个测试表1";
# 查看test逻辑库下面所有的表
SHOW tables;
# 插入一条数据
INSERT INTO interview.student1 VALUES (1, "小张", "24");
# 查看建表语句 DDL
SHOW CREATE TABLE student1;
#删除学生数据表
DROP TABLE student ;
ALTER TABLE 表名称ADD 列1 数据类型 [约束] [COMMENT 注释],
ADD 列2 数据类型 [约束] [COMMENT 注释],......;
例:
ALTER TABLE student ADD adress VARCHAR(200) NOT NULL,
ADD home_tel CHAR(11) NOT NULL;
ALTER TABLE 表名称 MODIFY 列1 数据类型 [约束] [COMMENT 注释],
MODIFY 列2 数据类型 [约束] [COMMENT 注释],......;
其中"列"是想要修改的字段名
例:
ALTER TABLE studentMODIFY home_tel VARCHAR(20) NOT BULL;
ALTER TABLE 表名称
CHANGE 列1 新列明1 数据类型 [约束] [COMMENT 注释],
CHANGE 列2 新列明2 数据类型 [约束] [COMMENT 注释],
......;
例:
ALTER TABLE student CHANGE address home_address VARCHAR(20) NOT BULL;
ALTER TABLE 表名称 DROP 列1,DROP 列2,......;
**
**
CREATE TABLE t_teacher( id INT PRIMARY KEY AUTO_INCREMENT,......);
CREATE TABLE 表名称(......,INDEX [索引名称](字段),.....);
CREATE TABLE t_message(
id INT UNSIGNED PRIMARY KEY,
content VARCHAR(200) NOT NULL,
type ENUM("公告","通报","个人通知") NOT NULL,
create_time TIMESTAMP NOT NULL,
INDEX id_type (type)
);
CREATE INDEX 索引名称 ON 表名(字段);
ALTER TABLE 表名 ADD INDEX [索引名](字段);
// 展示索引
SHOW INDEX FROM 表名;
// 删除
DROP INDEX 索引名称 ON 表名;
SELECT * FROM t_emp;SELECT empno, ename, sal FROM t_emp;
SELECT empno, sal*12 AS "income"FROM t_emp;
SELECT ... FROM ... LIMIT 起始位置,偏移量;
SELECT empno, ename FROM t_temp LIMIT 0,20;
数据分页的简写用法:
SELECT empno, ename FROM t_emp LIMIT 10;
如果没有设置,查询语句不会对结果集进行排序。也就是说,如果想让结果集按照某种顺序排列,就必须使用ORDER BY子句。
# ASC升序,DESC降序,如果不填,默认为升序。SELECT .... FROM .... ORDER BY 列名 [ ASC | DESC ]; SELECT ename ,sal FROM t_emp ORDER BY sal;
ASC代表升序(默认),DESC代表降序
如果排序是数字类型,数据库就按照数字大小排序,如果是日期类型就按照日期大小排序,如果是字符串就按照字符串集序号排序。
排序字段内容相同的情况,默认会按照主键进行升序排序
多个排序字段:我们可以使用ORDER BY规定首要排序条件和次要排序条件。数据库会先按照首要排序条件排序,如果遇到首要排序内容相同的记录,那么就会启用次要排序条件接着排序,如果所有排序条件都无法满足,最终将默认使用主键升序进行排序。
排序 + 分页
SELECT empno FROM t_emp ORDER BY sal DESC LINIT 0,5;
ORDER BY字句书写的时候放在LIMIT字句的前面
执行顺序:FROM -> SELECT -> ORDER BY -> LIMIT
SELCT DISTINCT 字段 FROM ...;
SELECT DISTINCT job FROM t_emp;
SELECT ... FROM ...WHERE 条件 [AND|OR] 条件 ...;
SELECT empno,ename,sal FROM t_emp WHERE deptno=10 AND sal >= 2000;
SELECT SUM(salary) FROM t_emp;
SELECT SUM(salary) FROM t_emp WHERE deptno IN(10,20);
SELECT MAX(comm) FROM t_emp;// 查询名字最长的是几个字符
SELECT MAX(LENGTH(ename)) FROM t_emp;
SELECT MIN(empno) FROM t_emp;SELECT MIN(hiredate) FROM t_emp;
// 求平均值
SELECT AVG(sal + IFNULL(comm,0) AS avgFROM FROM t_emp;
SELECT COUNT(*) FROM t_emp;
数据操作语言:分组查询
SELECT deptno, ROUND(AVG(sal))FROM t_empGROUP BY deptno;
**
**
逐级分组
SELECT deptno, job, COUNT(*),AVG(sal)FROM t_emp GROUP BY deptno,jobORDER BY deptno;
对SELECT子句的要求:
对分组结果集再次做汇总:
SELECT deptno, COUNT(*),AVG(sal),MAX(sal),MIN(sal)FROM t_empGROUP BY deptno WITH ROLLUP;
GROUP_CONCAT函数:
各种子句的执行顺序:
FROM ——》WHERE——〉GROUP BY——》SELECT——〉ORDER BY——》LIMIT
SELECT deptno, ROUND(AVG(sal))FROM t_empGROUP BY deptno;
SELECT deptno, job, COUNT(*),AVG(sal)
FROM t_emp
GROUP BY deptno,jobORDER
ORDER BY deptno;
SELECT deptno, COUNT(*),AVG(sal),MAX(sal),MIN(sal)
FROM t_empGROUP GROUP BY deptno WITH ROLLUP;
FROM ——》WHERE——〉GROUP BY——》SELECT——〉ORDER BY——》LIMIT
INSERT语句可以向数据表写入记录,可以是一条记录,也可以是多条记录
INSERT INTO 表名(字段1,字段2, … ) VALUES(值1,值2, …);
INSERT INTO 表名(字段1,字段2, … ) VALUES(值1,值2, …),(值1,值2, …),;
INSERT 语句方言:MYSQL的INSERT语句还有一种方言语法
INSERT INTO 表名 SET 字段1=值1,字段2=值2, … ; #关键字INTO可以省略
IGNORE关键字会让INSERT只插入数据库不存在的记录
INSERT [IGNORE] INTO 表名 … ;
IGNORE关键字会忽略主键冲突的记录
UPDATE [IGNORE] 表名
SET 字段1=值1,字段2=值2,......
[WHERE 条件1 ......]
[ORDER BY]
[LIMIT ......];
-表连接的UPDATE语句可以修改多张表的记录
-因为相关子查询效率非常低,所以我们可以利用表连接的方式来改造UPDATE语句
# 方式一
UPDATE 表1 JOIN 表2 ON 条件
SET 字段1=值1,字段2=值2,......;
# 方式二
UPDATE 表1,表2
SET 字段1=值1,字段2=值2,......
WHERE 连接条件;
-UPDATE语句的表连接既可以是内连接,又可以是外连接
UPDATE 表1 [LEFT|RIGHT] JOIN 表2 ON 条件
SET 字段1=值1,字段2=值2,......;
DELECT [IGNORE] FROM 表名
[WHERE 条件1,条件2,......]
[ORDER BY ......]
[LIMIT ......];
DELETE 表1,...... FROM 表1 JOIN 表2 ON 条件
[WHERE 条件1,条件2,......]
[ORDER BY ......]
[LIMIT ......];
DELETE 表1,...... FROM 表1 [LEFT|RIGHT] JOIN 表2 ON 条件 ......;
# 一次只能清空一张数据表
TRUNCATE TABLE 表名;
SELECT LOWER(ename), UPPER(ename),LENGTH(ename),CONCAT(sal, "$"),INSTR(ename, "A")
FROM t_emp;
SELECT ename, DATE_FORMAT(hiredate, "%Y") FROM t_emp;
SELECT DATE_ADD(NOW(), INTERVAL 15 DAY);
SELECT DATE_ADD(NOW(), INTERVAL -300 MINUTE);
条件函数:
IFNULL(表达式,值)
IF(表达式,值1,值2) 【类似三元表达式】
复杂的条件判断可以用条件语句来实现,比IF语句功能更强大
CASE
WHEN 表达式 THEN 值1
WHEN 表达式 THEN 值2
......
ELSE 值N
END
如果数据的写入直接操作数据文件是非常危险的事情;
MySQL总共有5种日志,其中只有redo日志和undo日志与事务有关:
日志文件相当于数据文件的一个副本,SQL语句操作什么样的记录,MySQL就会本这份记录拷贝到undo日志里面,增删改查会记录到redo日志里面,如果这些操作没有问题,最后把redo和数据文件做一下同步就可以了,即使出现了死机等情况,重启mysql之后继续完成redo和数据文件的同步就可以了,同步之后修改的数据就真正写到数据文件里面了,抵抗意外事故的能力就变强了。
事务的原子性:一个事务中的所有操作要么全部完成,要么全部失败。事务执行后不允许停留在中间某个状态;
事务的一致性:不管在任何给定的时间、并发事务有多少,事务必须保证运行结果的一致性;
事务的隔离性:隔离性要求事务不受其他并发事务的影响,如同在给定的时间,该事务是数据库唯一运行的事务。默认情况下A事务,只能看到日志中该事务的相关数据。
事务的持久性:事务一旦提交,结果便是永久性的。即便发生宕机,仍然可以依靠事务日志完成数据的持久化。
默认情况下,mysql是不允许读取临时数据的,但是在某些场合下,需要运行事务读取某些临时数据,这个就必须修改事务的隔离级别。
业务案例1火车售票场景:READ UNCOMMITED 代表可以读取其他事务未提交的数据
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITED;
业务案例2银行转账:READ COMMITTED 读取已提交的数据
业务案例3用户购买,商家涨价:REPEATABLE READ 代表事务在执行中反复读取数据,得到的结果是一致的,不会受其他事务影响
事务的序列化
由于事务并发执行所带来的各种问题,前三种隔离级别只适用在某些业务场景中,但是序列化的隔离性,让事务逐一执行,就不会产生上述问题了。
这种隔离牺牲了事务的并发性,前面的事务没有提交,后面的事务就会进入等待,直到前面的事务提交完成了才会开始执行下一个事务,很少使用
SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;