MySQL数据库知识

数据库服务器:

数据库是按照一定的形式组织存储数据,便利数据的操作----增删改查

1.数据库发展历史

网状数据库  ->  层次型数据库  ->  关系型数据库  ->  非关系型数据库(NoSQL)  

2.关系型数据库逻辑结构

Server  ->  Database  ->  Table  ->  Row  ->  Column

(服务器->数据库->数据表->行->列)

一.服务器端

负责存储维护数据,管理数据

从硬件看:就是一台计算机

从软件看:提供各种服务

通过IP地址/域名找到这台计算机,使用端口号找到对应的服务

启动文件位置:c:/xampp/mysql/bin/mysqld.exe

二.客户端

连接服务器,操作服务端的数据

客户端文件:c:/xampp/mysql/bin/mysql.exe

两种形式:DOS窗口/可视化工具

使用客户端连接服务器端:

mysql.exe         -h127.0.0.1 -p3306 -uroot -p    //简化:mysql -uroot(结尾不能加分号)

-h        host        127.0.0.1/localhost        自己的电脑的IP

-p        port        端口

-u        user        用户名,mysql默认有一个管理员账户root

-p        possward        密码,xampp下MySQL的密码默认为空

查看现在mysql的管理员:

三.SQL语句

结构化查询语言,专门用来操作数据库的语言,而且是一个标准语言,可以操作任何数据库

1.运行方式

(1).交互模式(适用于临时性的查看数据)

在客户端输入一行,点击回车,服务器端就会执行一行

(2).脚本模式(适用于批量的操作数据)

客户端把执行的命令是写在一个脚本文件中,然后一次性的提交给服务器执行

mysql -uroot<拖拽脚本文件      回车没有任何显示代表成功

2.SQL命令语法规范

一条SQL命令可以跨越多行,以英文的分号作为结束

SQL命令不区分大小写,建议关键字大写,非关键字小写

假设某一条命令出现语法错误,则此命令往后都不会执行

注释分为:单行注释(#..)和多行注释(/*...*/),注释的代码不会被服务器执行

四.SQL分类

DML:数据库的操纵语言,就是对数据库的操作(新增,修改,查询,删除)

DDL:数据库的定义语言,比如说创建表

DCL:数据库的控制语言,比如说权限管理:grant(授权)/revoke(收权)

DQL:数据库的查询语言,比如说进行复杂的查询语句

五.数据库的常见操作

1.新建库

//丢弃数据库,如果存在的话

drop database if exists 数据库名

//确定此刻电脑没有这个数据库

create database 数据库名字

//进入数据库

use 数据库名称

//设置新创建的库的编码格式(防止出现乱码)

create database 数据库名字 (default character set utf8)

注意:以下命令只会执行一段时间,只修改一次编码格式,临时防止中文乱码

set names gbk;

mysql中文乱码产生的原因:

默认使用Latin-1编码格式导致的

解决中文乱码:

1)脚本文件另存为的编码为utf-8

2)客户端连接服务器的编码为utf-8

3)服务器端创建数据库存储字符的字符为utf-8

//查看创建的数据库编码格式

show create database 数据库名

//查看当前数据库编码格式

show database 数据库名

2.查询此电脑中的所有数据库

show databases

3.查看MySQL版本号

select version()

4.删除数据库(慎重!!!!)

drop databases 数据库名字

5.退出数据库

exit/quit

六.数据表的操作

1.操作数据表的前提,指定表所处的数据库

use 数据库名

补充:查看当前运行的是哪个数据库

select database()

2.查询表

show tables

3.创建表

create table 表名(字段名称 字段类型(字段长度),字段2,字段3...)

字段长度:int类型的限制不住,无需设置长度,其他的字符串必须在规定长度内否则报错

4.修改表

alter table 表名 add column 列名 类型(值)

alter table 表名 drop column 列名

5.删除表

drop table 表名

6.描述表(查看表结构,有多少列)

desc 表名

七.记录的常见操作

1.查询表里的所有记录

select * from 表名

2.新建记录

insert into 表名 values (值1,值2...)

注意:

1)values后面括号里要写几个值需要参考表里字段的个数(个数要匹配)

2)值的意义:要和字段的顺序位置匹配,每个值交给每个对应的字段来保存

3)值的写法细节:如果值中有varchar数据类型,注意要写引号

3.修改记录某一条id对应的记录,修改多个列用逗号隔开

update 表名 set 字段=新值(where id =1 )

4.删除某一条id对应的记录

delete from 表名(where id = 10)

5.排序

select * from 表名 order by 表里的某一列 desc;

6)记录总数

select count(*) from 表名

如何存储中文字符:

GB2312:对常用的6000多汉字进行了编码,兼容ASCII

GBK:对2万多汉字进行了编码,兼容GB2312

Unicode:对世界上主流国家常用的语言进行了编码,具体有三种存储方案,分别是utf-8,utf-16,urf-32

小练习:

补充:列类型(注:标红的是常用的)

在创建数据表的时候,指定的列存储的数据类型

1.数值型----值可以不加引号

