MySql学习笔记(一)4.12 - 4.15

MySql学习笔记

笔记内容学习来自B站狂神说java,狂神小迷弟一枚

课程链接: 快来点我,支持狂神.

1. 初识MySql

javeEE: 企业级java开发 Web

前端:页面展示,数据

后端:连接点,连接数据库JDBC,链接前端(控制,控制试图跳转,和给前端传递数据)

数据库:存数据,txt,excel,word

除了基础写代码+学好数据库+操作系统+数据结构和算法=不错的程序猿

再+408+编译原理+实战经验 = 高级程序员

1.1 为什么学习数据库

  1. 岗位需求

  2. mysql处理小型数据,得数据库者的天下

  3. 被迫需求:存数据

  4. 数据库是所有软件体系中最核心的存在 DBA (数据库管理员)

1.2 什么是数据库

  • 数据库(DB DataBase)
  • 概念:数据仓库,软件,安装在操作系统(windows,Liunx,mac)之上,可以存储大量数据500w以下
  • 作用:存储数据,管理数据

1.3数据库分类

关系型数据库

  • MySql,Oracle,Sql Server
  • 通过表和表之间,行和列之间的关系进行数据存储。

非关系型数据库 : {key:value}

  • Redis,MongDB
  • 非关系型数据库,对象存储,通过对象的自身属性来决定。

DBMS(数据库管理系统)

  • 数据库的管理软件,科学有效的管理我们的数据。维护和获取数据;
  • MySql,数据库管理系统

1.4 MySql

MySql 是 一个关系型数据库管理系统,属于Oracle旗下,是最好的RDBMS用用软件之一,开源的数据库软件,体积小,速度快,总体拥有成本低,招人成本比较低。

5.7 比较稳定

8.0

MySql 尽可能使用压缩包安装。

1.5 MySql和Sqlyog安装

  • 面向百度
  • 再安装一个可视化数据库的软件Sqlyog

1.6MySql建表练习

  • 练习创建一个数据库

    • 新建一个数据库db_School

    • 新建一张表student

    • 字段: id,name,age
      
    • 在一张表中添加一组数据

1.7链接数据库

  • 命令行连接
mysql -uroot -p密码 --连接数据库

uodate mysql.user set authentication_string=password('123456') where user='root' and Host = 'localhost'; --修改密码
flush privileges; --刷新权限

---------------------------------------------------------------------
show database;  --查看所有数据库
mysql> use school; --切换数据库use 数据库名
Database changed
show table; --查看所有表
describe student; --显示数据库中所有的数据

----------------------------------------------------------------------
create database class; --创建一个数据库

exit; --退出连接

CRUD 增删改查

DDL , DML , DQL ,DCL

2. 操作数据库

操作 数据库>表>数据

MySql关键字不区分大小写

2.1 操作数据库(了解)

[ ]:中括号表示可选

1.新建数据库

CREATE DATABASE [IF NOT EXISTS] CLASS;

2.删除数据库

DROP DATABASE CLASS;

3.使用数据库

USE `school` --若表名或字段名是个特殊字符就需要带``

4.查看数据库

SHOW DATABASE

学习思路:

不会的操作看可视化软件的历史记录

固定语法需要记忆

2.2 数据库表中的列类型(重点)

数值

数据类型 描述 占用字符
tinyint 十分小的整数 1个字节
smallint 较小的整数 2个字节
int 标准整数 4个字节
middleint 中等大小的整数 3个字节
bigint 较大的整数 8个字符
float 浮点数 4个字节
double 浮点数 8个字节
decimal 字符串形式的浮点数(金融计算一般浮点数用decimal)

字符串

  • char 字符串固定大小 0 ~ 255
  • varchar 可变字符串 0 ~ 65535 常用 String
  • tinytext 微型文本 28 ~ 1 存放博客
  • text 文本串 216 ~ 1 保存大文本

时间日期

  • java.util.Date
  • date YYYY-MM-DD , 📅 日期
  • time HH:MM:SS ⏲ 时间日期
  • datetime YYYY-MM-DD HH:MM:SS 最常用的时间格式
  • timestamp 时间戳 1970.1.1到现在的毫秒数!也较为常用
  • year 年份表示

null

  • 没有值,未知
  • 注意,不要使用NULL进行运算,计算结果一定为NULL

2.3 数据库表中的字段属性(重点)

