目录
一、MySql概述
1、安装
想要在电脑上使用MySql,就得安装MySql,实际上MySql属于数据库的一种,并且MySQL 是目前最流行的开源的、免费的关系型数据库,适用于中小型甚至大型互联网应用,能够在windows 和 linux 平台上部署。
2、一般使用法
mysql - h MySQL 数据库服务器的 IP 地址 - u 用户名 - p
然后按下回车键,输入密码即可。
3、便利工具
鉴于后续开发少不了MySql的使用,如果一直用电脑命令端的话,效率和观感都有所亏损,所以决定使用工具,在这推荐Navicat 或IDEA,在之后的开发中我就偏向于使用IDEA。
4、SQL语言
简介
分类
总结
二、DDL学习
1、介绍
2、数据库的语法
创建
CREATE DATABASE [ IF NOT EXISTS ] 数据库名称 DEFAULT CHARACTER SET 字符集 COLLATE 排序规则;
示例:创建数据库lesson,并指定字符集为 GBK ,排序规则为 GBK_CHINESE_CI
CREATE DATABASE IF NOT EXISTS lesson DEFAULT CHARACTER SET GBK COLLATE
GBK_CHINESE_CI;
修改
ALTER DATABASE 数据库名称 CHARACTER SET 字符集 COLLATE 排序规则;
示例:修改数据库lesson的字符集为 UTF8 ,排序规则为 UTF8_GENERAL_CI
ALTER DATABASE lesson CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI;
删除
DROP DATABASE [IF EXISTS] 数据库名称;
示例:删除数据库lesson
DROP DATABASE IF EXISTS l;
查看
SHOW DATABASES;
使用
USE 数据库名称;
总结
3、 数据表类型
数据表类型
MyISAM 与 InnoDB 的区别

数据行锁定:一行数据,当一个用户在修改该数据时,可以直接将该条数据锁定。
创建数据表
CREATE TABLE [IF NOT EXISTS] 数据表名称(
字段名1 列类型(长度) [修饰属性] [键/索引] [注释],
字段名2 列类型(长度) [修饰属性] [键/索引] [注释],
字段名3 列类型(长度) [修饰属性] [键/索引] [注释],
......
字段名n 列类型(长度) [修饰属性] [键/索引] [注释]
) [ENGINE = 数据表类型][CHARSET=字符集编码] [COMMENT=注释];
示例:创建学生表,表中有字段学号、姓名、性别、年龄和成绩
CREATE TABLE IF NOT EXISTS student(
`number` VARCHAR(30) NOT NULL PRIMARY KEY COMMENT '学号,主键',
name VARCHAR(30) NOT NULL COMMENT '姓名',
sex TINYINT(1) UNSIGNED DEFAULT 0 COMMENT '性别:0-男 1-女 2-其他',
age TINYINT(3) UNSIGNED DEFAULT 0 COMMENT '年龄',
score DOUBLE(5, 2) UNSIGNED COMMENT '成绩'
)ENGINE=InnoDB CHARSET=UTF8 COMMENT='学生表';
修改数据表
修改表名
ALTER TABLE 表名 RENAME AS 新表名;
示例:将student表名称修改为 stu
ALTER TABLE student RENAME AS stu;
增加字段
ALTER TABLE 表名 ADD 字段名 列类型(长度) [修饰属性] [键/索引] [注释];
示例:在 stu 表中添加字段联系电话(phone),类型为字符串,长度为11,非空
ALTER TABLE stu ADD phone VARCHAR(11) NOT NULL COMMENT '联系电话';
查看表结构
DESC 表名; -- 查看表结构
修改字段
-- MODIFY 只能修改字段的修饰属性
ALTER TABLE 表名 MODIFY 字段名 列类型(长度) [修饰属性] [键/索引] [注释];
-- CHANGE 可以修改字段的名字以及修饰属性
ALTER TABLE 表名 CHANGE 字段名 新字段名 列类型(长度) [修饰属性] [键/索引] [注释];
ALTER TABLE stu MODIFY sex VARCHAR(2) DEFAULT '男' COMMENT '性别:男,女,其他';
示例:将 stu 表中 phone 字段修改为 mobile ,属性保持不变
ALTER TABLE stu CHANGE phone mobile VARCHAR(11) NOT NULL COMMENT '联系电话';
删除字段
ALTER TABLE 表名 DROP 字段名;
删除数据表
DROP TABLE [IF EXISTS] 表名;
4、列类型
数值类型

