目录
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 早些年使用
myisam | innodb | |
事务支持 | 不支持 | 支持 |
数据行锁定 | 不支持 | 支持 |
外键约束 | 不支持 | 支持 |
全文索引 | 支持 | 不支持 |
表空间的大小 | 较小 | 较大,约为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 null | a is null | 如果操作符为null,则结果为真 |
is not null | a is not null | 如果操作符不为null,则结果为真 |
between | a between b and c | 如果a在b到c之间则结果为真 |
like | a like b | sql匹配 ,如果a匹配b则结果为真 |
in | a 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
还需要导入一个数据库驱动包