tinyint 微整型,占1个字节,范围:-128~127

smallint 小整型,占2个字节,范围:-32768~32767

int 整型,占4个字节,范围:-2147483648~2147483647

bigint 大整型,占8个字节

float 单精度浮点型,占4个字节,存储的数字越大精度越低

double 双精度浮点型,占8个字节,存储的数字越大精度越低

decimal(M,D) 定点小数,小数点不会发生变化,M代表总的有效位数,D代表小数点后的有效位数

boolean 布尔型,只有两个值,分别是true和false,用于存储只有两个值的数据,例如:性别...

使用的时候自动转为tinyint;把true转为1,false转为0,也可以直接插入1或者0

true和false是关键字,使用的时候不能加引号

2.日期时间型----值必须加引号

date  日期型 '2022-01-04'

time  时间型 '15:21:30'

datetime  日期时间型 '2022-01-04 15:21:30'

3.字符串型----值必须加引号

varchar(M) 变长字符串,有几个剩余空间都用1个空格:\0来填充;不会产生空间的浪费,数据的操作速度相对慢,常用于存储变化长度的数据,例如:文章的标题,内容等;M的最大值是65535

char(M) 定长字符串,有几个剩余空间就用几个空格:\0来填充;使用不当,可能会产生空间浪费,数据的操作速度相对快,常用于存储固定长度的数据,例如:手机号码,身份证号码等;M的最大值是255

text(M) 大型变长字符串,M的最大值是2G

char(5)varchar(5)
aa\0\0\0\0a\0
abab\0\0\0ab\0
一二三一二三\0\0一二三\0

数据库中如何存储图片呢?        ----直接写一个列名 列类型(长度大一点)

八.列约束

概述:MySQL可以对插入的值进行验证,只有符合条件才允许插入;通过不同的方式,给不同的字段添加不同的约束,实现不同的表的效果

位置:列类型的后面

常见的字段约束:非空约束/唯一约束/主键约束等

通常在设计表时,就已经设计好了表里的一些字段约束

自增列:auto_increment

注意:会自动增长,在插入值的时候只需要赋值为null,就会获取最大值然后加1插入

必须配合着整数形式的主键列使用  允许手动赋值!!!!                

id int primary key auto_increment

1.主键约束(primary key)

如果给一个列添加了主键约束,那么这个列就是主键(会按照从小到大进行排列),主键的特点是唯一且不能为空(null),通常情况下,每张表只能有一个主键约束

说明:一般是给编号列,这样会加快数据的查询速度

null:表示空,是一个暂时无法确定的值,例如:暂时无法确定一个员工的手机号码,无法确定一个学生的成绩... null是关键字,使用的时候不能加引号

2.非空约束(not null)

哪个字段添加了非空约束,那么那个字段的值不允许插入null,使用not null来实现

create table 表名(password varchar(10) not null)

3.唯一约束(unique)

注意:

1.声明了唯一约束的列不允许插入重复的值,但是允许为null,甚至多null也可以;

2.可能会影响排序

3.一个表中可以有多个唯一约束

4.默认约束(default)

哪个字段添加了默认约束,那个字段的值就有了默认值,使用default来实现

实现方式1:插入值的时候,没有出现的列自动应用默认值

实现方式2:在要使用默认值的地方直接写default关键字,会自动调用默认值