日期时间类型
字符串类型
列类型修饰属性
三、DML学习
1、介绍
2、insert语句
-- 需要注意,VALUES后的字段值必须与表名后的字段名一一对应
INSERT INTO 表名(字段名1, 字段名2, ..., 字段名n) VALUES(字段值1, 字段值2, ..., 字段值
n);
-- 需要注意,VALUES后的字段值必须与创建表时的字段顺序保持一一对应
INSERT INTO 表名 VALUES(字段值1, 字段值2, ..., 字段值n);
-- 一次性插入多条数据
INSERT INTO 表名(字段名1, 字段名2, ..., 字段名n) VALUES(字段值1, 字段值2, ..., 字段值
n),(字段值1, 字段值2, ..., 字段值n), ... , (字段值1, 字段值2, ..., 字段值n);
INSERT INTO 表名 VALUES(字段值1, 字段值2, ..., 字段值n), (字段值1, 字段值2, ..., 字段值
n), ..., (字段值1, 字段值2, ..., 字段值n);
INSERT INTO course(`number`, name, score, `time`) VALUES (1, 'Java基础', 4, 40);
INSERT INTO course VALUES (2, '数据库', 3, 20);
INSERT INTO course(`number`, score, name, `time`) VALUES (3, 5, 'Jsp', 40);
INSERT INTO course(`number`, name, score, `time`) VALUES (4, 'Spring', 4, 5),(5,
'Spring Mvc', 2, 5);
INSERT INTO course VALUES (6, 'SSM', 2, 3), (7, 'Spring Boot', 2, 2);
3、update语句
UPDATE 表名 SET 字段名1=字段值1[,字段名2=字段值2, ..., 字段名n=字段值n] [WHERE 修改条件];
UPDATE course SET score=4, `time`=15 WHERE name='数据库';
4、delete语句
DELETE FROM 表名 [WHERE 删除条件];
DELETE FROM course WHERE `number`=1;
5、TRUNCATE语句
-- 清空表中数据
TRUNCATE [TABLE] 表名;
TRUNCATE course;
6、DELETE与TRUNCATE区别
DELETE语句根据条件删除表中数据,而TRUNCATE语句则是将表中数据全部清空;如果DELETE语句要删除表中所有数据,那么在效率上要低于TRUNCATE语句。
如果表中有自增长列,TRUNCATE语句会重置自增长的计数器,但DELETE语句不会。
TRUNCATE语句执行后,数据无法恢复,而DELETE语句执行后,可以使用事务回滚进行恢复。
四、DQL语句
1、介绍
2、基本查询
SELECT ALL/DISTINCT * | 字段名1 AS 别名1[,字段名1 AS 别名1, ..., 字段名n AS 别名n]
FROM 表名 WHERE 查询条件
示例: 从课程表中查询课程编号小于5的课程名称
SELECT name FROM course WHERE `number`<5;
示例:从课程表中查询课程名称为"Java基础"的学分和学时
SELECT score, `time` FROM course WHERE name='Java基础';
3、条件查询
WHERE time > 20 && time < 40; <=> WHERE time > 20 and time <40;
示例:从课程表查询课程名为NULL的课程信息
SELECT * FROM course WHERE name IS NULL;
示例:从课程表查询课程名不为NULL的课程信息
SELECT * FROM course WHERE name IS NOT NULL;
示例:从课程表查询学分在2~4之间的课程信息
SELECT * FROM course WHERE score BETWEEN 2 AND 4;
示例:从课程表查询课程名包含"V"的课程信息
SELECT * FROM course WHERE name LIKE '%v%';
示例:从课程表查询课程名以"J"开头的课程信息
SELECT * FROM course WHERE name LIKE 'J%';
示例:从课程表查询课程名以"p"结尾的课程信息
SELECT * FROM course WHERE name LIKE '%p';
示例:从课程表查询课程编号为1,3,5的课程信息
SELECT * FROM course WHERE `number` IN (1, 3, 5);
4、分组查询
SELECT ALL/DISTINCT * | 字段名1 AS 别名1[,字段名1 AS 别名1, ..., 字段名n AS 别名n]
FROM 表名 WHERE 查询条件 GROUP BY 字段名1,字段名2,..., 字段名n;
SELECT * FROM student WHERE score>80 GROUP BY sex;
示例:从学生表查询成绩在60~80之间的学生信息并按性别和年龄分组
SELECT * FROM student WHERE score BETWEEN 60 AND 80 GROUP BY sex, age;
5、聚合函数
COUNT() :统计满足条件的数据总条数
示例:从学生表查询成绩在80分以上的学生人数
SELECT COUNT(*) total FROM student WHERE score>80;
SELECT COUNT(*) totalCount, SUM(score) totalScore FROM student WHERE
score<60;
SELECT sex, AVG(score) avgScore FROM student GROUP BY sex;
SELECT MAX(age) FROM student;
SELECT MIN(score) FROM student;
6、分组查询结果筛选
SELECT ALL/DISTINCT * | 字段名1 AS 别名1[,字段名1 AS 别名1, ..., 字段名n AS 别名n]
FROM 表名 WHERE 查询条件 GROUP BY 字段名1,字段名2,..., 字段名n HAVING 筛选条件;
示例:从学生表查询年龄在20~30之间的学生信息并按性别分组,找出组内平均分在74分以上的组
SELECT * FROM student WHERE age BETWEEN 20 AND 30 GROUP BY sex HAVING
avg(score)>74;
7、排序查询
SELECT ALL/DISTINCT * | 字段名1 AS 别名1[,字段名1 AS 别名1, ..., 字段名n AS 别名n]
FROM 表名 WHERE 查询条件 ORDER BY 字段名1 ASC|DESC,字段名2 ASC|DESC,..., 字段名n ASC|DESC;
SELECT * FROM student WHERE age BETWEEN 18 AND 30 ORDER BY score DESC, age ASC;
8、分页查询
SELECT ALL/DISTINCT * | 字段名1 AS 别名1[,字段名1 AS 别名1, ..., 字段名n AS 别名n]
FROM 表名 WHERE 查询条件 LIMIT 偏移量, 查询条数;
SELECT * FROM student WHERE score>=60 LIMIT 3, 3;
五、多表关系
1、主外键关联关系

