MYSQL 基础篇

一、mysql 的初识

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。

MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。【以上内容来之百度百科

MYSQL 数据库是我在日常用的最多的数据库。

二、MYSQL 默认数据库

mysql 默认数据库分类:

  • information_schema
  • performance_schema
  • mysql

1、informance_schema

  • 保存了MySQL服务所有数据库的信息;
  • 具体MySQL服务有多少个数据库,各个数据库有哪些表,各个表中的字段是什么数据类型,各个表中有哪些索引,各个数据库要什么权限才能访问;

2、mysql

  • 保存MySQL的权限、参数、对象和状态信息;
  • 如哪些user可以访问这个数据、DB参数、插件、主从;

3、performance_schema

  • 主要用于收集数据库服务器性能参数;
  • 提供进程等待的详细信息,包括锁、互斥变量、文件信息;
  • 保存历史的事件汇总信息,为提供MySQL服务器性能做出详细的判断;
  • 对于新增和删除监控事件点都非常容易,并可以随意改变mysql服务器的监控周期,例如(CYCLE、MICROSECOND);

三、MYSQL 的数据类型

主要有五大类:

  • 整数类型:BIT、BOOL、TINY INT、SMALL INT、MEDIUM INT、 INT、 BIG INT
  • 浮点数类型:FLOAT、DOUBLE、DECIMAL
  • 字符串类型:CHAR、VARCHAR、TINY TEXT、TEXT、MEDIUM TEXT、LONGTEXT、TINY BLOB、BLOB、MEDIUM BLOB、LONG BLOB
  • 日期类型:Date、DateTime、TimeStamp、Time、Year
  • 其他数据类型:BINARY、VARBINARY、ENUM、SET、Geometry、Point、MultiPoint、LineString、MultiLineString、Polygon、GeometryCollection等

MYSQL 基础篇_第1张图片
MYSQL 基础篇_第2张图片
MYSQL 基础篇_第3张图片
MYSQL 基础篇_第4张图片
这里就不展开说了,下面简单说一下下面的两点知识:

(1)UNSIGNED

一般整数都支持正负值,不过可以使用可选的属性UNSIGNED,使其不允许负值,这样的话,可以使用存储的正数上限提高一倍,比如TINYINT的范围由-128~127变为0~255

CREATE TABLE test_int(
    id int unsigned not null   ## 范围  0~255
);

(2)AUTO_INCREMENT

对整数类型,在创建数据表时,可以指定AUTO_INCRMENT属性,让该字段可以变成一个可以自动增长的序列,如:

CREATE TABLE test_int(
    id INT UNSIGNED NOT NULL AUTO_INCRMENT PRIMARY KEY,
    name VARCHAR(32) NOT NULL
);

三、DDL、DML、DCL、DQL及TCL

(1)数据定义语言(Data Definition Language),即SQL DDL,用于定义SQL模式、基本表、视图、索引等结构。
	关键词: create,alter, drop, truncate(删除当前表再新建一个一模一样的表结构)
(2)数据操纵语言(Data Manipulation Language),即SQL DML。数据操纵分成数据查询和数据更新两类。
	关键词:insert update delete
(3)数据查询语言(Data Query Language),即SQL DQL。
	select ... 
	from student 
	where 条件 
	group by 分组字段 
	having 条件 
	order by 排序字段
   执行顺序: from -> where -> group by -> having -> order by -> select
(4)数据控制语言(Data Control Language),即SQL DCL,这一部分包括对基本表和视图的授权、完整性规则的描述、事务
(5)TCL(Transaction Control Language):事务控制语言
	set autocommit=0、start transaction、savepoint、commit、rollback

四、创建和使用数据库

1、查看命令

SHOW DATABASES;  # 查看所有数据
use userdb;  # 使用数据库
CREATE DATABASE menagerie;  # 创建数据库
# CREATE DATABASE 数据库名称 DEFAULT CHARSET utf8 COLLATE utf8_general_ci;   # utf-8
SHOW TABLES;  # 查看当前使用的数据库中的所有表

