2021-11-03

目录

数据库知识点

1数据库的基本操作

2数据库的数据(列)类型

3数据库的字段属性

2.4创建数据库

2.5数据表的类型


1数据库的基本操作

1创建:creat database 【if not exist】名字

3使用数据库 use 名字

4查看所有的数据库 show database

2数据库的数据(列)类型

12数值

2字符串

 

3时间日期

 

4NULL

3数据库的字段属性

 1unsigned

无符号的整数

声明了该列不能声明为负数

2zerofill

0填充

不足的位数使用零来填充

比如int(4)5 就会自动填充为0005 

3自增

通常理解为自增,自动在上一条记录的基础上加1(默认)

通常用来设计唯一的主键~ index  必须是整数类型

可以自定义设计主键的起始值和步长

4非空

NULL 和not null

not null 不填值就会报错

null 不填值就会为null

5默认

设置默认值

sex 默认值为男  不指定值则为默认值

拓展

2.4创建数据库

-- 注意点表的名字和字段名尽量用``给括起来
-- AUTo_increment 自增
-- 字符串使用单括号括起来
-- 所有的语句后面加, (英文的,) 最后一个不用加
-- primary key 主键 一般一个表只有一个唯一的主键
-- 字段名 列类型 属性 索引 字段

创建代码完成之和一定要选中当前的数据库然后在把代码选中并且点击执行

常用命令

show create database  数据库名字 -----------------查看创建数据库的语句

show create table    表的名字---------------查看数据表的定义语句

desc  表的名字  -------------显示表的结构

2.5数据表的类型

INNODB 默认使用

MYISAM 早些年使用


 

myisaminnodb
事务支持不支持支持
数据行锁定不支持支持
外键约束不支持支持
全文索引支持不支持
表空间的大小较小较大,约为mysiam两倍

myisam:节约空间,速度较快

innodb:安全性高,事务的处理,多表多用户

在物理空间存在的位置

所有的数据库文件都存在data目录下

本质还是文件的存储

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

innodb:在数据库表中只有一个*.frm文件,以及上级目录下的iddata1

myisam:

*.frm 表结构的定义文件

*.Myd 数据文件

*.myi 索引文件

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

1,charset=utf8

不设置的话,则是MySQL默认的字符集编码Latin1(不支持中文)

2也可以在my.ini中配置默认的编码

charact-set-server=utf8

修改删除表