DROP TABLE IF EXISTS cls;
CREATE TABLE cls(
number INT(11) AUTO_INCREMENT NOT NULL PRIMARY KEY COMMENT '班级编号,主键',
name VARCHAR(20) NOT NULL COMMENT '班级名称',
grade VARCHAR(20) NOT NULL COMMENT '年级'
)ENGINE=InnoDB CHARSET=UTF8 COMMENT='班级表';
DROP TABLE IF EXISTS student;
CREATE TABLE student(
number BIGINT(20) AUTO_INCREMENT NOT NULL COMMENT '学号,主键',
name VARCHAR(20) NOT NULL COMMENT '姓名',
sex VARCHAR(2) DEFAULT '男' COMMENT '性别',
age TINYINT(3) DEFAULT 0 COMMENT '年龄',
cls_number INT(11) NOT NULL COMMENT '所属班级',
PRIMARY KEY(number),
-- 字段cls_number与cls表中的number字段相关联
FOREIGN KEY(cls_number) REFERENCES cls(number)
)ENGINE=InnoDB CHARSET=UTF8 COMMENT='学生表';
上面的参考代码就展现了一个主外键定义。
注意
2、约束
主键约束
-- 添加主键约束:保证数据的唯一性
ALTER TABLE 表名 ADD PRIMARY KEY(字段名1,字段名2, ..., 字段名n)
-- 删除主键约束
ALTER TABLE 表名 DROP PRIMARY KEY;
外键约束
-- 添加外键约束
ALTER TABLE 表名1 ADD CONSTRAINT 外键名称 FOREIGN KEY(表名1的字段名) REFERENCES 表名
2(表名2的字段名);
-- 删除外键约束
ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;
唯一约束
-- 为字段添加唯一约束
ALTER TABLE 表名 ADD CONSTRAINT 约束名称 UNIQUE(字段名1, 字段名2, ..., 字段名n);
-- 删除字段的唯一约束
ALTER TABLE 表名 DROP KEY 约束名称;
非空约束
-- 为字段添加非空约束
ALTER TABLE 表名 MODIFY 字段名 列类型 NOT NULL;
-- 删除字段非空约束
ALTER TABLE 表名 MODIFY 字段名 列类型 NULL;
默认值约束
-- 为字段添加默认值
ALTER TABLE 表名 ALTER 字段名 SET DEFAULT 默认值;
-- 删除字段的默认值
ALTER TABLE 表名 ALTER 字段名 DROP DEFAULT;
自增约束
-- 为字段添加自增约束
ALTER TABLE 表名 MODIFY 字段名 列类型 AUTO_INCREMENT;
-- 为字段删除自增约束
ALTER TABLE 表名 MODIFY 字段名 列类型;
注意:这里展示的仅是约束的部分内容,如果想要深度了解,就得去多搜索了。
六、索引
1、介绍
2、作用
3、类型
4、索引的创建、查看、删除
-- 创建索引
ALTER TABLE 表名 ADD INDEX 索引名称 (字段名1, 字段名2, ..., 字段名n);
-- 创建全文索引
ALTER TABLE 表名 ADD FULLTEXT 索引名称 (字段名1, 字段名2, ..., 字段名n);
-- 查看索引
SHOW INDEX FROM 表名;
-- 删除索引
ALTER TABLE 表名 DROP INDEX 索引名称;
5、使用索引时的注意事项
七、多表查询
1、笛卡尔积