查看表的创建语句:show create table 表名;

2、数据库表的基本操作

CREATE TABLE pet (
    pid int primary key auto_increment comment '宠物id',  # 设置id为主键,自动增长
    name VARCHAR(20) not null comment '宠物名',  # 设置非空
    owner VARCHAR(20) comment '宠物主人',
    species VARCHAR(20) comment '宠物类别', 
    sex CHAR(1) defalut '男' comment '宠物性别',  # 设置默认值
    birth DATE comment '宠物生日'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;  
# 创建pet表,表的字段信息  指定对应的存储引擎【可不写,默认使用的就是 InnoDB 】及编码格式

#  对于自增可以设置步长和起始值
-- 下面的代码是对 session 会话变量的操作
-- 服务器为每个连接的客户端维护一系列会话变量。在客户端连接时,使用相应全局变量的当前值对客户端的会话变量进行初始化。会话变量的作用域与用户变量一样,仅限于当前连接。
show session variables like 'auto_inc%';
set session auto_increment_increment=2;
set session auto_increment_offset=10;

-- 下面的代码是对 global 全局变量的操作,全局变量影响服务器整体操作。当服务器启动时,它将所有全局变量初始化为默认值。
show global variables like 'auto_inc%';
set global auto_increment_increment=2;
set global auto_increment_offset=10;

-- 查询任意的
show variables like 'auto_inc%';

#  主键,一种特殊的唯一索引,不允许有空值,如果主键使用单个列,则它的值必须唯一,如果是多列,则其组合必须唯一。
如: nid int primary key auto_increment
或: primary key(nid)
#  外键,一个特殊的索引,只能是指定内容  
语法: constraint 外键名 foreign key (给该表的哪个字段设置外键) references 关联的数据表(对应的字段)
注意: 关联表中的字段必须为 主键
如: constraint fk_cc foreign key (color_id) references color(nid)
  • 创建表成功后通过下面的命令查看表的结构
DESCRIBE pet; # 查看数据库表的结构  desribe

MYSQL 基础篇_第5张图片

  • 删除数据库表和清空数据库表
drop table 表名  # 删除表

delete from 表名  # 清空表
truncate table 表名  # 清空表

-- 具体的写法如下:
1、 drop table 表名称 eg: drop table dbo.Sys_Test
2、 truncate table 表名称 eg: truncate table dbo.Sys_Test
3、 delete from 表名称 where 列名称 = 值 eg: delete from dbo.Sys_Test where test='test'

三者的比较
1、 drop (删除表):删除内容和定义,释放空间。简单来说就是把整个表去掉.以后要新增数据是不可能的,除非新增一个表。 drop 语句将删除表的结构被依赖的约束( constrain ),触发器( trigger ),索引( index );依赖于该表的存储过程/函数将被保留,但其状态会变为: invalid 。
2、 truncate (清空表中的数据):删除内容、释放空间但不删除定义(保留表的数据结构)。与 drop 不同的是,只是清空表数据而已。
注意: truncate 不能删除行数据,要删就要把表清空。
3、 delete (删除表中的数据): delete 语句用于删除表中的行。 delete 语句执行删除的过程是每次从表中删除一行,并且同时将该行的删除操作作为事务记录在日志中保存,以便进行进行回滚操作。
truncate 与 不带 where 的 delete :只删除数据,而不删除表的结构(定义)
4、truncate table 删除表中的所有行,但表结构及其列、约束、索引等保持不变。新行标识所用的计数值重置为该列的种子。如果想保留标识计数值,请改用 delete。
如果要删除表定义及其数据,请使用 drop table 语句。
5、对于由 foreign key 约束引用的表,不能使用 truncate table ,而应使用不带 where 子句的 delete 语句。由于 truncate table 记录在日志中,所以它不能激活触发器。
6、执行速度,一般来说: drop> truncate > delete
7、 delete 语句是数据库操作语言(DML),这个操作会放到 rollback segement 中,事务提交之后才生效;如果有相应的 trigger,执行的时候将被触发。
truncate、 drop 是数据库定义语言(DDL),操作立即生效,原数据不放到 rollback segment 中,不能回滚,操作不触发 trigger。

  • 修改表信息
添加列: alter table 表名 add 列名 类型
删除列: alter table 表名 drop column 列名
修改列: alter table 表名 modify column 列名 类型;  -- 类型
        alter table 表名 change 原列名 新列名 类型; -- 列名,类型
        
        # 例子
        alter table MyClass add passtest int(4) default '0';     
        alter table Person drop column age,drop column address;
        
        # 修改字段的注释
        alter table `student` modify column `id` comment '学号';
  
添加主键: alter table 表名 add primary key(列名);
删除主键: alter table 表名 drop primary key;
          alter table 表名  modify 列名 int, drop primary key;
  
添加外键: alter table 从表 add constraint 外键名称(形如:FK_从表_主表) foreign key 从表(外键字段) references 主表(主键字段);

删除外键: alter table 表名 drop foreign key 外键名称
  
修改默认值: alter TABLE testalter_tbl ALTER i SET DEFAULT 1000;
删除默认值: alter TABLE testalter_tbl ALTER i DROP DEFAULT;

# 加索引 
# alter table 表名 add index 索引名 (字段名1[,字段名2 …]);
alter table employee add index emp_name (name);
# 加主关键字的索引
# alter table 表名 add primary key (字段名);
alter table employee add primary key(id);
# 加唯一限制条件的索引
# alter table 表名 add unique 索引名 (字段名);
alter table employee add unique emp_name2(cardnumber);
# 删除某个索引
# alter table 表名 drop index 索引名;
alter table employee drop index emp_name;

3、数据库表的关系

3.1 关联映射:一对多/多对一

存在最普遍的映射关系,简单来讲就如球员与球队的关系;

一对多:从球队角度来说一个球队拥有多个球员 即为一对多
多对一:从球员角度来说多个球员属于一个球队 即为多对一

数据表间一对多关系如下图:
MYSQL 基础篇_第6张图片

3.2 关联映射:一对一

一对一关系就如球队与球队所在地址之间的关系,一支球队仅有一个地址,而一个地址区也仅有一支球队。

数据表间一对一关系的表现有两种,一种是外键关联,一种是主键关联。图示如下:

  • 一对一外键关联:

MYSQL 基础篇_第7张图片

  • 一对一主键关联:要求两个表的主键必须完全一致,通过两个表的主键建立关联关系

MYSQL 基础篇_第8张图片

3.3 关联映射:多对多

多对多关系也很常见,例如学生与选修课之间的关系,一个学生可以选择多门选修课,而每个选修课又可以被多名学生选择。

数据库中的多对多关联关系一般需采用中间表的方式处理,将多对多转化为两个一对多:
MYSQL 基础篇_第9张图片

4、数据表之间的约束

约束是一种限制,它通过对表的行或列的数据做出限制,来确保表的数据的完整性、唯一性。

常见的几种约束:
MYSQL 基础篇_第10张图片

主键(PRIMARY KEY)是用于约束表中的一行,作为这一行的标识符,在一张表中通过主键就能准确定位到一行,因此主键十分重要。主键要求这一行的数据不能有重复且不能为空。
还有一种特殊的主键——复合主键。主键不仅可以是表中的一列,也可以由表中的两列或多列来共同标识

默认值约束(DEFAULT) 规定,当有DEFAULT约束的列,插入数据为空时该怎么办。
DEFAULT约束只会在使用INSERT语句时体现出来,INSERT语句中,如果被DEFAULT约束的位置没有值,那么这个位置将会被DEFAULT的值填充

唯一约束(UNIQUE) 比较简单,它规定一张表中指定的一列的值必须不能有重复值,即这一列每个值都是唯一的。
当INSERT语句新插入的数据和已有数据重复的时候,如果有UNIQUE约束,则INSERT失败。

外键(FOREIGN KEY) 既能确保数据完整性,也能表现表之间的关系。
一个表可以有多个外键,每个外键必须REFERENCES(参考)另一个表的主键,被外键约束的列,取值必须在它参考的列中有对应值。
在INSERT时,如果被外键约束的值没有在参考列中有对应,比如以下命令,参考列(department表的dpt_name)中没有dpt3,则INSERT失败。

非空约束(NOT NULL) 听名字就能理解,被非空约束的列,在插入值时必须非空。
在MySQL中违反非空约束,不会报错,只会有警告。

五、数据库表的基本操作(增删查改)

1、 增

# 插入单行数据
insert into 表 (列名,列名...) values (值,值,值...)
# 插入多行数据
insert into 表 (列名,列名...) values (值,值,值...),(值,值,值...)
# 复制子表数据
insert into 表 (列名,列名...) select (列名,列名...) from 表

# 简化写法 (下面的写法需要将所有字段都赋值)
insert into 表 values (值,值...)

2、删

#  清空表的数据
delete from 表
#  根据条件删除表中对应的数据
delete from 表 where id=1 and name='alex'

3、改

#  根据条件修改对应的数据
update 表 set name = 'alex' where id>1

4、查

select <目标列表达式列表>
[into 新表名]
from 表名或视图名
[where <条件>]
[group by <分组表达式>]
[having <条件>]
[order by <排序表达式>[ASC|DESC]]
# 查询表中所有的数据
select * from 表

# 根据条件进行查询
select * from 表 where id > 1
# 根据条件查询表对应字段信息
select nid,name,gender as gg from 表 where id > 1
# 多个条件查询
select * from 表 where id > 1 and name != 'alex' and num = 12;

# 范围查询 between ... and ... 
select * from 表 where id between 5 and 16;

# 范围查询 in(...) 
select * from 表 where id in (11,22,33)
select * from 表 where id not in (11,22,33)
select * from 表 where id in (select nid from 表)

# 限制  limit
select * from 表 limit 5;            # 前5行
select * from 表 limit 4,5;          # 从第4行开始的5行
select * from 表 limit 5 offset 4    # 从第4行开始的5行

# 消除查询结果中的重复行
select distinct <字符型字段>[,<字符型字段>,...] from tb_name;

# 使用null的查询
select * from tb_name where <字符型字段> is [not] null;
# 数据排序(查询)  order by 
select * from 表 order by 列 asc              # 根据 “列” 从小到大排列
select * from 表 order by 列 desc             # 根据 “列” 从大到小排列
select * from 表 order by 列1 desc,列2 asc    # 根据 “列1” 从大到小排列,如果相同则按列2从小到大排序
# 模糊查询  like
select * from 表 where name like 'ale%'  # ale开头的所有(多个字符串)  如:alekkkk   alek
select * from 表 where name like '%ale'  # 以ale结尾的所有			   如:kkale   aaaale
select * from 表 where name like '%al%'  # 查询含有 al 的所有          如:ccale   acaleaa
select * from 表 where name like 'ale_'  # ale开头的所有(一个字符)    如:alea  alek
# 聚集函数查询
COUNT(e1)  # e1为一个表达式,可以是任意的数据类型 -> 返回e1指定列不为空的记录总数

SUM(e1)    # 对e1指定的列进行求和计算

MIN(e1)	   # MIN(e1)返回e1表达式指定的列中最小值;
MAX(e1)    # MAX(e1)返回e1表达式指定的列中最大值;

AVG(e1)    # 对e1表达式指定的列,求平均值。  

#  首先,根据e1表达式指定的列,对值进行排序;
#  若排序后,总记录为奇数,则返回排序队列中,位于中间的值;
#  若排序后,总记录为偶数,则对位于排序队列中,中间两个值进行求平均,返回这个平均值;
MEDIAN(e1)  
# 通用数据库函数
1、 CONCAT(A, B) – 连接两个字符串值以创建单个字符串输出。通常用于将两个或多个字段合并为一个字段。
2、 FORMAT(X, D)- 格式化数字 X 到 D 有效数字。
3、 CURRDATE(), CURRTIME()- 返回当前日期或时间。
4、 NOW() – 将当前日期和时间作为一个值返回。
5、 MONTH(), DAY( ), YEAR(), WEEK(), WEEKDAY() – 从日期值中提取给定数据。
6、 HOUR(), MINUTE(), SECOND() – 从时间值中提取给定数据。
7、 DATEDIFF( A, B) – 确定两个日期之间的差异, 通常用于计算年龄
8、 SUBTIMES( A, B) – 确定两次之间的差异。
9、 FROMDAYS( INT) – 将整数天数转换为日期值。
- RANK
	1)用法1:RANK OVER
		语法:RANK() OVER ([PARTITION BY column1] ORDER BY column2 [ASC|DESC])
              为分析函数,为每条记录产生一个序列号,并返回。
     	参数:column1为列名,指定按照哪一列进行分类(分组)
              column2为列名,指定根据哪列排序,默认为升序;
              若指定了分类子句(PARTITION BY),则对每类进行排序(每个分类单独排序)
     	返回:返回一个数值类型数据,作为该记录的序号!
     	作用:为分析函数,对记录先按column1分类,再对每个分类进行排序,并为每条记录分配一个序号(每个分类单独排序)
     	注意:排序字段值相同的记录,分配相同的序号。存在序号不连续的情况   

