MySql学习笔记

MySQL中的数据类型

数据类型,指的是数据表中的的列支持存放的数据的类型

数值类型

在MySQL中有多种数据类型可以存放数值,不同的类型存放的数值的范围或者形式是不同的

类型内存空间大小范围说明
tinyint1byte有符号 -128127<br/>无符号0255特小型整数(年龄)
smallint2byte有符号-32768~32767
无符号 0~65535
小型整数
mediumint3byte有符号 -231~231-1
无符号0~2^32-1
中型整数
int/integer4byte整数
bigint8byte大型整数
float4byte单精度
double8byte双精度
decimaldecimal(10,2)表示数值一共有10位,小数位有两位

字符串类型

存储字符序列的类型

类型字符序列的长度范围说明
char0~255字节定长字符串,最多可以存储255个字节,当我们指定数据表字段为char(n),此列中的数据最长为n个字符,如果添加的数据小于n,则补’\u0000’至n长度
varchar0~65535字节可变长度字符,此类型的类最大长度是65535
tinyblob0~255字节存储二进制字符串
blob0~65535字节存储二进制字符串
medium0~1677215存储二进制字符串
longblob0~4294967295存储二进制字符串
tinytext0~255文本数据(字符串)
text0~65535文本数据(字符串)
mediumtext0~1677215文本数据(字符串)
longtext0~4294967295文本数据(字符串)

日期类型

在MySQL数据库中,我们可以使用字符串存储时间,但是我们如果需要基于时间段进行查询操作就不便于查询实现,

日期在插入时记住要加单引号

类型格式说明
date2021-09-13日期,只存储年月日
time11:12:13时间,只存储时分秒
datetime2021-09-13 11:12:13日期+时间,存储年月日时分秒
timestamp20210913 111213日期+时间,存储
year2021年份

DDL,数据库操作

数据库操作

DDL(data definition language)

用于数据库的创建、查询、修改、删除。

主要的命令有CREATE、ALTER、DROP等,DDL主要是用在定义或改变表(TABLE)的结构,数据类型,表之间的链接和约束等初始化工作上,他们大多在建立表时使用

查询数据库

#显示当前mysql中的数据库
show databases;
#显示指定名称的数据库的创建的SQL指令
show create database <db_name>;

创建数据库

#创建数据库
create database <db_name>;
#创建数据库,当指定名称数据库不存在时执行创建
create database if not exists <db_name>;
#创建数据库的同时指定数据库的字符集
create database <db_name> character set utf8;

修改数据库

#修改数据库的关键词
alter database <db_name> character set gbk;

删除数据库 删除数据库时会删除数据库中所有的数据表以及数据库中所有的值

#删除数据库
drop database <db_name>;
#如果数据库存在则删除数据库
drop database if exists <db_name>;

数据表操作

数据表实际上就是一个二维的表格,一个表格是由多个列组成的,表格中的每一列称之为表格的字段。

创建数据表

create table <table_name>(
属性1 数据类型,
属性2 数据类型,
属性3 数据类型
);

查询数据表

#查询数据表
show tables;
#查询表的结构
desc <tableName>;

删除数据表

#删除数据表
drop table <tableName>;
#当数据表存在时删除数据表
drop table if exists <tableName>;

修改数据表:

alter table 表名 +

#修改数据表名称
alter table <tableName> rename to <newTableName>;
#数据表也是有字符集的,默认字符集与数据库一致
alter table <tableName> character set utf8;
#添加字段(添加列)
alter table <tableName> add 字段名称 数据类型;
#修改字段名和列的类型
alter table <tableName> change <oldClumnName> <newClodumnName> <type>;
#只修改字段类型
alter table <tableName> modify <columnName> <newType>;
#修改字段的排列顺序
alter table <tableName> modify <columnName1> <type> first|after <columnName2>;
#删除字段
alter table <tableName> drop <columnName>;

完整性约束

在创建数据表的时候,指定的对数据表的列的数据限制性的要求(对表中列的数据进行限制)

