MySQL数据库基础

MySQL数据库

1.数据库设计原理

1.数据库特点

数据库:是按照一定结构组织并长期存储在计算机内的、可共享的大量数据集。

2.ER模型

(1)实体

表示现实世界具有相同属性描述的事物集合,一种类别所有事物的统称。

一个ER图包含多个实体,每个实体由实体名唯一标记,每个实体对应数据库中的一张数据表,每个实体具体的取值对应数据表中的一条记录。

ER图中用矩形框表示具体的实体。

(2)属性

表示实体的特征,也可以表示实体间关系的特征。每个实体包含多个属性,每个属性由属性名唯一标记,画在椭圆内。ER图中的实体的属性对应数据库表的字段。

属性是一个不可再分的最小单元。

(3)联系

联系是数据之间的关联集合。

在ER图中,联系用菱形表示,框内写联系名,用连线将联系框与它所关联的实体连接起来。

两个实体的联系有一对一(1:1),一对多(1:n),多对多(m:n)

3.ER设计原则

(1)属性应该存在并且只存在一个地方。

(2)实体是一个单独的个体不能存在于另一个实体中成为属性。

(3)同一个实体在同一个ER图中只出现一次。

4.ER图到关系模型模型转换

(1)实体

一个实体对应一个关系模型,实体的名称就是关系模型的名称,实体的属性就是关系模型的属性,实体的码就是关系模型的码。

(2)联系的转换

  • 1:1联系转换

    方法一:将1:1联系转换为一个独立的关系模式,与该联系相连的各实体的码以及联系本身的属性均转换为关系模式的属性,每个实体的码应该都是该关系模式的码。

    方法二:与任意一端对应的关系模式合并,合并时候,需要将该联系的属性加入另一个关系模式中。

  • 1:n联系转换

    方法一:转换为一个独立的关系模式,与该联系相连的各实体的码以及联系本身的属性均转换为关系模式的属性,而关系模式的码为n端的实体的码

    方法二:与n端对应的关系模式合并,在该关系模式中加入1端实体的码和联系本身的属性。

  • m:n联系转换

将联系转换一个独立的关系模式,联系的码必须由所关联的实体的码共同标识,与该联系关联的实体的码和联系本身属性为关系模式的属性

5.关系基本术语

  1. 元组:也叫记录,关系表中每行对应一个元组。

  2. 属性:关系中每列对应一个域,每列的名字叫做属性。

  3. 候选码:能够唯一标识一个元组。

  4. 主码:也叫主键,主关键字

    作用:唯一标识关系的每行、作为关联表的外键,链接两个表、使用主码值来组织关系的存储、使用主码索引快速检索数据。

  5. 全码:是候选码的特例,关系模式的所有属性都是候选码。

6.关系完整性

1.实体完整性

如果属性A是关系R的主属性,属性A不能取空值。

2.参照完整性

如果属性F是关系R的外码,它与关系S的主码K相对应,对于R中的每个元组在F上的值必须是:取空值或者等于S中的某个元组的主码值。

主码和外码值的域要相同。

3.用户完整性

用户定义的数据要规范。

2.数据库存储引擎

查看引擎

SHOW ENGINES;或者SHOW ENGINES \G

1.InnoDB

支持事物安全表,支持行锁定和外键,具有提交、回滚、崩溃恢复能力的事物安全存储引擎。InnoDB的表和索引在一个逻辑表空间中,表空间包含很多文件,表大小是任何大小。

2.MyISAM

每个表存在分离的文件中。不支持事务,并发相对较低。

3.MEMORY

用于创建临时数据的临时表,使用哈希索引。不能存储太大的表。

MySQL支持的字符集

SHOW CHARACTER SET;查看字符集

一般选择UTF-8,如果要支持中文选择GBK。

3.数据库操作

1.创建数据库

CREATE DATABASES或者CREATE SCHEMAL

创建一个名为stuinfo数据库,判断是否存在:CREATE DATABASES IF NOT EXISTS stuinfo;

查看数据库信息:SHOW CREATE DATABASES 数据库名称;

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| hospital           |
| information_schema |
| mysql              |
| performance_schema |
| studb              |
| studentdb          |
| studentinfo        |
| sys                |
| users              |
+--------------------+

2.修改数据库名称

ALTER DATABASES [dbname] [CHARACTER SET charset_name];

3.删除数据库

DROP DATABASES [IF EXISTS] db_name;

4.表定义

1.数据类型

1.整数类型

TINYINT、SMALLINT、BIGINT、INT/INTERGER

2.浮点数类型和定点数类型

DOUBLE、FLOAT