Unsigned

  • 无符号 的整数
  • 一旦钩为 无符号 就不能声明为负数

zerofill

  • 零填充
  • 不足的位数,使用0来填充

自增

  • 通常理解为自动递增,自动在上一条记录的基础上+1(默认)
  • 通常用来设计唯一的主键 index ,必须是整数
  • 可以自定义自增的初始值

非空

  • NULL /NOT NULL
  • 假设设置位非空,如果不插入数据就会报错
  • NULL,如果不填值默认就是null !

默认

  • 设置默认值
  • gender 默认值为男,

阿里巴巴手册 (项目级别) 表示记录存在的意义

  • 每一个表都必须存在以下几个字段

    id --主键
    `version`  --乐观锁
    is_delete --伪删除
    gmt_create --创建时间
    gmt_update --修改时间
    

2.4 操作数据库的表

1.在数据库中用指令新建表

  • 注意,使用英文括号,表的明字和字段尽量使用 `` 括起来
--AUTO_INCREMENT 自增
--字符串用单引号括起来
--所有的语句后面加,(英文的),最后一个不用加
--COMMENT 注释
CREATE TABLE IF NOT EXISTS `student`(
	`id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '',
    `name` VARCHAR(30) NOT NULL DEFAULT '匿名' COMMENT '姓名',
    `pwd` VARCHAR(20) NOT NULL DEFAULT '123456' COMMENT '密码',
    `gender` VARCHAR(2) NOT NULL DEFAULT '女' COMMENT '性别',
    `birthday` DATETIME DEFAULT NULL COMMENT '出生日期',
    `address` VARCHAR(100) DEFAULT NULL COMMENT '地址',
    `email` VARCHAR(50) DEFAULT NULL COMMENT '邮箱',
    PRIMARY KEY (`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8
  • 创建结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-i4dCwe6H-1586686083472)(…/Typora%E5%9B%BE%E7%89%87%E7%BC%93%E5%AD%98/1586614249435.png)]

  • 总结格式

  • CREATE TABLE [IF NOT EXISTS] `表名`(
    	`字段名` 列类型 [属性] [索引] [注释],
        `字段名` 列类型 [属性] [索引] [注释],
         .....
        `字段名` 列类型 [属性] [索引] [注释]
    )[表类型][字符集设置][注释]
    

2.查看已创建数据库的语句

SHOW CREATE DATABASE db_school_list  --查看表,已db_school_list数据库为例子

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dxtIuXEd-1586686083474)(…/Typora%E5%9B%BE%E7%89%87%E7%BC%93%E5%AD%98/1586615202858.png)]

3.查看已创建表的定义

SHOW CREATE TABLE student  --查看表中定义的语句,已student表为例子

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jdV7DPGB-1586686083475)(…/Typora%E5%9B%BE%E7%89%87%E7%BC%93%E5%AD%98/1586615278473.png)]

4.显示表的结构

DESC student --查看表的结构,已student表为例子

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cqISEzpg-1586686083477)(…/Typora%E5%9B%BE%E7%89%87%E7%BC%93%E5%AD%98/1586615159188.png)]

2.5 数据表的类型

  • 关于数据库引擎
    • INNODB 默认使用
    • MYISAM 5.5即以前的版本

INNODB和MYISAM的区别

区别 MYISAM INNODB
事务支持 不支持 支持
数据行锁定 不支持 支持
外键约束 不支持 支持
全文索引 支持 不支持
表空间的大小 较小 较大,前者的两倍

常规使用操作:

  • MYISAM 节约空间,速度较快 聚集索引

  • **INNODB 安全性高,书屋处理快,多表多用户操作 ** 非聚集索引

物理空间的位置

  • 所有的数据库文件都存在在data文件下
  • 数据库本质还是文件存储

MySql引擎在物理文件上的区别

  • INNODB在数据库表中只有一个 *.frm 文件,以及上级目录下的ibdata1文件
  • MYISAM对应的文件
    • *.frm 表结构的定义文件
    • *.MYD 数据文件(data)
    • *.MYI 索引文件(index)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NhNLOIvF-1586686083481)(…/Typora%E5%9B%BE%E7%89%87%E7%BC%93%E5%AD%98/1586616183543.png)]

设置数据库表的字符集编码

  • CHARSET=utf8 不设置话不支持中文

2.6 修改和删除表

修改和删除表和表中的字段

1. 修改表名