(1)实体完整性:可以保证数据的唯一性。可以使用主键约束与唯一性约束来定义。
(2)参照完整性:一个表中某个字段的取值要参照另一个表的主键。使用外键约束来定义。
(3)域完整性:又称为用户自定义完整性。可以针对某个列的取值由用户定义约束的规则。

为什么要给表中的列添加约束?

  • 保证数据的有效性
  • 保证数据的完整性
  • 保证数据的正确性

字段常见的约束性有哪些?

  • 非空约束(not null):限制此列的值必须提供不能为null

  • 唯一约束(unique):在表中的多条数据,此列的值不能重复。(唯一约束的语法和主键约束差不多,唯一约束的属性可以为空不能重复)

  • 主键约束(primary key):非空+唯一,能够唯一标识数据表中的一条数据

  • 外键约束(foreign key):建立不同表之间的关联关系。

主键约束

实体完整性

主键–就是数据表中记录的唯一标识,在一张表中只能有一个主键(主键可以是一个列,也可以是多个列的组合)

任意一张表必须要定义主码,而且一张表只能有一个主码。根据主码包含的列数(单属性码:只包含一个属性,一般是实体的码、多属性码:包含多个属性,一般是用来表示联系的[多对多])

当以一个字段声明为主键之后,添加数据时

  • 此字段数据不能为null
  • 此字段数据不能重复

创建表时添加主键约束

#定义单属性码
create table books(
	book_isbn char(4) primary key,
	book_name varchar(10) not null,
    book_author varchar(6)
);

或者

create table books(
	book_isbn char(4),
	book_name varchar(10) not null,
    book_author varchar(6),
    primary key(book_isbn)
);

删除数据表主键约束

alter table <tableName> drop primary key;

创建表之后添加主键约束

alter table books modify book_isbn char(4) primary key;
或者
#如果主键已经有数据可能会添加失败
alter table books add primary key(book_isbn);

联合主键

联合主键–将数据表中的多列组合在一起设置为表的主键

多属性码

定义联合主键(多属性码)

creat table grades(
	stu_num char(8),
    course_id int,
    score int,
    primary key(stu_num,course_id)
);

注意:在实际企业项目数据库设计中,联合主键使用频率并不高;当一张数据表中没有明确的字段可以作为主键时,我们可以额外添加一个ID字段作为主键

主键的自动增长

在创建一张数据表时,如果数据表中有列可以作为主键(例如:学生表中的学号、图书表中的ISBN)我们可以直接将这个字段设为主键。

当有些数据表中没有合适的列作为主键时,我们可以额外定义一个与记录本身无关的列(id)作为主键,此列数据无具体的含义主要用于表标识一条记录,在mysql中我们可以将此列定义为int,同时设置为自动增长,当我们向数据表中新增一条记录时,无需提供id的值,它会自动生成

定义自动增长列

  • 定义int自动增长的列:auto_increment
create table types(
	type_id int primary key auto_increment,
    type_name varchar(20) not null,
    type_remark varchar(100)
);
#数据表已经创建增加自动增长列
alter table 表名 modify 字段名 数据类型 auto_increment;
#删除auto_increment
alter table 表名 modify 字段名 数据类型;

注意:自动增长从1开始,每添加一条记录,自动的增长的列会自动+1,当我们把某条记录删除之后再添加数据,自动增长的数据重复生成(自动增长只保证唯一性不保证连续性)

#从特定值开始自增
create table types(
	type_id int primary key auto_increment,
    type_name varchar(20) not null,
    type_remark varchar(100)
)auto_increment=666;
#修改默认递增值
set @@ auto_increment_increment=2;#设置自动增长的数量是2
#也是可以实现的,但比较麻烦,要去修改配置文件。在[mysqld]里面添加
auto_increment_increment=2;#设置自动增加的数量是2

字段默认值

指定默认值之后,如果在插入数据时没有添加字段数据,该字段就是默认是默认值

默认值不是约束

create table stu(
	s_id char(11) primary key,
    s_name char(20),
    s_gender char(2) default '男',
    s_nation char(4) default '汉族'
);

