MySQL学习(上篇)
mySQL学习目录
问题集
1.解压完成后,进行安装时cmd命令行报错:
解决方法:检查并修改my.ini中的配置文件格式,包括:port = 3306改为port=3306(=两边不能有空格),以及utf8后的空格依次删除保存,还将新建的data文件删除(data会自动生成)
这里的可控变量为两个,到底是两个都要满足才是修改成功还是只删除空格就足够了呢,还未可知,记录下来。
其他格式上还有双斜杠的问题,我只改了一个目前没发现什么影响
附上cmd命令行中的指令
配置好环境变量后,去到cmd操作时可以不再拘泥于bin目录下进行,more密码为无,直接敲回车即可。
安装Navicat
表引擎:innoDB是什么 Navicat表头 = 表的字段
MySQl基础
MySQL概述与基本操作
1.什么是数据库
数据库(Database)就是按照数据结构来组织,存储和管理数据的仓库 专业的数据库是专门对数据进行创建,访问,管理,搜索等操作的软件,比起我们自己用文件读写的方 式对象数据进行管理更加的方便,快速,安全
2.数据库的特点
- 对数据进行持久化的保存
- 方便数据的存储和查询,速度快,安全,方便
- 可以处理并发访问
- 更加安全的权限管理访问机制
3.常见的数据库
- 关系型数据库: MySQL,Oracle,PostgreSQL,SQLserver。。。。
- 非关系型数据库:Redis内存数据库,MongoDB文档数据库。。。
4.关于数据库的一些概念
数据库 Database 数据表 Tables 数据字段 行 row 列
基本操作
有三种方法:可以通过命令行直接操作,也可以通过图形界面工具,Navicat进行操作,还能通过编程语言执行mysql命令。
SQL(结构化查询语言)语言分为四个部分:DDL(定义)、DML(操作)、DQL(查询)、DCL(控制)
SQL语言中的快捷键:\G格式化输出(文本式 竖立显示)、\s查看服务器端信息、 \c结束命令输入操作、\q退出当前sql命令行模式、\h查看帮助
操作数据库的步骤
show databases;
show tables; —查看当前库中所有的表
select *(所有列) from 表名;
desc 表名; ----查看表结构
show create table 表名\G;(\G表示格式化结果)—查看创建表时的语句
数据库与数据类型
MySQL的数据类型
在设计表时,应该特别重视所用的数据类型。使用错误的数据类型可能会严重地影响应用程序的功能和性能。
更改包含数据的列不是一件小事(而且这样做可能会导致数据丢失)。
回到点上来,那么有哪些数据类型呢:
- 字符串类型
很常用,存储串、如名字、地址、电话号码、邮政编码等。两种基本的串类型为:定长串char、变长串varchar
2. 定长串:char
3. 接受长度固定的字符串,其长度是在创建表时指定的。 定长列不允许存储多于指定长度字符的数据。
4. 指定长度后,就会分配固定的存储空间用于存放数据
eg:char(10) 不管实际插入多少字符,它都会占用10个字符位置
5. 变长串 varchar
存储可变长度的字符串 varchar(10) 如果实际插入4个字符, 那么它只占4个字符位置,当然插入的数据长度不能超过10个字符。
当然,考虑到性能,mysql处理char比varchar快得多。但不论是哪个,其()里最大为255,再多可选用text边长文本类型存储。
6. 数值类型
与字符串不同,数值类型不用放在引号内。
比较常用的包括:decimal(5,2)表示数值共5位,小数占2位
float tinyint:1字节(8位)存正数:0-255 ,-128-127
int:4字节 0-42亿+ -21亿~21亿
7. 日期和时间类型
datetime:8字节1000-01-01 00:00:00 ~ 9999-12-31 23:59:59
8. 二级制数据类型
二进制数据类型可存储任何数据(甚至包括二进制信息),如图像、多媒体、字处理文档等
表的字段约束
9. unsigned 无符号(给数值类型使用,表示为正数,不写可以表示正负数都可以)
10. 字段类型后面加括号限制宽度
11. not null 不能为空,在操作数据库时如果输入该字段的数据为NULL ,就会报错
12. default 设置默认值
13. primary key 主键不能为空,且唯一.一般和自动递增一起配合使用.主键是索引之一
14. auto_increment 定义列为自增属性,一般用于主键,数值会自动加1
15. unique 唯一索引(数据不能重复:用户名)可以增加查询速度,但是会降低插入和更新速度
MySQL的运算符
16. 数据库特有的比较: in、not in、is null、is not null、like、between、and
17. 逻辑运算符: and、or、not
18. like: 支持特殊符号%和_ (%表示任意数量的任意字符) _表示任意一位字符
存储引擎
mySQL服务器把数据的存储和提取操作都封装到了一个叫存储引擎的模块里。表是由一行一行的记录组成,而物理上表如何记录、读取和写入数据到具体的物理存储结构可能不同,采用的存储算法也可能不同。
myISAM和InnoDB表引擎的区别
1)事务支持:myisam不支持事务,innoDB支持事务
2)存储结构:my在磁盘上存储成三个文件,.frm .MYD存数据 .MYI存索引;in主要分为两种文件存储,.frm 存表结构 .ibd存数据加索引
3)表锁差异:my只支持表级锁,innoDB支持行级锁,但其行锁是基于索引建立,若索引失效或没有使用索引,那么会有行锁升级为表锁 。
表锁、共锁、行锁是什么(面试点)
4)主键
5)表的具体行数:my保存表的总行数,in没有存,所有select count() from table;时会遍历整个表,但加where后my和in一样。
6)CURD操作:如果要执行大量select使用my,若要执行大量insert update使用innodb。
7)外键:my不支持,in支持。
8)查询效率:
9)应用场景:
mySQL中的utf8和utf8mb4
mySQL中utf8是utf8mb3的别名
DML-数据库的增删改
添加数据
格式:insert into 表名(字段列表)values (值列表)
修改数据
格式:update 表名 set 字段1=值1,字段2=值2…where 条件
DQL-数据库查询SQL
检索数据select
检索单个列:select name from stu
检索多个列:select name,age,sex from stu
检索所有列:select * from stu 实际开发中少用
检索不同的行distinct:放在查询列的前面
限制结果limit (分页):select * from stu limit 3,4 limit 3,4含义是从行3开始的4行(跳过前3行,取4行),替代语法包括:limit 4 offset 3
使用完全限定的表名:select stu.name from stu
排序数据order by
按多个列排序:select * from stu order by classid,age desc(降序 ) limit 4
过滤数据where
同时使用order by和where子句,where要在前
操作符:between…and…
同时用and和or的情况下,注意要使用(1 or 2)and,注意优先级
in和not:in操作符用来指定条件范围,范围中每个条件可以进行匹配。in的用法和or接近。 not in()指排除数据
in操作符的优点:in操作符一般比or操作符执行更快,in的语法更清晰直观。in的最大优点是可以包含其他select语句,使得能够更动态地建立where子句。
通配符的使用
like与通配符一起使用:在如搜索学生姓氏的条件下,需要使用通配符,而通配符的使用必须使用like操作符。
like ‘%a%’,like ‘%a’,like ‘a%’
like ‘a_’,表两个字符以a开头,下划线只匹配单个字符而不是多个字符
注意事项:通配符搜索花费时间长。把_ %放在前面花费时间最长
正则regexp
字段的计算
拼接Concat:拼接两个列,select concat(name,’(‘phone’)’) from stu
使用别名AS:select concat(name,’(,‘phone’)’) from stu as name_phone from stu
常用函数
SQL支持利用函数来处理数据,开发人员一般不怎么用,都在java代码里实现较好
文本处理函数:日期和时间处理函数:数值处理函数:
聚集函数与分组Group by:
聚集函数的使用:汇总数据时,count()返回某列的行数null值不统计。
数据分组Group by与having
group by:返回每个班级人数:select class_id,count() as nums from stu group by class_id 分组是把数据分类多个逻辑组,以便能对每个组进行聚集计算
having:分组后再对数据进行处理 select class_id,count() as nums from stu group by class_id having nums>=5; having主要是用来对分组后的数据来处理,where过滤行having过滤分组
数据库备份及授权
当项目完成后,交付项目时
数据导出
- 数据库数据导出:mysqldump -u root -p 库名 > ~/Desktop/code/库名.sql
- 将数据库中的表导出:mysqldump -u root -p 表名 > ~/Desktop/code/库
数据导入
mysql -u root -p ops < ./库名.sql
mysql -u root -p ops < ./库名.sql
权限管理
mysql中的root用户是数据库中权限最高的用户,千万不要用在项目中。
可以给不同的用户、或项目,创建不同的mysql用户,并适当授权,完成数据库的相关操作,这样在一定程度上保证了数据库的安全。
grant 授权的操作 on 授权的库.授权的表 to 账户@登录的地址 identified by ‘密码’;
删除用户:drop user ‘lisi’@’%’;