码迷,mamicode.com
首页 > 数据库 > 详细

MySQL基础

时间:2021-04-20 15:37:59      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:text   cond   替换   prim   reference   字符串类型   表达   default   唯一性   

MySQL基础

1.概述

1.1 数据库

数据库是长期存储在计算机内有组织、有共享、统一管理的数据集合

存储位置:

  • 基于磁盘的数据库 mysql sqlserver oracle。数据存储文件中。IO 读写 效率偏慢 数据持久(永久保存)

  • 基于内存的数据库 redis 效率比较快 数据有可能丢失(不影响)

关系上:

  • 关系型数据库 mysql sqlserver oracle 表与表 字段与字段之间 数据与数据之间有关系。

  • 非关系型数据库 redis

 

1.2 MySQL数据库

优势:

  • 速度:运行速度快

  • 价格:社区版免费

  • 容易使用:相对来说复杂程度低,易于学习

  • 可移植性:能工作在不同系统平台上

  • 接口丰富:提供多种语言的API接口

  • 支持查询语言:可以利用标准sql语法和ODBC(开放式数据库连接)的应用程序

  • 安全性和连接性:

  • 安全灵活的权限和密码系统,允许主机验证,服务器的密码连接加密;

  • 网络化提高数据共享的效率

数据库-->表(table)-->表字段:数据类型,约束,数据

数据库表由横向的行和纵向的列组成:

行称为记录,是组织数据的单位;

列称为字段,每一列表示记录的一个属性;

 

1.3 SQL

SQL(Structured Query Language)是“结构化查询语言”,它是对关系型数据库的操作语言。

 

语法:

  • SQL语句可以单行或多行书写,以分号结尾;

  • 可以用空格和缩进来来增强语句的可读性;

  • 关键字不区别大小写,建议使用大写;

 

分类:

  • DDL(Data Definition Language):数据定义语言,用来定义数据库对象:库、表、列等;

  • DML(Data Manipulation Language):数据操作语言,用来定义数据库记录(数据);

  • DCL(Data Control Language):数据控制语言,用来定义访问权限和安全级别;

  • DQL(Data Query Language):数据查询语言,用来查询记录 select

 

2.DDL

2.1 连接显示

连接指定计算机上mysql的server:

mysql -uroot [-hip] -p

mysql -uroot -h127.0.0.1 -p

  • 查看mysql的server里面有哪些数据库: show databases;

  • 选择使用特定的数据库: use 数据库的名称;

  • 查看指定数据库下所有的表: show tables;

  • 查看表里面所有的数据: select * from 表名;

  • 查看表的表结构: desc 表名;

2.2 基本操作

数据库操作

  • 创建数据库: create database [if not exists] 数据库名; (数据库名称不可更改)

  • 修改数据库: alter database 库名 character set 字符集名;

  • 删除数据库: drop database 数据库名;(连着表/数据都一块删除,数据无法回滚)

数据表操作

  • 查看创建数据库基本信息 show create database 数据库名;

  • 创建表 create table 表名(

    字段1 数据类型 [约束],

    字段2 数据类型 [约束],

    字段n 数据类型 [约束]

    );

  • 添加列 alter table 表名 add column 列名 类型 【first|after 字段名】;

  • 修改列的类型或约束 alter table 表名 modify column 列名 新类型 【新约束】;

  • 修改列名 alter table 表名 change column 旧列名 新列名 类型;

  • 删除列 alter table 表名 drop column 列名;

  • 修改表名 alter table 表名 rename 【to】 新表名;

    rename table tname_old to tname_new;

  • 删除表 drop table【if exists】 表名;

  • 复制表的结构 create table 表名 like 旧表;

  • 复制表的结构+数据 create table 表名 select 查询列表 from 旧表【where 筛选】;

 

2.3 数据类型

2.3.1 整型

tinyintsmallintmediumintint/integerbigint
1B 2B 3B 4B 8B

特点: ①都可以设置无符号和有符号,默认有符号,通过unsigned设置无符号 ②如果超出了范围,会报out or range异常,插入临界值 ③长度可以不指定,默认会有一个长度 长度代表显示的最大宽度,如果不够则左边用0填充,但需要搭配zerofill,并且默认变为无符号整型

2.3.2 浮点型