外键约束

参照完整性

表示一对多的联系,一方称为父表,多方称为子表。把父表的主码添加到子表中

参照完整性:限制外码

  • 外码可以取空值
  • 如果不取空值,必须从与之对应的父表的主码中取值

创建表的同时创建外键约束

create table 表名(
属性1,数据类型,
属性2,数据类型,
……
[CONSTRAINT 约束名] FOREIGN KEY (列名) REFERENCES 表名 (列名)
);

为已有的表添加外键约束;

alter table 表名 add foreign key(外键字段名) references 父表名(列名);

删除外键:删除外键需要先查看外键约束的名称,使用show create table 表名;

删除外键
alter table 表名 drop foreign key 外键约束名称;

唯一索引unique约束

UNIQUE 约束与 PRIMARY KEY 约束的区别和联系
(1)唯一性约束所在的列允许空值,但是主键约束所在的列不允许空值。
(2)可以把唯一性约束放在一个或者多个列上,这些列或列的组合必须有唯一的。但是,唯一性约束所在的列并不是表的主键列。
(3)唯一性约束强制在指定的列上创建一个唯一性索引。
(4)一个表最多只有一个主键,但可以有多个唯一键。
(5)UNIQUE 约束 = PRIMARY KEY 约束 + NOT NULL 。
创建表时同时添加唯一约束

create table 表名(
属性1,数据类型 unique,
属性2,数据类型
);

在所有列定义完之后定义外键约束

create table 表名 (
    列名 类型 ... ,
    [constraint 约束名] unique(列名)
);
说明:该方法可以指定约束名。可以使用【show index from 表名; 】命令查看索引名。

创建表之后添加unique约束

alter table 表名 [constraint 约束名] add unique(列名);

删除unique约束

删除 UNIQUE 约束之前可以使用 【show index from 表名; 】查看 UNIQUE 约束的名称。删除 UNIQUE 约束的命令格式如下:

alter table 表名 drop index 约束名;

非空约束

创建表时,所有字段默认可以取空值,如果需要将某个字段定义为不允许取空值,可以使用非空约束(NOT NULL)。语法格式如下:

create table 表名(
    列名 类型 not null,
    ....
);

删除非空约束:

如果需要使某个字段允许取空值,只需要修改该字段的属性,去掉 not null 选项即可。

alter table 表名 modify 字段(字段类型);

默认值约束

创建表时可以使用 DEFAULT 为某个字段设置默认值,语法如下:

create table 表名 (
    <字段名> <数据类型> DEFAULT <默认值>,
    ....
);

删除字段的默认值
当一个表中的列不需要设置默认值时,就需要从表中将其删除。删除默认值约束的语法格式如下:

ALTER TABLE <表名> MODIFY <字段名> <数据类型> DEFAULT NULL;
或者
alter table <表名> alter column <字段名> drop default; 

为某个字段添加默认值

添加默认值的语法格式如下:

ALTER TABLE <表名>
MODIFY <字段名> <数据类型> DEFAULT <默认值>;
或者
ALTER TABLE <表名> ALTER COLUMN <字段名> SET DEFAULT <默认值>;

DML数据操作语言

DML(data manipulation language)

用于完成对数据表中数据的插入、删除、修改操作

它们是SELECT、UPDATE、INSERT、DELETE,就象它的名字一样,这4条命令是用来对数据库里的数据进行操作的语言

删除、更新、插入:涉及到数据的修改,有权限的限制

create table stus(
	s_num char(8) primary key,
    stu_name varchar(20),
    stu_gender char(2)
)

插入数据

insert into <tableName> (stu_num,stu_name,stu_gender) values('20200214','张三','男');
#或则
insert into <tableName> values('20200214','张三','男');
#批量插入数据
insert into <tableName> (字段名1,字段名2 ,…) values(1,2,),(1,2,),;

#创建新数据表备份已有数据表
create table <newTable> select * from <oldTable> where conditaion;
#把一个数据表中指定的字段插入另一个数据表
insert into <table1> select 字段1,字段2 from <table2>;

