MySQL知识点梳理以及基本语句操作

1、开启和关闭

  使用管理员身份打开cmd,输入以下命令:

net start mysql # 开启MySQL
net stop mysql # 关闭MySQL

2、连接

mysql -u root -p # 连接mysql并要求输入密码

3、对数据库操作

  • 显示数据库
SHOW DATABASES; # 显示数据库
  • 创建数据库
CREATE DATABASE 数据库名; # 创建
CREATE DATABASE IF NOT EXISTS 数据库名; # 如果**数据库不存在,则创建新数据库
  • 删除数据库
DROP DATABASE 数据库名; # 删除
DROP DATABASE IF NOT EXISTS 数据库名; # 如果**数据库存在,则删除该数据库
  • 选择数据库
USE 数据库名; # 选着操作的数据库对象

4、对数据库中表操作

  • 创建数据库中表
# 方式一:
USE 数据库名;
CREATE TABLE 表名 (字段名 类型 [属性],
				   字段名 类型 [属性],
				   ...
				   字段名 类型 [属性]);
# 方式二:
CREATE TABLE 数据库名.表名 [(...)];
  • 修改数据库中表
# 方式一:
ALTER TABLE 表名 RENAME AS 新表名; # 修改表名
ALTER TABLE 表名 ADD 字段名 数据类型; # 增加表的字段
ALTER TABLE 表名 MODIFY 字段名 数据类型; # 修改约束
ALTER TABLE 表名 CHANGE 字段名 新字段名 新字段名数据类型; # 字段重命名
ALTER TABLE 表名 DROP 字段名; -- 删除表中字段
  • 删除数据库中表
DROP TABLE 数据库名.表名; # 操作和以上创建类似

5、对数据库表中数据操作

  • 添加数据
INSERT INTO 表名 (字段名1, 字段名2, ...字段名N)
VALUES( 数值1, 数值2, ...数值N);
  • 删除数据
DELETE FROM 表名 [WHERE 选择操作对象]
-- 区分以下操作:
DELETE FROM 表名; # 清除表中数据,包括表的结构和索引约
TRUNCATE 表名; # 清空表中数据,但表的结构和索引约束不变
DROP DATABASE 表名; # 删除整张表
  • 修改数据
UPDATE 表名 SET [字段名1 = 数值1, ..., 字段名N = 数值N]
[WHERE 选择操作对象];
  • 查找数据
SELECT * FROM 表名; # 查询整张表

SELECT [DISTINCT] 字段名1 [AS 重命名], ..., 字段名N [AS 重命名] # DISTINCT 去重操作
FROM 表名
[WHERE 选择操作对象]
[LIMIT 起始下标][ OFFSET 偏移量];

-- 模糊查询、连表查询和子查询等见后面附录

6、事务与注入

  事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。比如:张三利用网上转账给李四转了500银两,只可能出现两种情况,要么转账成功,那么转账失败。不可能存在张三转过去,而李四没收到;或者张三没转过去,而李四收到money,这两种情况对开发业务是不可取的。模拟场景如下代码所示。
  事务的4个条件::原子性、一致性、隔离性、持久性。
  MySQL 事务处理主要有两种方法:

  1. 用 BEGIN, ROLLBACK, COMMIT来实现
  • BEGIN : 开始一个事务
  • ROLLBACK : 事务回滚
  • COMMIT : 事务确认
  1. 直接用 SET 来改变 MySQL 的自动提交模式
  • SET AUTOCOMMIT=0 : 禁止自动提交
  • SET AUTOCOMMIT=1 : 开启自动提交
CREATE TABLE account(
    id    INT PRIMARY KEY AUTO_INCREMENT,
    `name`  VARCHAR(40),
    money FLOAT
);
INSERT INTO account(NAME, money)
VALUES ('A', 1000),('B', 1000),('C', 1000);
# 模拟转账
SET autocommit = 0; # 关闭自动提交
START TRANSACTION; # 开启一个事务
UPDATE account SET money = money - 500 WHERE `name` = 'A';
UPDATE `account` SET money = money + 500 WHERE `name` = 'B';
COMMIT; # 提交事务,就被持久化
ROLLBACK;
SET autocommit = 1; # 开启自动提交,恢复原来设置

  所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。

7、基本语句操作实例