定点数:decimal(M,D) 参数m<65 是总个数,d<30且 d<m 浮点数: float(M,D) 4B double(M,D) 8B

①M代表整数部位+小数部位的个数,D代表小数部位 ②如果超出范围,则报out or range异常,并且插入临界值 ③M和D都可以省略,但对于定点数,M默认为10,D默认为0 ④如果精度要求较高,则优先考虑使用定点数

2.3.3 字符

char、varchar、binary、varbinary、enum、set、text、blob

char:固定长度的字符,写法为char(M),最大长度不能超过M,其中M可以省略,默认为1 varchar:可变长度的字符,写法为varchar(M),最大长度不能超过M,其中M不可以省略

 

2.3.4 日期

year年 date日期 time时间

datetime 日期+时间

timestamp 这个字段里的时间数据会随其他字段修改的时候自动刷新

2.4 约束

2.4.1 约束

  • NOT NULL:非空,该字段的值必填

  • UNIQUE:唯一,该字段的值不可重复

  • DEFAULT:默认,该字段的值不用手动插入有默认值

  • CHECK:检查,mysql不支持

  • PRIMARY KEY:主键,该字段的值不可重复并且非空 unique+not null

  • FOREIGN KEY:外键,该字段的值引用了另外的表的字段

2.4.2 主键和唯一

任意类型的字段都可以充当主键,一张表有且只有一个主键

1、区别:

  • ①一个表至多有一个主键,但可以有多个唯一

  • ②主键不允许为空,唯一可以为空

2、相同点

  • 都具有唯一性

  • 都支持组合键,但不推荐

2.4.3 外键

alter table 表名 add constrant 外键名 foreign key (外键表的引用列) references 主键表(主键列)

主外键是构成表与表关联的唯一途径

外键是另一张表的主键

  1. 用于限制两个表的关系,从表的字段值引用了主表的某字段值

  2. 外键列和主表的被引用列要求类型一致,意义一样,名称无要求

  3. 主表的被引用列要求是一个key(一般就是主键)

  4. 插入数据,先插入主表;删除数据,先删除从表 可以通过以下两种方式来删除主表的记录

  • 级联删除

    ALTER TABLE stuinfo ADD CONSTRAINT fk_stu_major FOREIGN KEY(majorid) REFERENCES major(id) ON DELETE CASCADE;

  • 级联置空

    ALTER TABLE stuinfo ADD CONSTRAINT fk_stu_major FOREIGN KEY(majorid) REFERENCES major(id) ON DELETE SET NULL;

  • SET FOREIGN_KEY_CHECKS = 0; 删除完成后设置 SET FOREIGN_KEY_CHECKS = 1;

2.4.4 操作

1.创建表添加约束

create table 表名( ? 字段名 字段类型 not null,#非空 ? 字段名 字段类型 primary key,#主键 ? 字段名 字段类型 unique,#唯一 ? 字段名 字段类型 default 值,#默认 ? constraint 约束名 foreign key(字段名) references 主表(被引用列)

)

注意: ? 支持类型 可以起约束名 列级约束 除了外键 不可以 表级约束 除了非空和默认 可以,但对主键无效

列级约束可以在一个字段上追加多个,中间用空格隔开,没有顺序要求

 

2.修改表时添加或删除约束

  • 1、非空 添加非空 alter table 表名 modify column 字段名 字段类型 not null; 删除非空 alter table 表名 modify column 字段名 字段类型 ;

  • 2、默认 添加默认 alter table 表名 modify column 字段名 字段类型 default 值; 删除默认 alter table 表名 modify column 字段名 字段类型 ;

  • 3、主键 添加主键 alter table 表名 add【 constraint 约束名】 primary key(字段名); 删除主键 alter table 表名 drop primary key;

  • 4、唯一 添加唯一 alter table 表名 add【 constraint 约束名】 unique(字段名); 删除唯一 alter table 表名 drop index 索引名;

  • 5、外键 添加外键 alter table 表名 add【 constraint 约束名】 foreign key(字段名) references 主表(被引用列); 删除外键 alter table 表名 drop foreign key 约束名;

2.4.5 自增长列

auto_increment