删除数据

#从数据表中删除满足特定条件(所有)的数据
delete from <tableName> where conditions;
#如果删除语句没有where子句,则表示删除当前数据库的所有记录(敏感操作)
delete from <tableName>;等价于 truncate 表名;--truncate删除全部数据耗时非常短,原因是delete删除会写日志

实例:

#删除学号为20200214的学生信息
delete from stus where stu_num='20200214';
#删除年龄大于20的学生信息
delete from stus where stu_age>20;

修改(更新)数据

对数据表中已经添加的记录进行修改

#一般来讲都要加上where,不加where子句话修改的就是一整列
update <tableName> set <columnName>=value [where conditions];

示例:

##将学号为20210105的学生姓名修改为“孙七”(只修改一列)
update stus set stu_name='孙七' where stu_num='20210105';
##将学号为20210103的学生性别修改为男,同时将QQ修改为777777(修改多列)
update stus set stu_gender='男',stu_qq='777777' where stu_num='20210103';

权限管理

MySQL数据的安全性

删除、更新、插入:涉及到数据的修改,有权限的限制

不可能所有的数据库使用者都使用root账号

//创建用户
create user msk@localhost indendified by '123';
create user wgx@localhost indendified by '123';
create user hmj@localhost indendified by '123';
create user cmx@localhost indendified by '123';
//授权
grant select,delete,insert,update on <databaseName> to msk;
grant select,delete,insert on <databaseName>.<tableName> to wgx;
grant select,insert,update on <databseName> to hmj;
grant select(<table_column1>,<table_column2>) on <databaseName> to cmx;--cmx只能看到某数据库

DQL数据查询语言

DCL(Data Query Language)

数据查询语言DQL基本结构是由SELECT子句,FROM子句,WHERE子句组成的查询块:SELECT <字段名表>FROM <表或视图名>WHERE <查询条件>

从数据表中提取满足特定条件的记录

  • 单表查询
  • 多表联合查询

查询基础语法

#select 关键字后指定要显示查询到的记录的哪些列
select colnumName1[,colnumName2,colnumName3,...] from <tableName>
#查询所有列,用*表示查询所有列
select * from <tableName>;

where子句

再删除、修改及查询的语句后都可以添加where子句(条件),用于筛选满足特定的添加的数据进行删除、修改和查询操作

delete from <tableName> where conditions;
update <tableName> set ... where conditions;
select ... from <tableName> where conditions;

条件关系运算符

between v1 and v2 [v1,v2]

大于(>)、小于(<)、大于等于(>=)、小于等于(<=)、等于(=)、不等于(!= 或者 <>)

# = 等于
select * from stus where stu_num='20200102';
# != <>不等于
select * from stus where stu_num!='20200102';
select * from stus where stu_num<>'20200102';
# > 大于
select * from stus where stu_age>18;
# < 小于
select * from stus where stu_num<20;
# >= 大于等于
select * from stus where stu_num>=20;
# <= 小于等于
select * from stus where stu_age<=20;
# between and 区间查询   between v1 and v2 [v1,v2]
select * from stus where stu_age between 18 and 20;

条件逻辑运算符

and、or 、not

在where子句中,可以将多个条件通过逻辑运算符进行连接,通过多个条件来筛选要操作的数据。

# and 并且 筛选多个条件同时满足的记录
select * from stus where s_age>18 and s_gender='女';
# or 或者 筛选多个条件中至少满足一个条件的记录
select * from stus where s_age>18 or s_gender='女';
# not 取反
select * from stus where stu_age not between 18 and 20;

LIKE子句

在where子句的条件中 ,我们可以使用like关键字来实现模糊查询

语法

select * from <tableName> where columnName like 'reg';
  • 在like关键字后面的reg表达式中
    • %表示任意多个字符【%o%包含字母o】
    • _表示任意一个字符【_o%第二个字母为o】

对查询结果的处理

设置查询的列

声明显示查询结果的指定列

select columnName1,columnName2,...  from stus where stu_age>20

对从数据表中查询到的记录的列进行一定的运算之后显示出来