3.日期时间类型
  • DATE:使用NOW()、CURRENT_DATE插入当年计算机系统的日期,用于存储日期,格式’YYYY-MM-DD’

  • TIME:记录时间的值,格式’HH-ii-ss’

  • YEAR:表示年份,格式’YYYY’

  • DATATIME/TIMESTAMP:时间日期混合类型,格式’YYYY-MM-DD HH-ii-ss’

    DATATIME与当前时区无关,TIMESTAMP与时区有关。

4.字符串类型
  • CHAR(M)为固定长度字符串。
  • VARCHAR(M)是可变长度字符串
  • TEXT保存非二进制字符串即文本字符串,如文章评论等
  • ENUM类型,字段名 ENUM(‘值1’,‘值2’)
  • SET类型内部用整数表示,SET (‘值1’,‘值2’)
5.二进制类型

binary,bit,varbinary,blob等

2.运算符

1.算术运算符
运算符作用
+加法
-减法
*乘法
/,DIV除法
%,MOD取余
2.比较运算符
运算符作用
=等于
<>,!=不等于
<=>NULL安全的等于。两个操作数均为NULL,返回值为1,其中一个为NULL,返回0
<小于
<=小于等于
>大于
>=大于等于
BETWEEN min AND max在(min,max)之间
IN(value1,value2,…)在集合(value1,value2,…中)
IS NULL为NULL
IS NOT NULL不为NULL
LIKE通配符匹配,'%‘匹配任何数目字符,’_'匹配一个字符
RLIKE/REGEXP正则表达式匹配

用REGEXP运算符来匹配字符串,格式为:expr REGEXP 匹配条件

通配符
  • '^'匹配以改字符后面的的字符为开头的字符串
  • '$'匹配以该字符串前面的字符为结尾的字符串
  • '.'匹配任何一个单字符
  • […]匹配括号内的任何字符,[abc]匹配a、b、c,'-'表示字符范围, [a-z]匹配任意字母, [0-9]匹配任意数字
  • '*'匹配零个或多个在它前面的字符。
3.逻辑运算符
运算符作用
NOT/!逻辑非
AND/&逻辑与
OR/||逻辑或
XOR逻辑异或
4.位运算

1.位或运算“|”

2.位与运算“&”

3.位异或”^“

4.位左移运算<<

4.位右移运算>>

3.数据表操作

1.创建数据表

创建数据表之前要"USE<数据库名>",指定在那个数据库中操作。

用CREATE TABLE命令,同一个数据库中,表名不能重复

CREATE TABLE [IF NOT EXISTS] table_name(
    #字段定义:
    col_name type [NOT NULL| NULL] [DEFAULT default_value] [ATUO_INCREMENT] [UNIQUE[KEY]]|[PRIMARY[KEY]][COMMENT 'String']
)
2.查看数据表结构
显示表的名称

SHOW TABLES;

显示表的结构

DESCRIBE 表名;或者DESC 表名;SHOW CREATE TABLE 表名;

3.修改数据表(ALTER)
1.修改表名字

ALTER TABLE 旧表名 RENAME [TO] 新表名字;

2.修改表字段数据类型

ALTER TABLE 表名 MODIFY 字段名 数据类型;

3.修改字段名

ALTRE TABLE 表名 CHANGE 旧字段名 新字段名 新数据类型;

4.添加数据表字段

ALTER TABLE 表名 ADD 新字段名 数据类型;

5.删除字段

ALTER TABLE 表名 DROP 字段名;

6.修改字段排序

ALTER TABLE 表名 MODIFY 字段1 数据类型 [FIRST] ALTER 字段2;

表示把字段1插入到字段2之前。

7.修改表的存储引擎

ALTER TABLE 表名 ENGINE=更改后的引擎名;

8.删除表的外键约束

ALTER TABLE 表名 DROP FOREIGN KEY 外键约束名;

4.复制数据表

用CREATE TABLE复制表的结构和数据。

CREATE TABLE 表名 LIKE 复制的表名;

如:CREATE TABLE student LIKE stu;表示复制stu到student。

CREATE TABLE 表名 AS SELECT 字段1,字段2 FROM 复制的表名;

如CREATE TABLE student AS SELECT sname FROM stu;

5.删除数据表

DROP TABLE IF EXISTS 表名;

删除之前要做备份。DROP TABLE可以一次性删除一个或者多个没有被其他表关联的数据表。

删除父表之前要删除子表或者取消外键约束。

6.字段约束
1.主键约束(primary key constraint)

单个字段的主键:

表级完整性约束:PRIMARY KEY(字段名);