特点:

  1. 不用手动插入值,可以自动提供序列值,默认从1开始,步长为1

    如果要更改起始值:手动插入值

    如果要更改步长:更改系统变量

    set auto_increment = 值;

  2. 一个表至多有一个自增长列

  3. 自增长列只能支持数值型

  4. 自增长列必须为一个key

  • 创建表时设置自增长列

    create table 表(

    字段名 字段类型 约束 auto_increment

    )

  • 修改表时设置自增长列

    alter table 表 modify column 字段名 字段类型 约束 auto_increment

  • 删除自增长列

    alter table 表 modify column 字段名 字段类型 约束

 

3.DML

3.1.insert

  • 对所有的字段新增数据

    insert into 表名 values (数据1,数据2...数据n),(数据1,数据2...数据n);

  • 对指定的字段新增数据(推荐)

    insert into 表名 (字段1,字段2...字段n) values (数据1,数据2...数据n);

  • 编码处理

    不能添加中文数据:需要更改mysql服务的编码格式。

mysql的server: 默认的编码格式 latin 改成utf8

mysql的核心配置文件: my.ini

66 default-character-set=utf8

100 character-set-server=utf8

3.2.delete

delete from 表名 [where 条件 ]; 清空表数据 多条记录受影响

3.3.update

update 表名 set 字段名1 = 值1,字段名2 = 值2 [where 条件];多条记录受影响

 

4.DQL

DQL就是数据查询 select 语言,数据库执行DQL语句不会对数据进行改变,而是让数据库发送结果集给客户端。

写法顺序:select--from--where--group by--having--order by

执行顺序:from--where--group by--having--select--order by

4.1 基本查询

  1. 查询单个字段select 字段名 from 表名;

  2. 查询多个字段select 字段名,字段名 from 表名;

  3. 查询所有字段select * from 表名

  4. 查询常量select 常量值; 注意:字符型和日期型的常量值必须用单引号引起来,数值型不需要

  5. 查询函数 select 函数名(实参列表);

  6. 查询表达式 select 100/1234;

  7. 起别名 ①as ②空格

  8. 去重 select distinct 字段名 from 表名;

  9. +

    作用:做加法运算 select 数值+数值; 直接运算 select 字符+数值;先试图将字符转换成数值,如果转换成功,则继续运算;否则转换成0,再做运算 select null+值;结果都为null

  10. ifnull函数 功能:判断某字段或表达式是否为null,如果为null 返回指定的值,否则返回原本的值 select ifnull(commission_pct,0) from employees;

  11. isnull函数 功能:判断某字段或表达式是否为null,如果是,则返回1,否则返回0

  12. explain select... 查看语句查询次数

4.2 条件查询

select 查询列表 from 表名 where 筛选条件

筛选条件:

  1. 简单条件运算符

    < = <> != >= <= <=>安全等于

  2. 逻辑运算符

    && and|| or ! not

  3. 模糊查询

    like:一般搭配通配符使用,可以判断字符型或数值型

    通配符:%任意多个字符,_任意单个字符

    between and :是否满足一个区间范围 in :条件的集合 is null /is not null:用于判断null值

排序:

select 查询列表 from 表 where 筛选条件 order by 排序列表 【asc/desc】

  • asc :升序,默认升序 desc:降序

  • 排序列表支持 单个字段、多个字段、函数、表达式、别名

  • order by的位置一般放在查询语句的最后(除limit语句之外)

4.3 分组查询

4.3.1 语法

SELECT column, group_function(column) FROM table

[WHERE condition]

[GROUP BY group_by_expression]

[ORDER BY column];

WHERE一定放在FROM后面

 

4.3.2 分组(聚合)函数

聚合函数是用来做纵向运算的函数:

不能在WHERE 子句中使用组函数

可以在 HAVING 子句中使用组函数

COUNT():统计指定列不为NULL的记录行数;

MAX():计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算;

MIN():计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算;

SUM():计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0;

AVG():计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0;

 

4.3.3 过滤

HAVING 过滤分组:

  1. haivng是在分组后对数据进行过滤. where是在分组前对数据进行过滤

  2. 满足HAVING 子句中条件的分组将被显示

4.3.4 分页

limit

第一个参数:第一个返回记录行的偏移量,初始记录行的偏移量是 0

第二个参数:返回记录行的最大数目

如果只给一个参数,表示返回最大的记录行数目

假如要显示的页数为page,每一页条目数为size

select 查询列表 from 表 limit (page-1)*size,size;

总条数:all_count = select count(*) from tb;