-- 查询  SELECT 字段 FROM 表
SELECT * FROM `student`;
SELECT `studentno` AS 学号, `studentname` AS 学生名字 FROM student;
SELECT CONCAT('姓名:', `studentname`) AS 新名字 FROM student; # CONCAT 连接字符串
SELECT * FROM `result`;
SELECT DISTINCT `studentno` FROM `result`; # DISTINCT 去重操作
SELECT `studentno`, `studentresult` FROM result
WHERE `studentresult` >= 70 AND `studentresult` <= 100;
SELECT `studentno`, `studentresult` FROM result
WHERE `studentresult` BETWEEN 70 AND 100;
SELECT `studentno`, `subjectno`, `studentresult` FROM result
WHERE `subjectno` != 2;
SELECT `studentno`, `subjectno`, `studentresult` FROM result
WHERE NOT `subjectno` = 2;

-- 模糊查询
SELECT * FROM `subject`;
SELECT `subjectname` AS 课程 FROM `subject`
WHERE `subjectname` LIKE '数%';
SELECT `subjectno`, `subjectname` FROM `subject`
WHERE `subjectname` LIKE '_#基础';
SELECT `subjectname` FROM `subject`
WHERE `subjectname` LIKE '%数学%';
SELECT `subjectname`, `gradeid` FROM `subject`
WHERE `gradeid` IN (2,3);
SELECT * FROM `student`;
SELECT `studentno`, `studentname`, `address` FROM `student`
WHERE `address` IS NOT NULL;
SELECT `studentno`, `studentname`, `address` FROM `student`
WHERE `address` IS NULL;

-- 连表查询
SELECT * FROM `student`;
SELECT * FROM `result`;
SELECT * FROM `subject`;
# INNER JOIN
SELECT stu.studentno, studentname, `studentresult`
FROM student AS stu
INNER JOIN `result` AS res
ON stu.studentno = res.`studentno`;
# RIGHT JOIN
SELECT stu.studentno, studentname, `studentresult`
FROM student AS stu
RIGHT JOIN `result` AS res
ON stu.studentno = res.studentno;
# LEFT JOIN
SELECT stu.studentno, studentname, `studentresult`
FROM student AS stu
LEFT JOIN `result` AS res
ON stu.studentno = res.studentno;
SELECT stu.studentno, studentname, `studentresult`
FROM student AS stu
LEFT JOIN `result` AS res
ON stu.studentno = res.studentno
WHERE `studentresult` IS NULL;
SELECT stu.studentno, studentname, subjectname, studentresult
FROM result AS res
LEFT JOIN student AS stu
ON stu.studentno = res.`studentno`
INNER JOIN `subject` AS sub
ON res.`subjectno` = sub.`subjectno`;
# 自连接
SELECT * FROM category;
SELECT a.`categoryname` AS '父栏目', b.`categoryname` AS '子栏目'
FROM `category` AS a, `category` AS b 
WHERE a.`categoryid` = b.`pid`;

-- 排序
SELECT * FROM `result`;
SELECT stu.`studentno`, `studentname`, `studentresult`
FROM `student` AS stu
INNER JOIN `result` AS res
ON stu.`studentno` = res.`studentno`
ORDER BY `studentresult` DESC; # ASC——升序 DESC——降序

-- 分页
SELECT * FROM `subject`
LIMIT 5,3; # 语法:LIMIT 起始下标, 页面大小

-- 子查询
# 查询课程为“高等数学-2”且分数不低于60的同学学号和姓名
# 方式一:连接查询
SELECT stu.`studentno`, `studentname`
FROM `student` stu
INNER JOIN `result` res
ON stu.`studentno` = res.`studentno`
INNER JOIN `subject` sub
ON res.`subjectno` = sub.`subjectno`
WHERE `subjectname` = '高等数学-2' AND `studentresult` >= 60;
# 方式二:子查询
SELECT `studentno`, `studentname`
FROM `student`
WHERE studentno IN (
	SELECT `studentno` FROM `result`
	WHERE `studentresult` >= 60 AND `subjectno` = (
		SELECT `subjectno` FROM `subject`
		WHERE `subjectname` = '高等数学-2'
	)
);
# 方式三:连接查询和子查询混合使用
SELECT stu.`studentno`, `studentname`
FROM `student` stu
INNER JOIN `result` res
ON stu.`studentno` = res.`studentno`
WHERE `studentresult` >= 60 AND `subjectno` IN (
	SELECT `subjectno` FROM `subject`
	WHERE `subjectname` = '高等数学-2'
);

-- 分组和过滤
SELECT `subjectname`, AVG(studentresult) AS 平均分, MAX(studentresult) AS 最高分, MIN(studentresult) AS 最低分
FROM result res
INNER JOIN `subject` sub
ON res.`subjectno` = sub.`subjectno`
GROUP BY res.`subjectno`
HAVING AVG(studentresult) >= 60;