理论:
什么是数据库:
数据库就是存放数据的仓库,是为了实现一定目的,按照某种规律组织起来的数据的集合
MySQL的优势:
运行速度快。MySQL体积小,命令执行速度快,移植性强。
SQL的含义
结构化查询语言。经过多年的发展已成为关系数据库的标准语言
主键有什么用
主键索引要求主键中的每一个值都是非空,唯一的
多表连接查询的分类
多表连接查询的分类实际上是更具各表之间共同列的光联性来查询数据的
连接查询的分类
连接查询方式:内连接查询,外连接查询。
视图是什么
试图是基于SQL语句的结果集的可视化表,是一个虚拟表
实践:
-
MySQL数据库的基本操作
创建数据库
CREATE DATABASE 数据库名;
查看数据库列表
SHOW DATABASES;
选择数据库
use 数据库
删除数据库
DROP DATABASE 数据库名;
-
添加表数据类型
学生表
CREATE TABLE 表名 ([字段]) --创建表
参考👇
CREATE TABKE `student`(
`studentNo` INT(4) NOT NULL COMMENT ' 学号 ' PRIMARY KEY ,
#NOT NULL 非空 COMMENT 备注 PRIMARY KEY 非空主键
`studentName` VARCHAR(50) NOT NULL COMMENT '学生姓名 ',
# VARCHAR(50) 长度为50的字符型
`sex` CHAR(2) DEFAULT `男` NOT NULL COMMENT '性别'
# DEFAULT 设置默认值
`birthday` DATETIME COMMENT '出生日期',
# DATETIME 时间类型
`identityCard` VARCHAR(18) UNIQUE KEY COMMENT '身份证',
# UNIQUE KEY 唯一,不重复
)COMMENT="学生表";
课程表
- DROP TABLE IF EXISTS subject; -- 删除subject表以免运行时报已存在错误
- AUTO_TNCREMENT; -- 自增加
- SHOW TABLES; -- 查看库中的表
- DESCRIBE subject; -- 查看表中的数据结构
- PRIMARY KEY(字段名) -- 设置主键
成绩表
NOW() --获取当前日期
使用SQL语句修改表结构
修改表名
ALTER TABLE uses RENAME uses1;
添加字段
ALTER TABLE result ADD `studentData` VarcHAR(32) NOT NULL;
修改字段名
ALTER TABLE result CHANGE `studentData` `studentData1` CHAR(10) NOT NULL;
删除字段
ALRER TABLE result DROP studentName;
复制表:
复制结构和数据
CREATE TABLE student2 SELECT * FROM student;
仅复制表结构
CREATE TABLE student2 SELECT * FROM student WHERE FALSE;
将查询后的结果插入到新表中
CREATE TABLE subject1 (SELECT `studentName`,`phone` FROM `student`);
CREATE TABLE subject1 SELECT `studentName`,`phone` FROM `student`
WHERE studentNo = 10001; -- 判断学号为10001的
-- 可加入条件 只插入满足条件的列
增
添加表数据
INSERT INTO subject (`subjectName`,`classHour`,`gradeId`)
VALUES
('logic Java',220,1),
('HTML',220,1),
('Java OPP',220,1)
-- 填入添加的数据,按照顺序
删除
删除表数据
DELETE FROM student3 WHERE birthday > '1997-01-02';
修改
UPDATE student SET studentName = '郭晓静' WHERE studentName = '郭靖';
-- 不添加判断,代表更改所有该字段内容
now() -- 当前日期
UPDATE student SET sex = YEAR(now()-YEAR(birthday))
修改表内容
UPDATE student SET
address = '西直门东大街2215号',
loginPwd = '000',
studentNo = studentNo - 1
WHERE studentNo = 20000 AND sex='男'; --and表示并且
-- 将学号为20000并且为性别男,地址密码修改,学号-1
查询
SELECT * FROM `student` WHERE gradeID=1; -- 查询年级为1的所有学生信息
如果查询为空的在判断填入 WHERE id is null;
-
排序
ORDER BY (列) --默认为升序排序
ORDER BY (列) DESC; --降序排序
可以看出这个是什么意思吗👇
-
函数
birthday代表日期字段
MONTH(birthday) = 1 -- 月份为1
DAY(birthday) =16 --天数为16
MAX() --最大值
MIN() --最小值
AVG() --平均值
SUBBSTRING(phone,1,3) -- 取前三位
COUNT(*)计数
-
LIMIT字句
[LIMIT [位置偏移量],行数]
LIMIT 5; -- 查询前5条记录
偏移值从0开始
LIMIT 1,5; -- 从第二行开始取6行记录
-
LIKE模糊查询
[字段名] LIKE 'C_' --包含单个字符 如 Cs Ca
[字段名] LIKE 'C%' --包含任意长度的字符 如 Csasd CaweAd
[字段名] LIKE 'Cs[1-9]' --指定范围字符 如 Cs1 Cs6
[字段名] LIKE 'Cs[^1-5]' --不包括指定范围字符 如 Cs6 Cs7 符合
-
IN 列举类查询
IN(1,2,3) 类似成员,须存在已有成员
-
BTWEEN范围内进行查询
WHERE birthday BERWEEN `1990-1-1` and '1993-12-31'; --日期1990-1-1到1993-12-31内
-
GROUP BY分组查询
将指定字段进行分组
- 查询每个年级的总学时数,并按照升序排序
看懂了吗👆 其实就是分组,再进行的同组求和😀
HAVING 分组判断 -- 用于已经分好组后再进行组内判断
2. 查询参加考试的学生中平均成绩及格的学生记录,并按照成绩降序排序
ps:↑首先要把考试的学生进行分组,再求各组的平均成绩是否及格。
连接查询
通常我们用到多个表是会使用连接查询
JOIN关键字 进行表之间的连接
ON关键字指定字段连接
👆将两个表的课程编号连接了起来,再进行要求输出
其实也可以理解为将相同的进行筛选,相同则保留,当然也得先看WHERE条件
三表连接
-- 查询学号,姓名,课程名称,成绩
SELECT s.studentNo,s.studentName,subjectName,r.studentResult
FROM student as s
-- 连接学生表和成绩表 因为两表中有共同字段‘学号’
JOIN result as r ON s.studentNo = r.studentNo
-- 继续连接 这代表成绩表和课程表连接 共同字段为‘课程编号’
JOIN `subject` as sj ON r.subjectNo = sj.subjectNo
-- 这个是多余的 我进行了以成绩降序排序
ORDER BY r.studentResult DESC;
跟之前相同只是多连接了一个而已
视图
创建视图
视图名一般以view_xxx 或者v_xxx 命名
CREATE VIEW 视图名 ( 别名1, 别名2 ,别名3) --别名代表更改列的名字
AS
<SELECT 语句>
以前查询都是一个临时查看的过程,试图是将直接保存为一个新了表中,方便以后进行查看,更改。
↓ DROP VIEW IF EXISTS view_stu;先将视图删除,防止运行第二遍的时候报已存在的错误