每页:size

总页数:all_count/size

4.4 关联查询

4.4.1 多表查询

全相乘是作笛卡尔积,查询效率低,没有使用索引

SELECT table1.column, table2.column FROM table1, table2

WHERE table1.column1 = table2.column2;

  • 在 WHERE 子句中写入连接条件

  • 在表中有相同列时,在列名之前加上表名前缀,否则会报错误

4.4.2 连接多表

连接 n个表,至少需要 n-1个连接条件

1.内连接 [inner] join on 交集:

select * from table1 inner join table2 on 关联条件;

从table1中取出每一条记录,去table2中与所有的记录进行匹配: 匹配相同最才会保留结果,否则不保留.

2.外连接

  • 左外连接 left [outer] join on 左并集

左连接查询效率相比于全相乘的查询效率快,查询速度快,消耗内存小,而且使用了索引

...from table1

left join table2 on ...

left join table3 on...

多表

table1记录会全保留,而table2中不匹配的为null

 

  • 右外连接 right [outer] join on 右并集

...from table1 right join table2 on ...

 

4.4.3 联合查询

union:连接两个以上的 SELECT 语句的结果组合到一个结果集合中。多个 SELECT 语句会删除重复的数据。

union all: 会把所有的记录返回,且效率高于union 。

4.5 子查询

出现在其他语句内部的select语句,称为子查询或内查询

4.5.1 where

内层查询结果当作外层查询的比较条件

 

4.5.2 from

内层的查询结果当成临时表,供外层sql再次查询。查询结果集可以当成表看待。临时表要使用一个别名。

 

4.5.3 exists

外层sql的结果,拿到内层sql去测试,如果内层的sql成立,则该行取出。内层查询是exists后的查询。

 

4.5.4 any

只要满足内层查询语句结果的的任意一个,就可以通过该条件来执行外层查询语句

 

4.5.5 all

使用all关键字,要满足内层查询语句的所有结果,才可以通过该条件来执行外层查询语句

 

4.6 常用函数

字符函数

函数功能
concat(str1,str2,…) 连接字符串
insert(str,pos,len,newstr) 字符串str从第pos位置开始的len个字符替换为新字符串newstr
lower(str) 转成小写
upper(str) 转成大写
length(str) 返回字符串str的长度
char_length(str) 返回字符串str的长度
lpad(str,ien,padstr) 返回字符串str,其左边由字符串padstr填补到len字符串长度
rpad(str,len,padstr) 返回字符串str,其左边由字符串padstr填补到len字符串长度
trim(str) 去掉字符串str前缀和后缀的空格
repeat(str,count) 返回str重复count次的结果
replace(str,from_str,to_str) 用字符串to_str替换字符串str中所有的字符串from_str
substring(str,pos,len) 从字符串str的pos位置起len个字符长度的子串

数学函数 ceil:向上取整 round:四舍五入 mod:取模 floor:向下取整 truncate:截断 rand:获取随机数,返回0-1之间的小数

日期函数

CURDATE()返回当前日期
CURTIME() 返回当前时间
NOW() 返回当前的日期和时间
WEEK(date) 返回指定日期为一年中的第几周
YEAR(date) 返回日期的年份
HOUR(time) 返回time的小时值
MINUTE(time) 返回time的分钟值
MONTHNAME(date) 返回date的月份名
DATEDIFF(expr,expr2) 返回起始时间expr和结束时间exrp2之间的天数
DATE_FORMAT(date,fmt) 返回按字符串fmt格式化日期date值
from_unixtime(unix_timestamp,”%Y-%m-%d %H:%i:%S”) 常用来将毫秒数转换为时间格式
%M 月名字(January……December)%I 小时(01……12)
%W 星期名字(Sunday……Saturday) %l 小时(1……12)
%D 有英语前缀的月份的日期(1st, 2nd, 3rd, 等等。) %i 分钟, 数字(00……59)
%Y 年, 数字, 4 位 %r 时间,12 小时(hh:mm:ss [AP]M)
%y 年, 数字, 2 位 20 %T 时间,24 小时(hh:mm:ss)
%a 缩写的星期名字(Sun……Sat) %S 秒(00……59)
%d 月份中的天数, 数字(00……31) %s 秒(00……59)
%e 月份中的天数, 数字(0……31) %p AM或PM
%m 月, 数字(01……12) %w 一个星期中的天数(0=Sunday ……6=Saturday )
%c 月, 数字(1……12) %U 星期(0……52), 这里星期天是星期的第一天
%b 缩写的月份名字(Jan……Dec) %u 星期(0……52), 这里星期一是星期的第一天
%j 一年中的天数(001……366) %% 一个文字“%”。
%H 小时(00……23) %k 小时(0……23)