列级完整性约束:字段名 数据类型 [其他约束] PRIMARY KEY;

多个字段的主键:PRIMARY KEY(字段名1,字段名2);

不允许有空值。

2.外键约束(foreign key constraint)

表A外键取值要么NULL,要么表B的主键字段取值,表A是表B的子表。

表级完整性:FOREIGN KEY (表A的字段名) REFERENCES 表B(字段名);

如果表已经建好,可以用ALTER TABLE添加外键约束。

列级完整性:字段名 数据类型 REFERENCES 表B(字段名);

3.非空约束(not null constraint)

格式:字段名 数据类型 NOT NULL;

4.默认约束(default constraint)

格式:字段名 数据类型 [其他约束] DEFAULT 默认值;

5.自增约束(auto_increment constraint)

AUTO_INCREMENT初始值是1,新增一条记录,字段自动加一。一个表只能有一个字段使用自增约束,该字段必须成为主键的一部分。

要求该列唯一,允许为空,但只能出现一个空值。

格式:字段名 数据类型 AUTO_INCREMENT;

6.唯一约束(unique key)

要求该列唯一,允许为空,但只能出现一个空值。

格式:字段名 数据类型 UNIQUE;

唯一性约束的字段创建以后会自动创建唯一性索引,如果要删除唯一性约束,只需要删除唯一索引。

7.检查约束(check constraint)

格式:字段名 数据类型 CHECK(检查范围)

7.删除约束

可以用ALTER TABLE删除。删除sc表中的sc-student约束:ALTER TABLE sc DROP FOREIGN KEY sc_student;

5.表操作

1.插入

1.不指定具体的字段名,插入顺序与表字段顺序相同,类型也要对应:

INSERT INTO 表名 VALUES(值1,值2,值n);

2.列出所有字段

INSERT INTO 表名(字段1,字段2,字段n) VALUES(值1,值2,值n);

3.指定部分字段

INSERT INTO 表名(字段1,字段2,…字段m) VALUES(值1,值2,值m);

4.插入多条记录

INSERT INTO 表名[(字段名列表)] VALUES(取值列表1),(取值列表2),…;

5.从目标中插入数据

INSERT INTO 表名 [列名列表] SELECT 列名列表 FROM 表名;

2.修改

UPDATE 表名 SET 字段1=取值1,字段2=取值2,字段n=取值n WHERE 条件表达式;

3.删除

完成清除一个表用TRUNCATE命令,慎用。

1.用DELETE删除表数据:

DELETE FROM 表名 [WHERE 条件表达式];

如果没有条件表达式,会删除表中 所有数据。

2.用TRUNCATE清除表数据:

TRUNCATE [TABLE] 表名;

用于完全清空一个表。

3.TRUNCATE、DELETE、DROP区别

TRUNCATE TABLE:删除内容,释放空间但不删除定义。

DELETE TABLE:删除内容,不释放空间,不删除定义。

DROP TABLE:删除内容、释放空间、删除定义。

4.查询

1.单表查询
1.SELECT语法
SELECT [ALL|DISTINCT] 字段序列 #ALL表示显示所有行,包括重复的,DISTINCT表示消除重复行
FROM 表名或者视图名 
[WHERE 条件表达式] 
[GROUP BY 列名] #对查询结果按照指定字段进行分组
[HAVING 条件表达式] #指定分组条件
[ORDER BY 列名 [ASC|DESC]] #表示进行排序,ASC表示升序,DESC表示降序
[LIMIT 子句]; #限制查询结果输出的行数
2.简单查询

1.查询所有字段

一种是用通配符* :SELECT * FROM 表名;

一种是:SELECT 字段名1,字段名2,… FROM 表名;

2.指定字段查询

SELECT 字段名 FROM 表名;

3.对查询数据进行去除重复

SELECT DISTINCT 字段名 FROM 表名;

4.为字段名取别名

SELECT [ALL|DISTINCT] 目标表达式 [AS] [别名] [,目标表达式 [AS] [别名]] FROM 表名 [别名];

举例:查询学生的学号,成绩,指定返回结构中的列名为学号,成绩,而不是sno,grade。

SELECT sno ‘学号’,grade ‘成绩’ FROM sc;

3.条件查询

1.带IN关键字的查询

[NOT] IN(元素1,元素2,…),NOT是可选的,表示不在集合条件内

2.带BETWEEN AND关键字的查询

[NOT] BWTWEEN 取值1 AND 取值2,判断是否某个字段在取值1和取值2的范围内。

3.带IS NULL关键字查询