-- 修改表名 alter table 旧表名 rename as 新表名`
ALTER TABLE `student` RENAME AS `student1`
-- 增加表的字段 alter table 表名 add 字段名 字段列属性、
ALTER TABLE `student1` ADD age INT(12)


-- 修改表的字段 重命名和修改约束


-- ALTER TABLE 表名 MODIFY 字段名 属性()
ALTER TABLE `student1` MODIFY age VARCHAR(1)
-- ALTER TABLE 表名 change 旧名字 新名字 属性()
ALTER TABLE `student1`CHANGE age age111 VARCHAR(13)


-- 删除表中的字段
ALTER TABLE `student1` DROP age111

删除表

drop table ( if exist)  表名 

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

3.mysql的数据管理(重点)

3.1外键(了解即可)

 CREATE TABLE `grade`(
 `gradeid` INT(10) NOT NULL AUTO_INCREMENT COMMENT '年纪id',
 `gradename` VARCHAR(50) NOT NULL COMMENT '年纪名称',
  PRIMARY KEY (`gradeid`)
)ENGINE=INNODB DEFAULT CHARSET=utf8
CREATE TABLE IF NOT EXISTS student2(
  `id` INT(12) NOT NULL AUTO_INCREMENT COMMENT '学号',
  `gradeid` INT(10) NOT NULL COMMENT'年级名称',
  `name` VARCHAR(412) NOT NULL DEFAULT'匿名' COMMENT'姓名',
  PRIMARY KEY (`id`),
  KEY `FK_gradeid` (`gradeid`),
  CONSTRAINT `FK_gradeid` FOREIGN KEY (`gradeid`) REFERENCES `grade`(`gradeid`) 
)ENGINE=INNODB DEFAULT CHARSET=utf8

 

 3.2dml语言()

数据库的意义:数据存储和数据管理

DMl语言:

数据操作语言

insert

updata

delete

3.3添加

-- insert into 表名([字段名1,字段名2,字段名3,字段名4 ] )      values(‘’,‘’,‘’)
INSERT INTO `student2`(`id`,`gradeid`,`name`) VALUES('1','2112','周周')
INSERT INTO `student2`(`gradeid`) VALUES('11321232'),('11321232'),('2123')

insert into 表名 (字段名,字段名,字段名,字段名,字段名)

values('1','2','3','4','5')

注意事项:

1字段和字段之间必须要用英文逗号隔开

2字段是可以省略的,但是后面的值不能省略并且还有一一对应

3可以同时插入多条数据,但是values后面的值要用逗号隔开

3.4修改

3.5删除

delete命令

语法:

delete from 表名 [where 条件]

数据库避免这样写会全部删除

delete from `student`(这里是表名)

删除指定数据

delete from `student` where id =1;

truncate命令

truncate table `表名`

不同

truncate 重新设置 自增列 计数器会归零

truncate   不会影响事务

测试delete和truncate之间的区别


CREATE TABLE `test`(
  `id` INT(4) NOT NULL AUTO_INCREMENT,
   `name` VARCHAR(20) NOT NULL ,
   PRIMARY KEY (`id`)


)ENGINE=INNODB DEFAULT CHARSET=utf8

INSERT INTO `test`(`name`) VALUES ('1'),('2'),('3')


DELETE FROM `test`

TRUNCATE TABLE `test`

得出

(了解即可)delete删除问题,重启数据库 (现象)

innodb:自增列会重新开始(存在内存当中,断电就会失去数据)

myisam:会继续从上一个自增量开始(存在文件当中,断电也不会失去数据)

Dql查询数据(最重点)

1查询全部的学生  select 字段 from 表

select * from 表

2查询字段

select    `字段名称`,`字段名称`   from 表

3给字段起一个别名

select    `字段名称` as  别名  ,`字段名称 `  as 别名   from  表

去重 distinct

作用:去除select查询出来的结果中重复的数据,重复的数据只显示一条

select *from result 查询全部的考试成绩

SELECT *FROM `result`查询全部的考试成绩
SELECT `studentno` FROM `result` 查询那些同学参加了考试


SELECT DISTINCT `studentno` FROM `result`发现重复数据,去重
数据库的列(表达式)

查询系统的版本(函数)

select Version()

用来计算(表达式)

select 100*3-1 as  计算结果

查询自增的步长(变量)

select @@auto——increment——increment

学员成绩加一分查看

select `studentno`,`studentresult`+1 as `提分后` from result

数据库的表达式:文本值 列 null 函数 计算表达式 系统变量

select 表达式 from 表

4.3where条件子句

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

搜索的条件由一个或者多个表达式组成! 结果 布尔值

逻辑运算符

运算符语法描述
and  &&a and b  a&&b逻辑与
or   ||a or b    a  || b 逻辑或
 Not                != Not   a      !=a逻辑非

尽量使用英文字母

模糊查询:比较运算符

运算符语法描述
is nulla is null如果操作符为null,则结果为真

is not null

a is not null

如果操作符不为null,则结果为真

betweena between b and c

如果a在b到c之间则结果为真

likea like bsql匹配 ,如果a匹配b则结果为真
ina in (a1,a2,a3,a4,,,,,,,)

假设a在a1,或者a2。。。

其中的某一个值中则结果为真

4.4,联表查询

join on
/**
思路:
1.分析需求,分析查询的字段来自那些表(连接查询)
2.确定使用哪种连接查询?7种
确定交叉点(这两个表中哪个数据是相同的)
判断条件,学生表中的 studentno = 成绩表中的 studentno
**/

SELECT s.studentNo,`studentname`,`subjectno`,`studentresult`
FROM `student` AS s
INNER JOIN `result` AS r
WHERE s.studentNO=r.studentNO


-- right join

SELECT r.studentNo,`studentname`,`subjectno`,`studentresult`
FROM `student` AS s
RIGHT JOIN `result` AS r
ON s.studentNO=r.studentNO


-- left join
SELECT r.studentNo,`studentname`,`subjectno`,`studentresult`
FROM `student` AS s
LEFT JOIN `result` AS r
ON s.studentNO=r.studentNO


-- 思考题 (查询了参加考试的同学信息:学号,学生姓名,科目名,分数)
/*思路
1分析需求 分析查询的字段来自那些表  student result subject

2studentNo studentname subjectname studentresult

*/
SELECT s.studentno,`studentname`,sub.subjectno,`studentresult`
FROM `student` AS s
RIGHT JOIN `result` AS r
ON r.studentno=s.studentno
INNER JOIN `subject` AS sub
ON r.subjectno=sub.subjectno 

5.mysql函数

5.1常用函数

5.2聚合函数(常用)

函数名称描述
count()计数
sum()求和
avg()平均值
max()最大值
min()最小值
.......................................


SELECT COUNT(`studentname`) FROM `student` -- 只包括列名的那一列
SELECT COUNT(*) FROM `student`   -- 包括了所有列相当于行数
SELECT COUNT(1) FROM  `student` -- 包括了忽略所有列,用1表示代码行


SELECT SUM(`studentresult`)  FROM `result`
SELECT AVG(`studentresult`) FROM `result`
SELECT MIN(`studentresult`) FROM `result`
SELECT MAX(`studentresult`) FROM`result`

 

1.count(*)和count(1)和count(列名)区别执行效果上:
count(*)包括了所有的列,相当于行数,在统计结果的时候,不会忽略列值为NULL
count(1)包括了忽略所有列,用1代表代码行,在统计结果的时候,不会忽略列值为NULL
count(列名)只包括列名那一列,在统计结果的时候,会忽略列值为空(这里的空不是只空字符串或者O,而是表示null))的计数,即某个字段值为NUL时,不统计。

2.执行效率上:
1.列名为主键,count(列名)会比count(1)快

2.列名不为主键,count(1)会比count(列名)快
如果表多个列并且没有主键,则count (1)的执行效率优于count (*)

如果有主键,则select count(主键)的执行效率是最优的
如果表只有一个字段,则select count(*)最优。

都可以统计,想查询表中有多少个记录就是用count

SELECT COUNT(`studentname`) FROM `student` -- 只包括列名的那一列
SELECT COUNT(*) FROM `student`   -- 包括了所有列相当于行数
SELECT COUNT(1) FROM  `student` -- 包括了忽略所有列,用1表示代码行

练习题

-- 查询不同课程的平均分,最高分,最低分
-- 核心根据不同的课程分组
SELECT `subjectname`,AVG(`studentresult`) AS 平均分 ,MAX(`studentresult`) AS 最高分,MIN(`studentresult`) AS 最低分
FROM `result` AS r
INNER JOIN `subject` AS sub
ON  r.`subjectno`=sub.`subjectno`
GROUP BY r.`subjectno`  -- 通过什么字段来分组 ,在分组之和就不可以使用where条件
HAVING 平均分>80 -- 过滤分组的记录必须满足的次要条件

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


CREATE TABLE `testmd5`(
`id`  INT(4) NOT NULL ,
`name` VARCHAR(20)  NOT NULL ,
`pwd` VARCHAR(50) NOT NULL,

     
PRIMARY KEY(`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8