## 出生年份 = 当前年份 - 年龄
select stu_name,2021-stu_age from stus;

字段别名

我们可以给查询结果的列名取一个语义性更强的别名

select stu_name,2021-stu_age as stu_birth_year from stus;

消除重复行

#从查询结果中消除重复行 distinct
select distinct s_age from stus;

order by排序

将查询到的满足条件的记录按照指定的列的值升序/降序排序

#单字段排序
select * from <tableName> where conditions order by columnName asc|desc;
  • order by columnName表示将查询结果按照指定列排序
    • asc按照指定列升序(默认)
    • desc按照指定的列降序

多字段排序

#先满足第一个排序规律规则,当第一个列的值相同时再按照第二个列的规律排序
select * from stu where s_age>15 order by s_gender asc,s_age desc; 

聚合函数

在SQL中提供了一些可以对查询的记录列进行计算的函数–聚合函数

  • count()统计函数,统计满足条件的指定字段值的个数(记录数)

    #统计学生表中学生总数
    select count(stu_num) from stus;
    #统计学生表中性别为男的学生总数
    select count(stu_num) from stus where stu_gender='男';
    
  • max()计算最大值,查询满足条件的记录中指定列的最大值

    select max(stu_age) from stus;
    
    select max(stu_age) from stus where stu_gender='男';
    
  • min()计算最小值,查询满足条件的记录中指定列的最小值

    select min(stu_age) from stus;
    
    select min(stu_age) from stus where stu_gender='男';
    
  • sum() 计算和,查询满足条件的记录中,指定的列的总和

    #计算所有学生年年龄的总和
    select sum(stu_age) from stus where stu_gender='男';
    
  • avg() 求平均值,查询满足条件的记录中 计算指定列的平均值

    select avg(stu_age) from stus where stu_gender='男';
    

日期函数

当我们向日期类型的列添加数据时,可以通过添加字符串类型赋值(字符串的格式必须为yyyy-MM–dd hh:mm:ss),如果我们想要获取当前系统时间添加到日期类型的列,可以使用now()或者sysdate()

#通过字符串类型 给日期类型的列赋值
insert into stus values('20210102','张宇','男','2021-10-16 16:05:54');
#通过now()或者sysdate()获取当前时间
insert into stus values('20210102','张宇','男',now());
insert into stus values('20210102','张宇','男',sysdate());

数据库事务

把多个SQL操作当成一个整体。事务:一个最小的不可再分的工作单元;通常一个事务对应一个完整的业务(例如银行账户转账业务,该业务就是一个最小的工作单元),同时这个完整的业务需要执行多次的DML(insert、update、delete)语句共同联合完成。A转账给B,这里面就需要执行两次update操作。

事物的特点(ACID特性):

  1. 原子性:一个事物(transaction),中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事物在执行过程中发生错误,会被回滚(Rollback)到事物开始前的状态,就像这个事物从来没有执行过一样
  2. 一致性:在事物开始之前和事物结束之后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有预设规则,这包含资料的精确度、串联性以及后续数据库可以自发的完成预定的工作
  3. 隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。
    1. 事务隔离分为不同级别,包括 读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。
  4. 持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。

数据库设计

数据库设计流程

  1. 根据应用系统的功能,分析数据实体(实体就是要存储的数据对象)

  2. 提取实体的数据项(数据项,就是实体的属性)

  3. 根据数据库设计三范式规范视图的数据项 检查实体的数据项是否满足数据库设计三范式

  4. 绘制E-R图(实体关系图,直观的展示实体和实体之间的关系)

  5. 数据库建模

    三线图进⾏数据表设计

    PowerDesigner

    PDMan

  6. 建库建表 编写SQL指令创建数据库、数据表

  7. 添加测试数据,SQL测试

数据库设计三范式:

第一范式:要求数据表中的字段(列)不可再分

第二范式:不存在非关键字段对关键字段的部份依赖,[这里关键字段指的是联合主键]

第三范式:不存在非关键字段之间的传递依赖

  • 16
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值