MYSQL 基础篇_第11张图片
MYSQL 基础篇_第12张图片
MYSQL 基础篇_第13张图片

#  row_number()  它是将某字段按照顺序依次添加行号。如1、2、3、4
SELECT Score,row_number() over(ORDER BY Score desc) as 'Rank' FROM score;
# 分组排序
SELECT Score,row_number() over(partition by xxx ORDER BY Score desc) as 'Rank' FROM score;
#  dense_rank()  dense_rank() 排序数字是连续的、不间断。当有相同的分数时,它们的排名结果是并列的,例如,1、2、2、3、4。
SELECT Score,dense_rank() over(ORDER BY Score desc) as 'Rank' FROM score;
# 分组排序
SELECT Score,dense_rank() over(partition by xxx ORDER BY Score desc) as 'Rank' FROM score;

MYSQL 基础篇_第14张图片

#  分组查询
- 分组
    select num from 表 group by num
    select num,nid from 表 group by num,nid
    select num,nid from 表  where nid > 10 group by num,nid order nid desc
    select num,nid,count(*),sum(score),max(score),min(score) from 表 group by num,nid
 
    select num from 表 group by num having max(id) > 10
 
    特别的:group by 必须在where之后,order by之前
#  多表查询
a、连表
    无对应关系则不显示
    select A.num, A.name, B.name
    from A,B
    Where A.nid = B.nid
 
    无对应关系则不显示
    select A.num, A.name, B.name
    from A inner join B
    on A.nid = B.nid
 
    A表所有显示,如果B中无对应关系,则值为null
    select A.num, A.name, B.name
    from A left join B
    on A.nid = B.nid
 
    B表所有显示,如果B中无对应关系,则值为null
    select A.num, A.name, B.name
    from A right join B
    on A.nid = B.nid
b、组合
    组合,自动处理重合
    select nickname
    from A
    union
    select name
    from B
 
    组合,不处理重合
    select nickname
    from A
    union all
    select name
    from B

MYSQL 基础篇_第15张图片

你可能感兴趣的:(MYSQL,mysql)