Mysql 入门学习总结
目录:
- 一、初识Mysql
- 1. 数据库分类
- 2. MySQL简介
- 3. MySQL安装
- 4. Sqlyog 或者 Navicat for MySQL软件安装
- 二、操作数据库
- 1. 操作数据库
- 2. 数据库列类型
- 3. 创建数据库
- 4. 修改表
- 三、MySQL的数据管理
- 1. 外键
- 2. DML语言(背)
- 3. 添加
- 4. 修改
- 5. 删除
- 四、查询数据(重点)
- 1. select 和 去重
- 2. 模糊查询
- 3. 联表查询
- 4. 分页排序查询
- 5. 子查询
- 6. 分组和过滤
- 五、MySQL常用函数
- 5.1 常用函数
- 5.2 聚合函数
- 5.3 MD5加密
- 六、事务
- 七、索引
- 1. 索引的分类
- 2. 索引使用
- 3. 索引原则
- 八、权限管理和备份
- 1. 权限管理
- 2. 数据备份
- 九、三大范式
- 十、JDBC(重点)
- 1.statement对象
- 2. PreparedStatement对象
- 3. Java操作事务
- 4. 数据库连接池
一、初识Mysql
1. 数据库分类
关系型数据库: (SQL)
① Mysql、Oracle、Sql Server、DB2、SQLlite;
② 通过表和表之间,列和列之间的关系进行数据的存储;
非关系型数据库: (No SQL ,Not Only)
① Redis、MongDB;
② 非关系型数据库,对象存储通过对象自身的属性来决定;
DBMS 数据库管理系统:
① 数据库的管理软件,科学有效的管理我们的数据,维护和操作数据;
2. MySQL简介
① MySQL是一个关系型数据库管理系统,体积小,速度快,成本低;
② 适合中小型网站,或者大型网站,集群;
3. MySQL安装
建议使用压缩包安装,因为卸载容易;
① 解压,将解压文件放在一个自己的环境目录下;
② 添加环境变量;
③ 在mysql-5.7.19下新建一个my.ini文件;
④ 配置my.ini文件:[mysqld] basedir=D:\Environment\mysql-5.7.19\ datadir=D:\Environment\mysql-5.7.19\ port=3306 skip-grant-tables
⑤ 启动管理员模式下的CMD,并将路径切换到mysql的bin目录下,然后输入mysqld-install(安装mysql);
⑥ 输入mysqld --initialize-insecure --user=mysql
初始化数据文件;
⑦ 然后再net start mysql
启动mysql,使用命令mysql -u root -p
进入mysql管理界面(密码可以为空);
⑧ 进入界面后更改root密码;update mysql.user set authentication_string=password("123456") where user='root' and Host='locahost';
最后使用flush privileges
刷新权限;
⑨ 修改my.ini文件删除最后一句skip-grant-tables;
① 重启mysql,net stop mysql
和net start mysql
;
② 连接测试:mysql -uroot -p123456
4. Sqlyog 或者 Navicat for MySQL软件安装
下一个可视化软件
二、操作数据库
mysql关键字不区分大小写;
1. 操作数据库
创建数据库:
create database [if not exists] xxx
删除数据库:
drop database [if exists] xxx
使用数据库:
use xxx
查看所有的数据库:
show database
连接数据库:
mysql -uroot -p123456
修改密码:
update mysql.user set authentication_string=password("123456") where user='root' and Host='locahost';
刷新权限:
flush privileges;
查看数据库中所有的表:
show tables;
显示一个表的所有信息:
describe xxx;
SQL的注释:
单行注释--
,多行注释:/* */
2. 数据库列类型
数值:
- tinyint 非常小的数据 1个字节
- smallint 较小的数据 2个字节
- mediumint 中等大小的数据 3个字节
int 标准整数 4个字节
- bigint 较大的数据 8个字节
- float 单精度浮点数 4个字节
- double 双精度浮点数 8个字节
- decimal 字符串形式的浮点数 金融计算的时
字符串:
- char 字符串固定大小的 0~255
varchar 可变字符串 0~65535
- tinytext 微型文本 2^8-1
text 文本串 2^16-1 保存大文本
时间日期:
- data YYYY-MM-DD 日期格式
- time HH:mm:ss 时间格式
datatime YYYY-MM-DD HH:mm:ss 最常用时间格式
timestamp 时间戳 1970.1.1到现在的毫秒数
- year 年份表示
null:
- 没有值,不能用来计算
3. 创建数据库
create table if not exists `student`(
`id` int(4) not null auto_increment comment '学号',
`name` varchar(20) not null default '匿名' comment '姓名',
`password` varchar(20) not null default '123456' comment '密码',
`email` varchar(20) default null comment '邮箱',
primary key(`id`)
)engine=innodb default charset=utf8
查看创建数据库的sql语句:
show create database 数据库名
查看创建表的sql语句show create table 表名
显示表的结构:desc 表名
4. 修改表
修改表名:
alter table 旧表名 rename as 新表名
添加表字段:alter table 表名 add 字段名 列属性
修改表的字段:
- 修改约束:
alter table 表名 modify 字段名 列属性
- 字段重命名:
alter table 表名 change 旧字段名 新字段名 列属性
删除表的字段:
alter table 表名 drop 字段名
删除表:drop table if exists 表名
三、MySQL的数据管理
1. 外键
一般不使用!!!
方式一: 创建表时添加
create table if not exists `student`( ..... key `FK_gradeid`(`gradeid`) constraint `FK_gradeid` foreign key(`gradeid`) references `grade`(`gradeid`) )
方法二: 添加约束
alter table `student` add constraint `FK_gradeid` foreign key(`gradeid`) references `grade`(`gradeid`);
2. DML语言(背)
3. 添加
语法:
insert into 表名([字段1,字段2,...]) values('值1','值2',...),('值1','值2',...)
4. 修改
语法:
update 表名 set 列名1=值1,[列名2=值2...] where [条件]
条件:
不等于:<> 或者 != 在某个范围:betwwen x and x
5. 删除
语法:
delete from 表名 where 条件
清空一个表:
truncate 表名
delete 和 truncate的区别:
- truncate 会重新设置自增列,计数器从0开始;
- truncate不会影响事务;
delete删除问题:重启数据库现象
- InnoDB:自增列会从1开始,因为存在内存中的,断电即失;
- MyISAM:继续从上一个自增量开始,因为存在文件中,不会丢失;
四、查询数据(重点)
1. select 和 去重
# 查询全部
select * form student
# 查询指定字段
select id,name from student
# 使用别名
select id as 学号,name as 姓名 from student
# 使用连接函数
select concat('姓名:',name) as 新名字 from student
# 查询90~100的数据
select * from student where grade>=90 and grade<=100
select * from student where grade between 90 and 100
去重: distinct
select distinct id from student
2. 模糊查询
Like:
# 查询姓宁的同学 select * from student where name like '宁%' # 查询姓宁,两个字的同学 select * from student where name like '宁_' # 查询姓名中有宁的同学 select * from student where name like '%宁%'
In:
# 查询在1 2 3 内的学生 select * from student where id in(1,2,3)
3. 联表查询
select s.studentNo,s.studentName,r.subjectId,r.grade
from student as s left join result as r
on s.studentNo= r.studentNo# 查询缺考的同学
select s.studentNo,s.studentName,r.subjectId,r.grade
from student as s left join result as r
on s.studentNo= r.studentNo
where r.grade is null# 查询 参加了考试的同学(学号,姓名,科目名,分数)
select studentNo,studentName,subjectName,grade
from student s
right join result r on s.studentNo = r.studentNo
inner join subject sub on r.subjectNo = sub.subjectNo
操作 | 描述 |
---|---|
inner join | 两表中只要一个匹配就返回行 |
left join | 根据左表是否存在来返回行 |
right join | 根据右表是否存在来返回行 |
自连接:
select a.name as '父名字',b.name as '子名字' from people as a,people as b where a.id = b.pid
4. 分页排序查询
分页limit:
limit 起始行,页面大小 limit (n-1)*pageSize,pageSize
排序 order by:
# 降序 order by grade desc # 升序 order by grade asc
5. 子查询
# 查询 高等数学 且成绩大于80学生的(学号和姓名)
select studentNo,studentName from student where studentNo in (select studentNo from result where grade >= 80 and r.subjectNo = (select subjectNo from subject where subjectName = '高等数学')
)
6. 分组和过滤
# 查询不同课程的平均分,最高分,最低分,且平均分大于80
select subjectName,avg(grade) as 平均分,max(grade) as 最高分,min(grade) as 最低分
from result r
inner join subject sub on r.subjectNo = sub.subjectNo
group by r.subjectNo
having 平均分 > 80
五、MySQL常用函数
5.1 常用函数
绝对值:
abs(-8)
向上取整:ceiling(9.4)
向下取整:floor(9.4)
随机数0~1:rand()
判断符号:sign(-10)
字符串长度:char_length("15645")
合并字符串:concat("A","B")
插入替换字符串:insert(str,pos,len,newstr)
转小写:lower()
转大写:upper()
返回第一次出现字串的位置:instr("ning","i")
替换字符串:replace(str,from_str,to_str)
截取字符串:substr(str,pos,len)
反转:reverse(str)
当前日期:current_data()
,now()
5.2 聚合函数
函数名称 | 描述 |
---|---|
count() | 计数 |
sum() | 求和 |
avg() | 平均值 |
max() | 最大值 |
min() | 最小值 |
5.3 MD5加密
# 插入数据时加密
insert into student(id,name,password) values(1,'ning',MD5('123456'))
# 验证
select * from student where name='ning' and password=MD5('123456')
六、事务
事务原则:
- 原子性:事物操作要么都发生,要么都不发生;
- 一致性:事物前后数据的完整性必须保持一致;
- 隔离性:事物之间相互隔离;
- 持久性:事务结束,数据不会随着外界原因导致数据丢失;(事物没提交-恢复原数据,事物提交-持久化到数据库)
隔离所导致的一些问题:
- 脏读:指一个事务读取了另一个事务未提交的数据;
- 不可重复度:在一个事务内读取表中的某一行的数据,多次读取结果不同;
- 幻读:指一个事务内读取到了别人的事务插入的数据,导致前后读取不一致;
执行事务:
- mysql是默认开启事务提交的;
手动处理事务: 1. 关闭自动提交 set autocommit = 0 2. 事务开启 start transaction # 标记一个事务的开始,从这个之后sql都在一个事务内部 insert xxx insert xxx ..... 3. 提交:持久化,成功 commit 4. 回滚:失败 rollback 5. 事务结束,开启自动提交 set autocommit = 1 # 了解: savapoint 保存点名 # 设置一个事务的保存点 rollback to savapoint 保存点名 # 回滚到保存点 release savapoint 保存点名 # 撤销保存点
七、索引
MySQL官方对索引的定义:索引是帮助MySQL高效获取数据的数据结构,提取句子主干,就可以得到索引的本质。
1. 索引的分类
主建索引(primary key): 唯一标识,不可重复,只能一个列作为主键;
唯一索引(unique key): 避免重复列的出现,唯一索引可以重复,多个列都可以标识为唯一索引;
常规索引(key/index): 默认的;
全文索引(fulltext): 在特定的数据库引擎下才有,MyISAM,可快速定位数据;
2. 索引使用
1. 显示所有的索引信息
show index from student2. 添加索引
#添加一个全文索引
alter table school.student add fulltext index `studentName`(`studentName`)
# 添加常规索引: create index 索引名 on 表(字段)
create index id_student_name on student(`name`)3. explain分析sql执行的状况
explain select * from student # 分析非全文索引
explain select * from student where match(studentName) against('宁') # 分析全文索引
3. 索引原则
① 索引不是越多越好;
② 不要对经常变动的数据加索引;
③ 小数据量的表不需要加索引;
④ 索引一般加载常用来查询的字段上;
八、权限管理和备份
1. 权限管理
① 可视化操作;
② 使用sql命令:1.创建一个用户 create user '用户名' identified by '密码' 2.修改当前用户密码 set password = password('密码') 3.修改指定用户的密码 set password for ning = password('新密码') 4.给用户重命名 rename user '旧名' to '新名' 5.给用户授权(全部,除了给别人授权) grant all privileges on *.* to ning 6.查询权限 show grant for ning 7.撤销用户权限:revoke 哪些权限 在哪个库撤销 谁 revoke all privileges on *.* from ning 8.删除用户 drop user ning
2. 数据备份
① 直接备份物理文件;
② 使用Navicat等可视化工具导出;
③ 使用命令行导出;mysqldump -h主机 -u用户名 -p密码 数据库 表名 > 保存地址 mysqldump -hlocalhost -uroot -p123456 school student >D:/ning.sql
九、三大范式
第一范式
原子性:保证每列不可再分;
第二范式
前提:满足第一范式;
一张表只描述一件事情,需要确保数据表中的每一列都和主建相关,而不能只与主键的某部分相关(主要针对联合主键而言)
第三范式
前提:满足第一第二范式;
需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关。
规范性和性能的问题:
① 考虑商业化的需求和目标,数据库的性能更加重要;
② 在性能的问题的时候,需要适当的考虑规范性;
③ 故意给某些表添加一些冗余的字段,可从多表查询到单表查询;
④ 故意添加一些计算列(从大数据大数据的查询降低到小数据量的查询:索引)
十、JDBC(重点)
SUN公司为了简化开发人员的(对数据库的统一)操作,提供了一个(Java操作数据库的)范式,俗称JDBC,这些规范的实现是由具体的厂商做。
需要的包:java.sql、javax.sql
数据库驱动:mysql-connector-java-5.1.47
1.statement对象
Java代码操作:
//1.加载驱动
Class.forName("com.mysql.jdbc.Driver");
//2.用户信息和url
String url="jdbc:mysql://localhost:3306/student?useUnicode=true&characterEncoding=utf8&useSSL=true";
String username="root";
String password="123456";
//3.连接
Connection con = DriverManagerr.getConnection(url,username,password);
//4.获取执行sql的对象
Statement statement = con.createStatement();
//5.执行sql
String sql="select * from user";
ResultSet resultSet = statement.executeQuery(sql);
//6.读取数据
while(resultSet.next()){System.out.println(resultSet.getObject("id"));...
}
//7.释放连接
resultSe.close();
statement.close();
con.close();
statement.executeQuery(); //查询操作,返回resultSet
statement.execute();//执行任何sql
statement.executeUpdate();//更新、插入、删除,返回影响行数resultSet.beforeFirst();//移动到最前面
resultSet.afterLast();移动到最后面
resultSet.next();移动到下一个
resultSet.previous();移动到前一行
2. PreparedStatement对象
PreparedStatement可以防止SQL注入,并且效率更高。
Class.forName("com.mysql.jdbc.Driver");
String url="jdbc:mysql://localhost:3306/student?useUnicode=true&characterEncoding=utf8&useSSL=true";
String username="root";
String password="123456";
Connection con = DriverManagerr.getConnection(url,username,password);//区别
PreparedStatement st = null;//1.添加
String sql = "insert into student(id,name,password) values(?,?,?)"
st = con.prepareStatement(sql);//预编译sql
st.setInt(1,5);
st.setString(2,"ning");
st.setString(3,"123456");
st.executeUpdate();//执行//2.删除//3.更新//4.查询
3. Java操作事务
Connection con = null;
PreparedStatement st= null;
ResultSet rs = null;
try{con = DriverManagerr.getConnection(url,username,password);//1. 关闭数据库自动提交,此操作会自动开启事务con.setAutoCommit(false);//开启事务//2.执行sqlString sql1="update user set money = money-100 where name='A'";st = con.prepareStatement(sql1);st,executeUpdate();String sql2="update user set money = money+100 where name='B'";st = con.prepareStatement(sql2);st,executeUpdate();//3.业务完毕,提交事务con.commit();
}catch(Exception e){try{con.rollback();}catch(Exception e1){}
}finally{//释放资源rs.close();st.close();con.close();
}
4. 数据库连接池
池化技术:准备一些预先的资源,过来就连接预先准备好的。
编写连接池:实现接口DataSource
开源的数据源实现:DBCP、C3P0、Druid
DBCP: commins-dbcp-104、commons-pool-1.6
C3P0: c3p0-0.9.5.5、mchange-commons-java-0.2.19
// 创建一个c3p0-config.xml的配置文件<default-config name="MySQL"><property name="driverClass">com.mysql.jdbc.Driver</property><property name="jdbcUrl">jdbc:mysql://localhost:3306/******</property><property name="user">root</property><property name="password">123456</property></name-config>
CombopooledDataSource dataSource=new CombopooledDataSource (); //从配置文件中获取配置
Mysql 入门学习总结相关推荐
- MySQL入门学习的第一节(SQL语句)
MySQL入门学习的第一节(SQL语句) SQL语句
- php入门教程ppt,PHP与MySQL入门学习指南.ppt
<PHP与MySQL入门学习指南.ppt>由会员分享,可在线阅读,更多相关<PHP与MySQL入门学习指南.ppt(18页珍藏版)>请在人人文库网上搜索. 1.PHP5與MyS ...
- MySQL入门学习教程
文章目录 1.初始MySQL 1.1.为什么学数据库 1.2.什么是数据库 1.3.数据库分类 1.4.MySQL简介 1.5.安装MySQL 1.6.连接数据库 2.操作数据库 2.1.操作数据库 ...
- MySQL入门学习:组合查询
一.组合查询 多数SQL查询都只包含从一个或多个表中返回数据的单条SELECT语句.MySQL也允许执行多个查询(多条SELECT语句),并将结果作为单个查询结果集返回.这些组合查询通常称为并(uni ...
- Mysql入门学习第三章(学习DQL语句)
第三章 DQL数据查询语言 重点,DQL是我们每天接触编写最多也是最难的sql,该语言用来查询记录,不会修改数据库和表结构: 一.构建数据库 学习之前我们需要创建数据库并填充部分数据: drop TA ...
- Mysql入门学习第二章(学习sql语句)
SQL学习(重要) SQL SQL是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询.更新和管理关系数据库系统.(用人话说就是通过程序能看懂的方式告诉mysql程序怎么做) ...
- 【转】MYSQL入门学习之十:视图的基本操作
转载地址:http://www.2cto.com/database/201212/176775.html 一.视图的基本介绍 www.2cto.com 视图是虚拟的表.与包含数据的表不一样,视图 ...
- mysql 自定义函数入门_【转】MYSQL入门学习之十三:自定义函数的基本操作
转载地址:http://www.2cto.com/database/201212/177382.html 一.自定义函数(UDF)的特性和功能 www.2cto.com 函数能分返回字符串,整数或实 ...
- 【转】MYSQL入门学习之七:MYSQL常用函数
转载地址:http://www.2cto.com/database/201212/175864.html 一.数学函数 www.2cto.com ABS(x) ...
- MySQL入门学习之——MySQL Cluster初体验
最近有一位朋友咨询了我一个MySQL Cluster的问题,实话实说,这个东东我还没玩过,不过既然遇到了它,那么就开始体验一把吧.朋友的问题如下: "MySQL集群是不是只能新增数据同步,而 ...
最新文章
- Makefile选项 CFLAGS LDFLAGS
- 第十二节 VMware View 6.0 菜鸟入门 部署和安装2008 R2 RDS服务
- 初学者宝典:C语言入门基础知识大全(下)
- oracle_sqlserver和mysql获取表外键的方法_mysql、sqlserver、oracle三种数据库维护索引、外键、字段语法总结...
- Bootstrap中过渡效果(Transition)模态框插件的使用案例
- Docker配置国内镜像加速
- python函数分为哪几种_python数据挖掘常用工具有哪几种?
- 简析面向对象中的继承,原型链,闭包之继承
- windows下安装MinGW及C++的环境配置
- 【滤波跟踪】基于多源信息融合算法实现多旋翼无人机组合导航系统含Matlab源码
- 哔哩哔哩电脑版怎么下载视频?
- 学点简单的Python之Python生成器
- MISC总结——隐写术(一)
- xcode 软件˙∆集~
- vue 封装图片预览组件
- iphone桌面横屏设置在哪里_苹果手机怎么设置横屏切换
- nginx服务器中url重写rewrite参数和例子
- python自制免费代理IP服务
- JAVA实现MD5带盐加密_MD5加盐加密
- D. Riverside Curio
热门文章
- MultipartFile和File互转
- MAMP Pro 6 mac强大的本地服务器环境软件套装
- 电脑文件管理,教你一键将大量文件夹名称翻译成英文
- thinkphp创建临时表
- 60万奖金“人脸攻防大战”,全部进阶妙招奉上丨独家公开课实录(3)
- python 阿里云平台合成语音(TTS)
- H264(AVC)/H265(HEVC)/H266(VVC):GOP的区别
- python跑神经网络_程序员深夜用Python跑神经网络,只为用中二动作关掉台灯!
- mysql+查询触发器+sql_Mysql基本查询、视图、索引、触发器
- 一文带你浅入浅出Keepalived