-- 明文密码

INSERT INTO `testmd5` VALUES (1,'zhangsan',123),(2,'lisi',456),(3,'wangwu',789)

-- 加密之和的密码
UPDATE  `testmd5`  SET  pwd=MD5( pwd) WHERE id=1
UPDATE  `testmd5`  SET


-- 插入的时候加密
INSERT INTO `testmd5` VALUES (4,'xiaoming',MD5(789456))

SELECT *FROM `testmd5` WHERE `name`='xiaoming' AND pwd=MD5(789456)

select小结

顺序很重要:
select 去重 要查询的字段 from表(注意:表和字段可以取别名)

xxx join  要连接的表 

on等值判断
where(具体的值,子查询语句)

Group By(通过哪个字段来分组)
Having(过滤分组后的信息,条件和where是一样的,位置不同)

Order .By ..(通过哪个字段排序)[升序/降序]
Limit       startlndex(开始的值),pagesize(页面的大小)

业务层面:

查询:

跨表和跨数据库

6事务

事物的acid原则

要么都成功,要么都失败

模拟场景

-- 转账 
CREATE DATABASE shop CHARACTER SET utf8 COLLATE utf8_general_ci
USE shop

CREATE TABLE `account`(
`id` INT(4)  NOT NULL AUTO_INCREMENT,
`name` VARCHAR(20) NOT NULL ,
`money` DECIMAL(9,2) NOT NULL,

PRIMARY KEY(`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8

INSERT INTO    `account`(`name`,`money`)  VALUES ('b',100.00),('c',100000.00)

-- 开启一个事务
SET autocommit=0; -- 关闭自动提交
START TRANSACTION -- 开启一个事务(一组事务)
UPDATE    `account`     SET  `money`=`money`-500  WHERE `name`='b'
UPDATE    `account`     SET   `money`=`money`+500 WHERE `name`='c'
COMMIT; -- 提交事务,就被持久化了!
ROLLBACK; -- 回滚
SET autocommit=1; -- 开启自动提交

7.索引

索引的定义:索引是帮助MySQL高效的获取数据的数据结构

索引是数据结构

基本语法:

1.在创建表的时候给字段增加索引

2.创建完毕后增加索引

显示所有的索引信息

show index from 表名

增加一个全文索引

alter table 数据库名字.表名 add fulltext index   列名(索引名);

explain 分析sql执行的情况

explain *from table 表名

explain *from table 表名 where match(列名) against(’‘)

7.2测试索引

7.3索引原则

1,索引不是越多越好

2,不要对经常变动的数据加索引

3,小数据量的表不需要加索引

4,索引应该加在常用来查询的字段上

8.权限管理和数据备份

sqlyog 可视化管理

 sql命令操作

用户表:MySQL.user

用户管理:

 数据库备份:

为什么要备份

1.保证重要的数据不丢失

2.数据转移

mysql数据备份的方式

1.直接拷贝物理文件data

2.在sqlyog这种可视化工具中手动导出

3.使用命令行导出mysqldump 命令行使用

 备份数据库文件,防止数据丢失。

9.规范数据库设计

三大范式

三大范式
第一范式(1NF)
原子性:保证每一列不可再分

第二范式(2NF)
前提:满足第一范式

且每张表只描述—件事情

需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)。如果满足第一范式,并且主键只有一个属性的那就一定是第二范式,因为如果主键只有一个属性值那就意味着已经消除了部分函数依赖

第三范式(3NF)
前提:满足第一范式和第二范式
第三范式需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关
(规范数据库的设计)
规范性和性能的问题
1关联查询的表不得超过三张表
2考虑商业化的需求和目标,(成本,用户体验! )数据库的性能更加重要

3在规范性能的问题的时候,需要适当的考虑一下规范性!
4故意给某些表增加一些冗余的字段。(从多表查询中变为单表查询)

5故意增加一些计算列(从大数据量降低为小数据量的查询:索引)
 

10.jdbc java

10.1数据库的驱动

程序会通过数据驱动和数据库打交道

10.2jdbc

对于开发人员只需要学习jdbc即可

 javax.sql

java.sql

还需要导入一个数据库驱动包

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值