5.检查约束(check

注:mysql不支持,认为会严重影响数据的插入速度        解决方法:交给后端那些语言

哪个字段添加了默认约束,那个字段的值就要通过检查才能保存成功(了解即可)

6.外键约束-foreign key(外键列) references 主键所在的表(主键列)

注意1:为了节省内存,要插入的值必须得在另一个表的主键列中出现过

注意2:外键列要和对应的主键列类型要保持一直

注意3:子表里的主键的值,必须取自于主表

注意4:主表里的记录想要删除时,必须保证子表里没有引用才行 

九.基础函数

SQL中可以通过不同条件来查询数据;满足条件的数据查出来,不满足的就查不出来

1.LOWER & UPPER(转小写&转大写)

2.LENGTH & SUBSTR & CONCAT(数据长度&截取&拼接)

 

3.REPLACE & IFNULL & ROUND(替换&如果为空进行数字替换&四舍五入取整)

 

4.日期函数 & 转义字符

 

十.条件查询

1.简单查询

1.1查询特定的列

select 列名1,列名2... from 数据表

1.2查询所有的列

select * from 数据表

1.3给列起别名

select 列名1 as 别名,列名2 as 别名 from 数据表

注:as可以省略不写

1.4查询时执行计算

select 列名(+ - * /) 别名 from 数据表

1.5显示不同的记录

去除重复的:

select distinct 列名 from 数据表

注意:不加排序规则,默认是按升序排列

1.6查询的结果排序

降序  select * from 数据表 order by 列名 desc

升序  select * from 数据表 order by 列名 asc

如果数据相同,按照备选条件排序  select * from 数据表 order by 列名1 asc,列名2 asc

1.7条件查询

where 当什么时候

可以结合: >   <  >=  <=  =  !=        and/&&并且        or/||或者   is null/not is null          in()/not in()使用

1.8模糊条件查询

包含的两个字符:        % 匹配任意个字符        _匹配任意一个字符

注:以上两个字符必须结合关键字like使用

'%a%'前后包含a的记录

'_a%'第二个字符是a的记录

1.9分页查询

查询的结果中有太多数据,一次显示不完可以做成分页

条件:当前的页码以及每页显示的数据量

like:查询的结果中有太多数据,一次显示不完可以做成分页
条件:当前的页码以及每页显示的数据量
算法:每页开始查询的值=(当前的页码-1)*每页显示的数据量
语法:select * from 数据表 limit 开始查询的值,每页显示的数据量
注意:limit后的两个值必须写数字,不能加引号

2.复杂查询

2.1聚合查询

聚合函数:是一个功能体,需要提供若干个数据返回结果

求总数量:count()        求和:sum()        平均:avg()        最大:max()        最小:min()        获取日期中的年份部分:year()

2.2分组查询group by 

分组查询:建立在聚合查询基础之上的,通常只查聚合函数和分组条件

分组后的过滤:having                group by ... having

2.3子查询

多个查询命令的组合,把一个的结果作为另一个的条件使用

2.4多表查询

select 一张表.列名,另一张表.列名 from 数据表1,数据表2 where 一张表.外键对应的列=另一种表.主键的列;

把两个表的数据都拼接整合在一起:

笛卡尔积:下面这种查询表的方式:

select * from 表1,表2(表和表之间用逗号分隔)

注意1:一般笛卡尔积没有实际的业务意义,但是多表查询都是先生成笛卡尔积,再进行数据的筛选过滤

注意2:有的公司禁止3张表以上的联查,原因:查询过程中,现在内存中构建一个大大的结果集,然后再进行数据的过滤;在这个构建过程中,所使用的内存资源,过滤的判断都会既浪费时间又浪费资源


2.4.1内连接(inner join...on)

和之前的查询结果一致

select 一张表,另一张表 from 数据表 inner join 另一张数据表 on 一张表外键对应的列=一张表主键对应的列;

2.4.2左外连接(left outer join...on)

显示左侧表中所有的记录,先写的哪个表哪个表就是左表

select 一张表,另一张表 from 数据表 left outer join 右表 on 一张表外键对应的列=一张表主键对应的列;
注:左外连接中outer关键字可以省略

2.4.3右外连接(right outer join...on)

显示右侧表中所有的记录,后写的哪个表哪个表就是右表

select 一张表,另一张表 from 数据表 right outer join 右表 on 一张表外键对应的列=一张表主键对应的列;

注:右外连接中outer关键字可以省略

2.4.4全连接 full join on(但是,mysql不支持)

同时显示左侧和右侧所有的记录,就是把左外和右外结果进行联合
    union 联合后,合并相同的记录
    union all 联合后,不合并相同的记录
格式:左外连接 关键字:union/unionall 右外连接

十一.事务

1.概述:英文叫transaction,主要作用是用来保证多条SQL语句成功运行,要么全成功要么全失败

2.四大特征:

原子性:同一个事务里的多条SQL语句是一个原子,密不可分的,要么全成功要么全失败

一致性:保证多台服务器里的数据是一致的

隔离性:数据库为了提高操作的效率允许高并发的访问,隔离性保证了数据的安全性(采用锁机制)

持久性:是指我们对数据库的操作(增删改)是持久性的

3.隔离级别

read uncommitted: 读未提交,安全性最差,但是效率高.

read committed: 读已提交,安全性有所提升,但是效率降低一些.也是Oracle数据库的默认隔离级别

repeatable read : 可重复读,安全性有所提升,但是效率又会低一些.也是MySQL数据库的默认隔离级别

Serializable: 串行化,安全性最高,但是性能最低

4.事务管理的方式

方式1:使用MySQL数据库为我们提供的自动事务管理,默认会为每条SQL语句提供事务

方式2:手动管理事务,必须有两个过程:开启事务  ... 结束事务(commit提交 / rollback回滚,相当于这个事务为执行)

十二.表关联association

概念:表关联代表了表之间的关系,如:部门和员工,商品和商品分类,老师和学生,教室和学生。同时,也要知道,表并不都有关系,它们形成自己的小圈子。如商品和商品详情一圈,部门和员工一圈,出圈就可能没关系了,如商品和员工无关,商品和学生无关。

表的关系分为四种:

一对一 one to one 比如:员工和员工编号

一对多 one to many 比如:部门和员工

对多一 many to one 一对多反过来的,比如员工和部门

多对多 many to many 比如老师和学生

表的设计特点:

1)表都以s结束,标识复数

eg:create table courses

2)字段多以表的首字母作为开头,在多表联查中,方便标识出是哪个表的字段(做到"见名知意")

eg:cno varchar(5) not null

插入测试数据:(直接把表名-字段名-对应的值的内容整合在一起)

eg:INSERT INTO COURSES(CNO,CNAME,TNO)VALUES ('3-105' ,'计算机导论',825);

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

18年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值