2、内连接
SELECT 字段名1, 字段名2, ..., 字段名n FROM 表1 [INNER] JOIN 表2 [ON 连接条件];
SELECT 字段名1, 字段名2, ..., 字段名n FROM 表1, 表2 [WHERE 关联条件 AND 查询条件];
示例:
SELECT COUNT(*) FROM stu INNER JOIN score ON stu.id=score.stu_id;
SELECT COUNT(*) FROM stu, score WHERE stu.id=score.stu_id;
3、外连接
4、左外连接
SELECT 字段名1, 字段名2, ..., 字段名n FROM 主表 LEFT JOIN 从表 [ON 连接条件];
示例:
SELECT * FROM stu a LEFT JOIN score b ON a.id=b.stu_id WHERE score IS NULL;
5、右外连接
SELECT 字段名1, 字段名2, ..., 字段名n FROM 从表 RIGHT JOIN 主表 [ON 连接条件];
示例:
SELECT * FROM stu a RIGHT JOIN score b ON a.id=b.stu_id;
八、子查询
1、介绍
2、SELECT ... FROM之间
SELECTid,`name` ,( SELECT text FROM dict WHERE type = 'sex' AND value = sex ) sex,birthday,classFROMstu;
3、 FROM ... WHERE 之间
SELECT c. * , d. * FROM stu cINNER JOINscore d ON c .id = d .stu_idINNER JOIN( SELECTTIMESTAMPDIFF ( YEAR , a .birthday ,NOW ()) age,b .scoreFROM stu a INNER JOIN score b ON a .id = b .stu_idWHERE a .name = ' 汤辰宇 'AND b .course = 'Java' ) eON TIMESTAMPDIFF ( YEAR , c .birthday ,NOW ()) = e .age AND d .score = e .scoreWHERE d .course = 'Java' ;
4、 WHERE 之后
查询Java成绩最高的学生信息
SELECT a. * , b. * FROM stu a INNER JOIN score b ON a .id = b .stu_idWHERE b .score = ( SELECT MAX ( score ) FROM score WHERE course = 'Java' )AND b .course = 'Java' ;
九、事务
1、介绍
2、事务的特性( ACID)


十、常用函数
1、常用数学函数

2、常用字符串函数

SELECT LEFT(class, 2), COUNT(*) FROM stu GROUP BY LEFT(class, 2);
查询名字有4个字的学生信息
SELECT * FROM stu WHERE CHAR_LENGTH(`name`)=4;
查询成绩能够被10整除的考试信息
SELECT * FROM score WHERE MOD(score, 10)=0;
3、日期和时间函数
SELECT * FROM stu WHERE TIMESTAMPDIFF(YEAR, birthday, NOW()) > 20;
查询今天过生日的学生信息
SELECT * FROM stu WHERE MONTH(birthday)=MONTH(NOW()) AND DAYOFMONTH(birthday)=DAYOFMONTH(NOW());
查询本周过生日的学生信息
SELECT * FROM stu WHERE RIGHT(birthday, 5) > RIGHT(DATE_FORMAT(ADDDATE(NOW(), -DAYOFWEEK(NOW())), '%Y-%m-%d'), 5) AND RIGHT(birthday, 5) <=
RIGHT(DATE_FORMAT(ADDDATE(NOW(),7-DAYOFMONTH(NOW())), '%Y-%m-%d'), 5);
十一、条件判断函数
1、IF(条件, 表达式1, 表达式2)
SELECT id,stu_name,course, IF(score>=60, '及格','不及格') score FROM score;
2、 CASE WHEN
语法
CASE WHEN 条件1 THEN 表达式1 [WHEN 条件2 THEN 表达式2 ...] ELSE 表达式n END;
示例
SELECT (CASE WHEN (course = 'Java') THEN score ELSE 0 END) Java FROM score;
行转列:查询每位学生的各课程成绩
SELECT
stu_name,
course,
MAX(CASE WHEN (course = 'Java') THEN score ELSE 0 END) Java,
MAX(CASE WHEN (course = 'Html') THEN score ELSE 0 END) Html,
MAX(CASE WHEN (course = 'Jsp') THEN score ELSE 0 END) Jsp,
MAX(CASE WHEN (course = 'Spring') THEN score ELSE 0 END) Spring
FROM score
GROUP BY stu_name;
3、 CASE ... WHEN语句
CASE 表达式 WHEN 值1 THEN 表达式1 [WHEN 值2 THEN 表达式2 ...] ELSE 表达式n END;
示例
SELECT (CASE course WHEN 'Java' THEN score ELSE 0 END) Java FROM score;
行转列:查询每位学生的各课程成绩
SELECT
stu_name,
course,
MAX(CASE course WHEN 'Java' THEN score ELSE 0 END) Java,
MAX(CASE course WHEN 'Html' THEN score ELSE 0 END) Html,
MAX(CASE course WHEN 'Jsp' THEN score ELSE 0 END) Jsp,
MAX(CASE course WHEN 'Spring' THEN score ELSE 0 END) Spring
FROM score
GROUP BY stu_name;
十二、其他函数
1、数字格式化函数
2、系统信息函数