[IS [NOT] NULL,判断是否为空值

IS NOT NULL中IS NOT 不可以换成!= 或者<>

4.带LIKE关键字的查询

LIKE用来匹配字符串是否相等,格式为:[NOT] LIKE ‘字符串’

字符串可以是双引号也可是单引号,字符串可以是完整的,也可是包含’‘%’‘或者下划线’_'通配符的。

1.%表示任意长度的字符串,长度也可为0。

2.'_'表示单个字符。

3.用正则表达式表示字符串。格式为:属性名 REGEXP ‘匹配方式’

模式描述
^匹配以特定字符或者字符串开头的记录
$匹配以特定字符或者字符串结尾的记录
.匹配任意一个字符包括换行符
a*匹配多个该字符之前的字符,包括一个或者零个
a+匹配多个该字符之前的字符,包括一个
a?匹配零个或者一个a字符
de| ab匹配序列de或者ab
[]匹配字符集合任意一个字符
字符串{N}匹配方式中N前面的字符串至少出现N次
字符串{M,N}匹配方式M,N前面的字符串至少出现M次,最多N次
4.高级查询
4.1.分组查询

格式:GROUP BY 字段名 [HAVING 条件表达式] [WITH ROLLUP]

按照字段名进行分组,HAVING条件表达式用来限制分组后的显示,WITH ROLLUP会在所有记录的最后加上一条记录,是上面所有记录的总和。

单独使用GROUP BY 关键字,查询结果只显示一个分组的一条记录。

4.2对结果查询排序

格式:ORDER BY 字段名 [ASC|DESC]

4.3限制查询结果数量

格式:LIMIT [OFFSET,] row_count

OFFSET默认是0,表示SELECT结果集中的第一行,row_count表示返回的行数。

在student表中查找从第3名学生开始的3位学生信息:SELECT * FROM student ORDER BY sno LIMIT 2,3;

4.4聚合函数

聚合函数包括:COUNT,SUM,AVG,MAX,MIN

COUNT:统计记录条数

SUM:计算字段值的总和

AVG:计算字段值的平均值

MAX:查询字段最大值

MIN:查询字段最小值

通常GROUP BY通常和聚合函数一起用。

使用COUNT函数统计student表中的记录数:SELECT COUNT(*) AS ‘学生总人数’ FROM student;

使用COUNT函数统计student表中不同的zno值的记录数:SELECT zno,COUNT(*) AS ‘专业人数’ FROM student GROUP BY zno;

使用SUM函数统计sc表中学号111的同学成绩:SELECT sno,SUM(grade) FROM sc where sno=‘111’;

使用SUM函数,按照sno字段进行分组,统计sc表中分组的总成绩:SELECT sno,SUM(grade) FROM sc GROUP BY sno;

使用AVG函数,计算sc表中平均成绩:SELECT AVG(grade) from sc;

使用AVG函数计算sc表中不同科目的平均成绩:SELECT sno,AVG(grade) from sc GROUP BY sno;

使用MAX函数查询sc表中的不同科目的最高成绩:SELECT sno,cno,MAX(grade) FROM sc GROUP BY cno;

使用MIN函数查询sc表中不同科目的最低成绩:SELECT sno,cno,MIN(grade) FROM sc GROUP BY cno;

4.5合并查询结果

UNION关键,可以将多个SELECT 结果集合并位成单个结果集,但是要求合并的结果集对应的列数和数据类型必须相同。

SELECT …UNION SELECT …

2.多表查询

多表查询也叫连接查询,分为内连接查询和外连接查询。常见的连接查询:

INNER JOIN:组合两个表中,在公共字段有相符的值。

LEFT JOIN:包含第一个表(左表)开始的两个表的全部记录,即使第二个表(右表)中没有相符的值的记录。

RIGHT JOIN:包含第二个表(右表)开始的两个表的全部记录,即使第一个表(左表)中没有相符的值的记录。

1.内连接查询

内连接查询就是在表关系的笛卡尔积数据记录中,保留表关系中所有匹配的数据,舍弃不匹配的数据。

1.等值连接

用来连接两个表的条件为连接条件。连接条件的连接运算符是=的时候,叫做等值连接。

SELECT * FROM sc INNER JOIN course ON sc.cno = course.cno;

2.自然连接

表关系的笛卡尔积中选取满足连接条件的行。根据表中相同的名称的字段进行匹配,然后去除重复的字段。

SELECT * FROM sc NATURAL JOIN course;

3.不等值连接

SELECT * FROM sc INNER JOIN course ON sc.cno != course.cno;

2.外连接查询

SELECT 字段表 表1 LEFT|RIGHT [OUTER] JOIN 表1.字段=表2.字段

1.左外连接

左外连接的结果集包含在左表中的所有的记录,然后左表按照连接条件与右表进行连接。如果右表没有满足条件的,结果集中右表的相应的行数为NULL。

SELECT course.cno,course.name,sc.cno,sc.sno FROM course LEFT JOIN sc ON course.cno=sc.cno;

2.右外连接

右外连接的结果集包含满足连接连接条件的所有记录和右表中不满足条件的数据,左表中相应的行为NULL。

3.子查询

1.带IN关键字的子查询

查询还没选修任何课程的student记录:SELECT * FROM student WHERE sno NOT IN(SELECT sno FROM sc);

2.带EXISTS关键字的子查询

如果存在“金融专业”,查询所有课程信息:SELECT * FROM course WHERE exists(SELECT * FROM profession WHERE name=‘金融’);

3.带ANY关键字的子查询

ANY用来表示满足其中的任何一个条件,只有满足内层查询返回的结果中的一个,就可以执行外层查询。

4.带ALL关键字的子查询

表示满足所有条件,只有满足内部查询语句的所有返回结果,才能执行外层查询。>ALL表示大于所有值,<ALL表示小于所有值

6.索引

索引目的:优化数据库的查询速度。

索引有两种类型:B树索引和哈希索引。

索引优点:

  • 通过创建唯一性索引,可以保证数据库中的每行数据的唯一性
  • 加快数据检索速度
  • 加速表和表之间的连接
  • 使用分组和排序语句检索数据的时候,可以减少查询时间
  • 创建索引,在查询过程中,使用优化隐藏器,提高系统性能

索引缺点:

  • 创建索引和维护索引耗费时间
  • 索引占物理空间
  • 对数据进行增删改查的时候,需要维护索引

1.索引分类

  1. 普通索引
  2. 唯一性索引
  3. 全文索引
  4. 单列索引
  5. 多列索引
  6. 空间索引

2.索引定义

1.创建索引

1.创建表的时候创建索引

create table table_name(属性名,数据类型,[完整性约束],…,index|key [索引名] (属性名[(长度)] [asc|desc]))

2.在已经存在的表上创建索引

create index 索引名 on 表名(属性名[(长度)] [asc|desc])

3.使用alter table来创建索引

alter table table_name add index | key [索引名] (属性名[(长度)] [asc| desc])

2.创建唯一索引

创建索引时候,使用unique参数进行约束,unique index 索引名(属性名)

3.创建全文索引

全文索引只能创建在char,varchar,text类型字段上

fulltext index 索引名(属性名)

4.多列索引

在name,age字段上创建所列索引:index 索引名 (name,age)

5.查看索引

show index from 表名 [from 数据库名]

show index from 表名 from 数据库名和show index from 数据库.表名等价

6.删除索引

1.drop index 索引名 on 表名

2.alter table 表名 drop index 索引名

3.alter table 表名 drop primary key,只删除主键

3.索引设计原则和注意事项

1.选择唯一性索引

2.为需要排序、分组和联合操作的字段建立索引

3.作为查询条件的字段建立索引

4.限制索引的数目

5.使用数据量少的索引

6.使用前缀来索引

7.删除不再使用或者很少使用的索引

7.视图

1.创建视图

create [algorithm={undefined|merge|temptable}] view 视图名 [视图列表] as 查询语句 [with [cascaded|local] check option]

2.删除视图

drop view [if_exists] 视图名…[restrict|cascade]

3.查看视图定义

1.describle 视图名,desc 视图名

2.show table status like ‘视图名’

3.show create view 语句 ‘视图名’

4.修改视图定义

create or replace [algorithm={undefined|merge|temptable}] view 视图名 [视图列表] as select [with [cascaded|local] check option];

alter [algorithm={undefined|merge|temptable}] view 视图名 [视图列表] as select [with [cascaded|local] check option];

5.更新视图数据

更新视图是通过视图来插入、更新和删除表中的数据

8.触发器和事件

1.创建使用触发器

create trigger 触发器名 触发器动作时间 触发器语句类型 on 表名 for each row 触发器激活语句

2.查看触发器

show triggers

3.删除触发器

drop trigger 触发器名字

4.创建事件

create event

5.修改事件

alter event

6.删除事件

drop event [if exists] 事件名

9.事务

1.事物的四大特性ACID

1.原子性

2.一致性

3.隔离性

4.持久性

2.事务的隔离级别

1.序列化

2.可重复读

3.提交读

4.未提交读

3.事务的并发控制

1.丢失更新

2.脏读问题

3.不可重复读问题

4.幻读问题

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值