其他函数 version 当前数据库服务器的版本 database 当前打开的数据库 user当前用户 password(‘字符‘):返回该字符的密码形式 md5(‘字符‘):返回该字符的md5加密形式

5.事务

5.1存储引擎

mysql中的数据用各种不同的技术存储在文件(或内存)中

在mysql中用的最多的存储引擎有:innodb,myisam ,memory 等。其中innodb支持事务,而 myisam、memory等不支持事务

show engines;

建表指定引擎:

create table tb (...) engine=InnoDB auto_increment=11 default charset=utf8;

  • myisam:管理表(格式文件、数据文件、索引文件)

  • innodb:默认引擎,支持事务,支持数据库崩溃自动恢复,存储安全

    表特征:1.表格式.frm文件 2.表空间存内容

  • memory:数据及索引存在内存,行固定(查询速度快,不安全)

    表格式.frm文件

 

5.2 事务 transaction

  • 事务是一个完整的业务逻辑

  • 事务由单独单元的一个或多个SQL语句组成,在这个单元中,每个MySQL语句是相互依赖的。

  • 整个单独单元作为一个不可分割的整体。

  • 如果某条SQL语句执行失败或产生错误,整个单元将会回滚。所有受到影响的数据将返回到事物开始以前的状态;

  • 如果单元中的所 有SQL语句均执行成功,则事物被顺利执行。

只限于DML中:insert delete update

InnoDB提供一组记录事务性活动的日志文件

提交事务:事务结束,清空日志,数据写入 commit

回滚事务:撤销操作,清空日志,全部失败 rollback 只能滚回上次提交点

start transaction;关闭自动提交

5.3 事务特性

事务的ACID(acid)属性

  • 原子性(Atomicity)

    原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。

  • 一致性(Consistency)

    事务必须使操作同时成功或失败

  • 隔离性(Isolation)

    事务的隔离性是指一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。

  • 持久性(Durability)

    持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来的其他操作和数据库故障不应该对其有任何影响

 

5.4 隔离级别

  1. 读未提交:A可以读取B未提交的数据

    ----->脏读

  2. 读已提交:A只能读B提交的数据

    ----->不可重复读取:读取随提交而可能不同,数据真实

  3. 可重复读:A读取后B再修改提交A也不变

    ----->幻读:数据不真实

  4. 序列化:事务排队,不能并发

 

6.视图

不同角度下观察数据

create view tb_view as select * from tb;

drop view tb_view;

DQL语句才能创建view对象

面向视图的操作会改变原数据

简化语句结果为视图对象

 

7.索引

字段或多字段联合 添加索引

提高查询效率

主键自动添加索引,unique也自动创建索引

索引是单独对象,不同引擎存储索引方式不同:

以 自平衡二叉树 B-tree形式存在

create index tb_name on tb(name);

drop index tb_name on tb;

 

索引失效:

  • 模糊查询时以 % 开头

  • 使用OR时,两边都有索引时才使用索引(UNION 不会失效)

  • 使用复合索引时,没有使用左侧列查找时失效

  • where中索引列参与运算时失效

  • where中索引列使用函数时失效

 

索引用于优化数据库

分类:

  • 单一索引

  • 复合索引

  • 主键索引

  • 唯一性索引

 

8.设计范式

数据库表设计

第一范式:要求任一表必须有主键,每一个字段原子性

第二范式:第一的基础上,非主键完全依赖主键,不能部分依赖

第三范式:第二的基础上,非主键字段直接依赖主键,不产生传递依赖

一对多,两张表,多的表加外键

多对多,三张表,关系表两个外键

一对一,外键唯一

实际设计存在偏差,以需求为主,冗余换执行速度,减少表连接次数

 

MySQL基础

标签:text   cond   替换   prim   reference   字符串类型   表达   default   唯一性   

原文地址:https://www.cnblogs.com/fremontxutheultimate/p/14674823.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!