--ALTER TABLE 旧表名 RENAME AS 新表名
ALTER TABLE teacher RENAME AS teacher00

2. 增加表的字段

--ALTER TABLE 表名 ADD 字段名 列属性
ALTER TABLE teacher00 ADD age INT(11)

3. 修改表的字段(重命名 修改约束)

--ALTER TABLE 表名 MODIFY 字段名 列属性
--ALTER TABLE 表名 CHANGE 字段名 列属性
ALTER TABLE teacher00 MODIFY age VARCHAR(11)  --修改约束
ALTER TABLE teacher00 CHANGE age age1 VARCHAR(11)  --字段重命名

4. 删除字段

--ALTER TABLE 表名 DROP 字段名
ALTER TABLE teacher00 DROP age1

5. 删除表

--DROP TABLE [IF EXSITS] 表名
DROP TABLE IF EXSITS teacher00

所有的创建和删除操作尽量都加上判断,以免报错

3. MySql数据管理

3.1 外键(了解)

外键

  • 如图,学生表的grade列 引用 年级表里的id (约束)
1586680924028

方式一:在创建时设置外键

--创建年纪表
CREATE TABLE IF NOT EXISTS `grade`(
	`gid` INT(10) NOT NULL AUTO_INCREMENT COMMENT '年级id',
    `gname` VARCHAR(30) NOT NULL DEFAULT '匿名' COMMENT '年纪名称',
    PRIMARY KEY (`gid`)
)ENGINE=INNODB DEFAULT CHARSET=utf8

--包含外键的新student表
--定义外键
--给这个外键添加约束(执行引用)reference 引用

