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的区别

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

常规使用操作:

  • 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`='18465@163.com' WHERE id = 1;

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

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

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

注意总结:

  • 数据库的列尽量戴上``
  • 条件,筛选的条件,如果没有指定,则会修改左右变量
  • 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 NULLx is null为null,结果为真
IS NOT NULLx is not null不为nul,结果为真
BETWEEN … AND …BETWEEN 95 AND 100x在95-100之间,则为真
LIKEx like ySQL匹配,若x匹配到y,则结果为真
INx 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 NULLx is null为null,结果为真
IS NOT NULLx is not null不为nul,结果为真
BETWEEN … AND …BETWEEN 95 AND 100x在95-100之间,则为真
LIKEx like ySQL匹配,若x匹配到y,则结果为真
INx 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技术');

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

  • 父类
categoryidcategoryname
2信息技术
3软件开发
5美术设计
  • 子类
pid(父类id)categoryidcategoryname
34数据库
28办公信息
36web开发
57ps技术

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

父类子类
软件开发数据库
信息技术办公信息
软件开发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')

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值