CREATE TABLE IF NOT EXISTS `student`(
	`id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '',
    `name` VARCHAR(30) NOT NULL DEFAULT '匿名' COMMENT '姓名',
    `pwd` VARCHAR(20) NOT NULL DEFAULT '123456' COMMENT '密码',
    `gender` VARCHAR(2) NOT NULL DEFAULT '女' COMMENT '性别',
    `gid` INT(10) NOT NULL COMMENT '学生年级',
    `birthday` DATETIME DEFAULT NULL COMMENT '出生日期',
    `address` VARCHAR(100) DEFAULT NULL COMMENT '地址',
    `email` VARCHAR(50) DEFAULT NULL COMMENT '邮箱',
    PRIMARY KEY (`id`),
    KEY `FK_gid` (`gid`),
    CONSTRAINT `FK_gid`FOREIGN KEY (`gid`) REFERENCES `grade`(`gid`)
)ENGINE=INNODB DEFAULT CHARSET=utf8

--注意在删除引用外键关系的表时,要先删除外键表 再删除引用外间的表

方法二:创建表的时候没有外键关系

/*
ALTER TABLE 表名
ADD CONSTRAINT 约束名 FOREIGN KEY (作为外键的列) REFERENCES 那个表(哪个字段)
*/

ALTER TABLE `student`
ADD CONSTRAINT `FK_gid` FOREIGN KEY (`gid`) REFERENCES `grade`(`gid`)

以上的操作都是物理外键(既数据库级别的外键),不建议使用!(避免数据库过多造成困扰)

最佳实践

  • 数据库就是单纯的表,只用来存储数据,只有行(数据)和列(字段)
  • 我们想使用多张表的数据,想使用外键(用程序去实现)

3.2DML语言(全部记住)

**数据库意义:**数据存储,数据管理

**DML语言:**数据操作语言

  • Insert
  • Update
  • Delete

3.3 添加

--插入语句
--insert into 表名([字段1,字段2,字段3,])values('值1'),('值2'),('值3'),...,()
--插入的值和前面的字段要一一对应
--可以插入多条数据,VALUES后面的值要用括号和逗号隔开
INSERT INTO `grade`('gname')VALUES('大一'),('大二'),('大三')

INSERT INTO `student`('gender','name','pwd')VALUES('男','张三','888888'),('男','赵云','zy12345'),('女','胡八一','886688')

3.4 修改

-- 修改语句
-- 修改学员名字,带条件
UPDATE `student` SET `name`='小迷弟' WHERE id = 1;

-- 在不指定条件的情况下,会改动所有表
UPDATE `student` SET `name`='小迷弟';

-- 语法:
-- UPDATE 表名 SET 列属性=新值 WHERE 条件;

-- 修改多个属性,逗号隔开
UPDATE `student` SET `name`='小迷弟',`email`='[email protected]' WHERE id = 1;

-- 语法:
-- UPDATE 表名 SET 列属性1=新值[,列属性2=新值] WHERE 条件;

条件:where 子句 运算符 id等于某个值

操作符 含义 范围 结果
= 等于 5=6 false
<>或!= 不等于 5<>6 ture
>= 大于等于 5>=6 false
<= 小于等于 5<=6 ture
> 大于 5>6 false
< 小于 5<6 ture
BETWEEN… AND… 在某个范围 [5,6] ture
AND && 与 5>6 and 1<2 false
OR || 或 5>6 or 1<2 ture

注意总结:

  • 数据库的列尽量戴上``
  • 条件,筛选的条件,如果没有指定,则会修改左右变量
  • value,是一个具体的值,也可以是一个变量

3.5 删除

-- 删除语句
--删除指定数据
DELETE FROM `student` WHERE id=1

--不加条,删除表的所有数据,避免这样
DELETE FROM `student`

--清空表,采用这个更好
TRUNCATE `student`

Delete 和Truncate的区别

  • 相同点: 都能删除数据,都不会删除表结构
  • 不同点:
    • TRUNCATE 重新设置 自增列 计数器会归零
    • TRUNCATE 不会影响事务
  • 补充Delete的删除问题,重启数据库的现象
    • INNODB 自增序列会重1开始
    • MYISAM 继续从上一个自增量开始

4. DQL查询语言(最重点)

4.1 DQL

(Data Query Language : 数据查询语言)

  • 所有的查询操作都用它 关键词是 select

  • 简单地查询和复杂的查询它都能做

  • 它是数据库中最核心的语言,最重要的语句

  • 使用频率最高的语句

4.2 查询指定字段

--查询所有学生
SELECT * FROM student

--查询所有学生的成绩
SELECT * FROM result

--查询指定字段
--SELECT 字段名 FROM 表名
SELECT `StudentNo`,`StudentName` FROM student

--别名,给结果起一个名字 关键词 AS 字段和表都可以起别名
SELECT `StudentNo` AS 学号,`StudentName` AS 学生姓名 FROM student

--函数 Concat(a,b) 链接字符串
SELECT CONCAT('姓名:',StudentName) AS 新名字 FROM student

--去重 distinct
SELECT DISTINCT `StudentNo` FROM result

--查询版本
SELECT VERSION()
--计算
SELECT 100*3-1 AS 计算结果
--查询自增步长
SELECT @@auto_increment_increment

--查询所有学生的考试成绩并+1分查看
SELECT `StudentNo`,`StudentResult`+1 AS '提分后' FROM result

语法: SELECT 字段名1[,字段名2……,字段名n] FROM 表名

别名: AS 字段和表都可以起别名

去重: distinct 去除SELECT查询出来的结果中重复的值

数据库中的表达式: 文本值 ,列,NULL,函数,计算表达式,系统变量…

语法升级SELECT 表达式 FROM 表

4.3 where 条件子句

作用: 检索数据中符合条件的值

逻辑运算符

运算符 语法 描述
and && x and y
or || x or y
not ! not x
--where子句
--查询成绩在95-100之间的学生
--方法1
SELECT `StudentNo`,`StudentResult` FROM result
WHERE StudentResult>=95 AND StudentResult<=100
--方法2
SELECT `StudentNo`,`StudentResult` FROM result
WHERE StudentResult>=95 && StudentResult<=100
--方法3 模糊查询(区间)
SELECT `StudentNo`,`StudentResult` FROM result
WHERE StudentResult BETWEEN 95 AND 100

--查询除了学号为1000号学生以外的同学的成绩
--方法1
SELECT `StudentNo`,`StudentResult` FROM result
WHERE NOT StudentNo = 1000

--方法2
SELECT `StudentNo`,`StudentResult` FROM result
WHERE StudentNo != 1000

模糊查询:比较运算符

运算符 语法 描述
IS NULL x is null 为null,结果为真
IS NOT NULL x is not null 不为nul,结果为真
BETWEEN … AND … BETWEEN 95 AND 100 x在95-100之间,则为真
LIKE x like y SQL匹配,若x匹配到y,则结果为真
IN x in y1,y2,… 假设x在y1,y2…之中的某个值,则结果为真
--模糊查询
--查询姓胡的同学
--like 结合 %(代表0到任意个字符)  _(一个字符)
SELECT `StudentNo`,`StudentName` FROM student
WHERE StudentName LIKE '刘%'

--查询姓胡的同学,只有两个字的
SELECT `StudentNo`,`StudentName` FROM student
WHERE StudentName LIKE '刘_'

--查询姓胡的同学,三个字的
SELECT `StudentNo`,`StudentName` FROM student
WHERE StudentName LIKE '刘__'

--查询名字中间有'姿'字的同学
SELECT `StudentNo`,`StudentName` FROM student
WHERE StudentName LIKE '%姿%'

--in
--查询1001,1002,1003号同学
SELECT `StudentNo`,`StudentName` FROM student
WHERE StudentNo IN (1001,1002,1003)

--查询在浙江,重庆的同学
SELECT `StudentNo`,`StudentName`,`Address` FROM student
WHERE Address IN ('浙江','重庆')

--null / not null
--查询地址为空的学生null  ''
SELECT `StudentNo`,`StudentName`,`Address` FROM student
WHERE Address='' OR Address IS NULL

注意:%和like联用,不要乱用。

# 4. DQL查询语言(最重点)

4.1 DQL

(Data Query Language : 数据查询语言)

  • 所有的查询操作都用它 关键词是 select

  • 简单地查询和复杂的查询它都能做

  • 它是数据库中最核心的语言,最重要的语句

  • 使用频率最高的语句

4.2 查询指定字段

--查询所有学生
SELECT * FROM student

--查询所有学生的成绩
SELECT * FROM result

--查询指定字段
--SELECT 字段名 FROM 表名
SELECT `StudentNo`,`StudentName` FROM student

--别名,给结果起一个名字 关键词 AS 字段和表都可以起别名
SELECT `StudentNo` AS 学号,`StudentName` AS 学生姓名 FROM student

--函数 Concat(a,b) 链接字符串
SELECT CONCAT('姓名:',StudentName) AS 新名字 FROM student

--去重 distinct
SELECT DISTINCT `StudentNo` FROM result

--查询版本
SELECT VERSION()
--计算
SELECT 100*3-1 AS 计算结果
--查询自增步长
SELECT @@auto_increment_increment

--查询所有学生的考试成绩并+1分查看
SELECT `StudentNo`,`StudentResult`+1 AS '提分后' FROM result

语法: SELECT 字段名1[,字段名2……,字段名n] FROM 表名

别名: AS 字段和表都可以起别名

去重: distinct 去除SELECT查询出来的结果中重复的值

数据库中的表达式: 文本值 ,列,NULL,函数,计算表达式,系统变量…

语法升级SELECT 表达式 FROM 表

4.3 where 条件子句

作用: 检索数据中符合条件的值

逻辑运算符

运算符 语法 描述
and && x and y
or || x or y
not ! not x
--where子句
--查询成绩在95-100之间的学生
--方法1
SELECT `StudentNo`,`StudentResult` FROM result
WHERE StudentResult>=95 AND StudentResult<=100
--方法2
SELECT `StudentNo`,`StudentResult` FROM result
WHERE StudentResult>=95 && StudentResult<=100
--方法3 模糊查询(区间)
SELECT `StudentNo`,`StudentResult` FROM result
WHERE StudentResult BETWEEN 95 AND 100

--查询除了学号为1000号学生以外的同学的成绩
--方法1
SELECT `StudentNo`,`StudentResult` FROM result
WHERE NOT StudentNo = 1000

--方法2
SELECT `StudentNo`,`StudentResult` FROM result
WHERE StudentNo != 1000

模糊查询:比较运算符

运算符 语法 描述
IS NULL x is null 为null,结果为真
IS NOT NULL x is not null 不为nul,结果为真
BETWEEN … AND … BETWEEN 95 AND 100 x在95-100之间,则为真
LIKE x like y SQL匹配,若x匹配到y,则结果为真
IN x in y1,y2,… 假设x在y1,y2…之中的某个值,则结果为真
--模糊查询
--查询姓胡的同学
--like 结合 %(代表0到任意个字符)  _(一个字符)
SELECT `StudentNo`,`StudentName` FROM student
WHERE StudentName LIKE '刘%'

--查询姓胡的同学,只有两个字的
SELECT `StudentNo`,`StudentName` FROM student
WHERE StudentName LIKE '刘_'

--查询姓胡的同学,三个字的
SELECT `StudentNo`,`StudentName` FROM student
WHERE StudentName LIKE '刘__'

--查询名字中间有'姿'字的同学
SELECT `StudentNo`,`StudentName` FROM student
WHERE StudentName LIKE '%姿%'

--in
--查询1001,1002,1003号同学
SELECT `StudentNo`,`StudentName` FROM student
WHERE StudentNo IN (1001,1002,1003)

--查询在浙江,重庆的同学
SELECT `StudentNo`,`StudentName`,`Address` FROM student
WHERE Address IN ('浙江','重庆')

--null / not null
--查询地址为空的学生null  ''
SELECT `StudentNo`,`StudentName`,`Address` FROM student
WHERE Address='' OR Address IS NULL

注意:%和like联用,不要乱用。

4.4 联表查询

SQL中的七种JOINS理论详解

LEFT JOIN , INNER JOIN , RIGHT JOIN

在这里插入图片描述

--查询参加了考试的同学(学号,姓名,科普编号,分数)
SELECT * FROM student
SELECT * FROM result

/*
思路
1. 分析需求,分析查询的字段来自那些表(连接查询)
2. 确定使用那种连接查询? 7种
确定交叉信息

--JOIN ON是固定语法 连接查询
--WHERE 等值查询
*/
--查看并集 INNER JOIN
SELECT s.StudentNo,StudentName,SubjectNo,StudentResult 
FROM student AS s
INNER JOIN result AS r
WHERE r.StudentNo = s.StudentNo

--查看并集和右部分 RIGHT JOIN
SELECT s.StudentNo,StudentName,SubjectNo,StudentResult 
FROM student AS s
RIGHT JOIN result r
ON r.StudentNo = s.StudentNo

--查询缺考同学
--查看并集和右部分 RIGHT JOIN
SELECT s.StudentNo,StudentName,SubjectNo,StudentResult 
FROM student AS s
LEFT JOIN result r
ON r.StudentNo = s.StudentNo
WHERE  StudentResult IS NULL

--查询参加考试同学的信息(学号,学生姓名,科目名称,成绩) 3张表
SELECT DISTINCT s.StudentNo,StudentName,SubjectNo,StudentResult 
FROM student AS s
RIGHT JOIN result r
ON r.StudentNo = s.StudentNo
INNER JONIN subject sub
WHERE sub.SubjectNo = s.SubjectNo

--多表查询,先查询两张表再慢慢增加
操作 描述
INNER JOIN 如果表中至少有一个匹配,就返回行
LEFT JOIN 即使由右表中没有匹配,也会从左表中返回所有的值,(例如新建的学生没有成绩)
RIGHT JOIN 即使由左表中没有匹配,也会从右表中返回所有的值

自连接

--自连接用例表
CREATE TABLE `category`( 
    `categoryid` INT(3) NOT NULL COMMENT 'id', 
    `pid` INT(3) NOT NULL COMMENT '父id 没有父则为1', 
    `categoryname` VARCHAR(10) NOT NULL COMMENT '种类名字',
    PRIMARY KEY (`categoryid`) 
) ENGINE=INNODB AUTO_INCREMENT=9 CHARSET=utf8; 

INSERT INTO `category` (`categoryid`,`pid`,`categoryname`) 
VALUES ('2','1','信息技术'),
('3', '1', '软件开发'),
('5', '1', '美术设计'),
('4', '3', '数据库'),
('8', '2', '办公信息'),
('6', '3', 'web开发'),
('7', '5', 'ps技术');

自己的表和自己的表连接,核心:一张表拆为两张一样的表即可

  • 父类
categoryid categoryname
2 信息技术
3 软件开发
5 美术设计
  • 子类
pid(父类id) categoryid categoryname
3 4 数据库
2 8 办公信息
3 6 web开发
5 7 ps技术

操作:查询父类对应子类的关系

父类 子类
软件开发 数据库
信息技术 办公信息
软件开发 web开发
美术设计 ps技术
--查询父子信息

SELECT a.`categoryName` AS '先修课程',b.`categoryName` AS '当前课程'
FROM `category` AS a,`category` AS b
WHERE a.`categoryid` = b.`pid`

--查询学生所属的年级(学号,学生的姓名,年纪名称)

SELECT studentNo,studentName,`GraderName`
FROM student s
INNER JOIN `grade` g
ON s.GradeID = g.GradeID

--查询科目所属的年级(科目名称,年纪名称)

SELECT subjectName,`GraderName`
FROM `subject` sub
INNER JOIN `grade` g
ON sub.GradeID = g.GradeID

-- 思考题 查询参加了数据库结构考试的同学的同学信息(学号,学生姓名,科目名,分数)

SELECT studentNo,studentName,subjectName,studentResult
FROM student s
INNER JOIN `subject` sub
ON sub.subjectNo = s.subjectNo
INNER JOIN `grade` g
ON sub.studentNo = s.studentNo
WHERE gradeName = '数据库结构'

在这里插入图片描述

4.5 分页和排序

分页 limit 和 排序 order by

--查询参加了数据库结构考试的同学的同学信息(学号,学生姓名,科目名,分数)
--对查询到的结果根据程序降序/升序排序
--降序 DESC / 升序 ASC
SELECT s.StudentNo,StudentName,SubjectName,StudentResult
FROM student s
INNER JOIN `subject` sub
ON sub.SubjectNo = s.SubjectNo
INNER JOIN `grade` g
ON g.StudentNo = s.StudentNo
WHERE GradeName = '数据库结构'
ORDER BY StudentResult DESC

--分页,每页只显示五条数据
--语法:limit 当前页,页面的大小
--LIMIT 0,5    0~5  这是第一页
--LIMIT 6,10   6~10 这是第二页
--扩展
--网页应用: 当前 总的页数 页面大小 n代表当前页,pagesize代表页面大小,总页数=总数/页面大小
--LIMIT : 5*(n-1)+1,5*(n-1)+pagesize

SELECT s.StudentNo,StudentName,SubjectName,StudentResult
FROM student s
INNER JOIN `subject` sub
ON sub.SubjectNo = s.SubjectNo
INNER JOIN `grade` g
ON g.StudentNo = s.StudentNo
WHERE GradeName = '数据库结构'
ORDER BY StudentResult DESC
LIMIT 0,5

--思考题 查询’JAVA第一学年'课程成绩排名前十的学生且分数不小于80的学生信息(学号,学生姓名,科目名,分数)

SELECT s.StudentNo,StudentName,SubjectName,StudentResult
FROM student s
INNER JOIN `subject` sub
ON sub.SubjectNo = s.SubjectNo
INNER JOIN `grade` g
ON g.StudentNo = s.StudentNo
WHERE GradeName = 'JAVA第一学年' AND StudentResult >= 80
ORDER BY StudentResult DESC
LIMIT 0,10

为什么要分页?

  • 缓解数据库压力,给人的体验更好
  • 另一种形式 瀑布流 — 百度图片,无限下拉。

4.6子查询和嵌套查询

WHERE (这个值是计算出来的)

子查询的本质:在WHERE语句中嵌套一个子查询语句

--语法
WHERE 字段属性 =/IN (
		SELECT...
)

--查询参加了数据库结构考试的同学的同学信息(学号,科目名,分数),降序排列
--方式一使用:连接查询
SELECT StudentNo,r.SubjectNo,StudentResult
FROM result r
INNER JOIN `subject` sub
ON sub.SubjectNo = r.SubjectNo
WHERE SubjectNo = '数据结构' 
ORDER BY StudentResult DESC
--方式二:使用子查询
SELECT StudentNo,SubjectNo,StudentResult
FROM result r
WHERE SubjectNo = (
	SELECT SubjectNo
    FROM `subject` sub
    WHERE SubjectNo = '数据结构' 
)
ORDER BY StudentResult DESC


--查询分数不小于80分的学生学号和姓名
SELECT DISTINCT s.StudentNo,StudentName,StudentResult
FROM student s
INNER JOIN result r
ON s.StudentNo = r.StudentNo
WHERE StudentResult >= 80

--在这个基础上增加一个科目 是高等数学
--子查询方式:
AND SubjectNo = (
	SELECT SubjectNo
    FROM subject sub
    WHERE SubjectName = '高等数学'
)

--连接查询方式:
--去掉上一行WHERE ,因为WHERE不可以写两个 HAVING可以
INNER JOIN subject sub
ON s.StudentNo = sub.StudentNo
WHERE SubjectName = '高等数学' AND StudentResult >= 80


4.7 分组和过滤

HAVING 和 GROUP BY

--查询不同课程的平均分,最高分,最低分,且平均分要要大于80分
SELECT Subjectname,AVE(StudentResult) AS 平均分,MAX(StudentResult) AS 最高分,MIN(StudentResult) AS 最低分
FROM result r
INNER JOIN `subject` sub
ON r.SubjectNo = sub.SubjectNo
GROUP BY r.SubjectNo --通过什么字段来分组
HAVING 平均分>80  --过滤过的分组要用HAVING不能用WHERE

4.8 SELECT 小结

小结
在这里插入图片描述

5.MySql函数

5.1常用函数(但并不常有)

数学运算

--数学运算

--绝对值
SELECT ABS(-8)

--向上取整
SELECT CELLING(9.4)

--向下取整
SELECT FLOOR(9.4)

--返回一个0~1之间的随机数
SELECT RAND()

--判断符号,负数返回-1,正数返回1
SELECT SIGN(10)

字符串

--字符串

--字符串长度
SELECT CHAR_LENGTH('不会真的有人会用这些函数吧') 

--字符串拼接
SELECT CONCAT('我','正在学','MySql')

--转大写,转小写
SELECT LOWER('SeLEcT')
SELECT UPPER('SeLEcT')

--返回第一次出现的子串的位置
SELECT INSTR('SeLEcT','ect')

--替换字符串
SELECT REPLACE('不会真的有人会用这些函数吧','会用这些函数','只看视频不实操')

--....

时间和日期(比较重要,数据库内使用比较频繁)

--时间和日期

--获取当前日期
SELECT CURRENT DATE()
SELECT CURDATE()

--获取当前的时间
SELECT NOW()

--获取本地时间
SELECT LOCALTIME()

--获取系统时间
SELECT SYSDATE()

--获取年,月,日,时,分,秒
SELECT YEAR(NOW())
SELECT MONTH(NOW())
SELECT DAY(NOW())
SELECT HOUR(NOW())
SELECT MINUTE(NOW())
SELECT SECOND(NOW())

--系统用户和版本
SELECT SYSTEM_USER()
SELECT USER()
SELECT VERSION() 

5.2 聚合函数(常用)

聚合函数

函数名称 描述
COUNT() 计数
SUM() 求和
AVG() 求平均值
MAX() 最大值
MIN() 最小值
--聚合函数

--查询学生表人数,都能够统计表中的数据
SELECT COUNT(StudentNo) FROM `student` --会忽略null的值
SELECT COUNT(*) FROM `student` --不会忽略null的值
SELECT COUNT(1) FROM `student` --不会忽略null的值

--其余示例
SELECT SUM(`StudentResult`) AS 总和 FROM `result`
SELECT AVG(`StudentResult`) AS 平均分 FROM `result`
SELECT MAX(`StudentResult`) AS 最大值 FROM `result`
SELECT MIN(`StudentResult`) AS 最小值 FROM `result`

--查询不同课程的平均分,最高分,最低分,且平均分要要大于80分
SELECT Subjectname,AVE(StudentResult) AS 平均分,MAX(StudentResult) AS 最高分,MIN(StudentResult) AS 最低分
FROM result r
INNER JOIN `subject` sub
ON r.SubjectNo = sub.SubjectNo
GROUP BY r.SubjectNo --通过什么字段来分组
HAVING 平均分>80  --过滤过的分组要用HAVING不能用WHERE

5.3 数据库级别的MD5加密(扩展)

MD5

信息摘要算法,主要增强算法复杂度和不可逆性。

MD5 不可逆,具体的值的MD5是一样的

MD5破解网站原理,背后有一个字点,MD5加密后的值,加密的前值

--测试MD5 加密

CREATE TABLE 'testmd5'(
	`id` INT(4) NOT NULL,
    `name` VACHAR(20) NOT NULL,
    `pwd` VACHAR(50) NOT NULL,
    PRIMARY KEY(`id`)
)ENGINE = INNODB DEFAULT CHARSET = utf8

--明文密码
INSERT INTO testmd5 VALUES(1,'测试人员1','123456'),(2,'管理员','7894561')

--加密指定密码
UPDATE testmd5 SET pwd=MD5(pwd) WHERE id = 1

--加密全部密码
UPDATE testmd5 SET pwd=MD5(pwd)

--在插入的时候加密
INSERT INTO testmd5 VALUES(3,'测试人员2',MD5('123456'))

--如何校验:将用户传递进来的密码,进行MD5加密,然后比对加密值
SELECT * FROM testmd5 WHERE `name` = '测试人员2' AND `psd` = MD5('123456')

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章