MySQL学习笔记(1)

橙三吉。 提交于 2019-12-05 11:11:13

数据库概述:

  • 什么数据库: 存放数据和管理的仓库,简而言之就是一个文件系统,这个文件必须通过标准的SQL访问.
    • 数据库就是一个文件系统,只不过我们需要通过命令(SQL)来操作这个文件系统
    • 数据库(Database)是按照数据结构来组织、存储和管理数据的建立在计算机存储设备上的仓库。
    • 数据库是长期储存在计算机内、有组织的、可共享的数据集合。数据库中的数据指的是以一定的数据模型组织、描述和储存在一起、具有尽可能小的冗余度、较高的数据独立性和易扩展性的特点并可在一定范围内为多个用户共享。

关系型数据库: E-R关系图

E:Entity实体 R:relation关系

关系型数据库作用:主要是用来存储实体与实体之间的关系,

常见的数据库:

  • 关系型数据库:

    mysql : 小型.开源免费,大多数中小型互联网公司都在使用这个,sun公司收购了 (集群),5.5以前的都是免费的,6.X之后的版本都是收费的

    mariadb: 开源免费数据, 和mysql基本上一模一样,但是它是免费的,并且在不停的更新,是mysql开源版本的一个分支

    Oracle : 中大型的数据库,服务收费的,安全稳定. 证券,银行,保险公司, Oracle收购了sun公司, mysql6.x之后就开始收费了

    SQL Server : 大学里面教学使用比较多, 政府官网, 图形化界面做的很好 c#

    DB2 : IBM公司, 主要运用在银行系统, 服务器软硬件解决方案

    sybase : powerdesinger 数据建模工具

    SQLite : 运用在嵌入式系统中的小型数据库,android

    查看数据库排名网站: https://db-engines.com/en/ranking

MYSQL数据库服务器

数据库服务器安装了Mysql服务软件的一台电脑

MYSQL的SQL语句

SQL: Structrued Query Langauage 结构化的查询语言

  • DDL(Data Definition Language): 数据定义语言 : 定义数据库或者表结构. alter(修改) create(创建) drop(删除) truncate(截断)
  • DML(Data Manipulation Language): 数据操纵语言: 用来操作表中数据: insert(插入) update(更新) delete(删除)
  • DQL(Data Query Language): 数据查询语言: 用来查询数据 select(选择) from(从哪里查) where(哪一条,判断条件)
  • DCL(Data Control Language): 数据控制语言: 用来控制用户权限 grant(授权) revoke(取消授权)

数据库管理员(Database Administrator,简称DBA),是从事管理和维护数据库管理系统(DBMS)的相关工作人员的统称,属于运维工程师的一个分支,主要负责业务数据库从设计、测试到部署交付的全生命周期管理。

登录数据库:

方式一: mysql -u root -p 按回车后提示后输入密码

方式二:mysql -uroot -p自己的密码

完整格式:

mysql -h主机地址 -u用户名 -p密码

连接本机:

mysql -hlocalhost -uroot -p123456

mysql -h127.0.0.1 -uroot -p123456

注意:不写-hlocalhost代表默认访问本机数据库服务器

-u username 用户名

-p password密码

数据库的CRUD操作

创建数据库:

create database 数据库的名字;
create database 数据库的名字 character set 字符集;
create database 数据库的名字 character set 字符集 collate 校对规则;

数据库明明规范:

  • 由字母、数字、下划线、@、#和$符号组成
  • 首字母不能是数字和$符号
  • 不允许有空格和特殊字符
  • 长度小于128位

查看数据库:

--查看数据库定义的语句
show create database 数据库的名字;
--查看所有的数据库
show databases;
--查看当前使用的数据库
select database();

修改数据库的字符集:

--修改数据的字符集
alter database 数据库的名字 character set 字符集;

删除数据库:

drop databae 数据库的名字;

选择数据库:

--切换数据库
use 数据库的名字;

存储引擎

查看数据库管理系统支持的引擎

第一种:

show engines;

这里写图片描述

  • Engine参数表示存储引擎的名称
  • Support参数表示MySQL数据库管理系统是否支持该存储引擎
  • Comment参数表示关于存储引擎的注释
  • Transactions参数表示存储引擎是否支持事务
  • XA参数表示存储引擎支持的分布式是否符合XA规范
  • Savepoints参数表示存储引擎是否支持事务处理中的保存点

第二种:

show variables like 'have%';
  • variable_name参数表示存储引擎的名字
  • value参数表示MySQL数据库管理系统是否支持存储引擎(DISABLED表示支持但是没有开启,YES表示支持)

查询默认存储引擎

show variables like 'storage_engine%';

修改默认的存储引擎

打开MySQL安装目录下的my.ini,找到如图所示,default-storage-engine=INNODB,修改INNODB值即可

这里写图片描述

选择存储引擎

这里写图片描述
* MyISAM存储引擎:由于该存储引擎不支持事务、也不支持外键,所以访问嘟嘟比较快。因此对事务完整性没有要求,并以访问为主的应用格式和该存储引擎。
* InnoDB存储引擎:由于该存储引擎在事务上具有优势,即支持具有提交、回滚和崩溃恢复能力的事务安装,所以比MyISAM存储引擎占用更多的磁盘空间。因此需要进行频繁的更新、删除操作,同时还对事务的完整性要求比较高,需要实现并发控制,此时适合该存储引擎。
* MEMORE存储引擎:该存储引擎使用内存来存储数据,因此该存储引擎的数据访问熟读快,但是安全上没有保障。如果应用中涉及数据比较小,需要快速访问,则适合使用该存储引擎。

表的CRUD操作:

表中的数据库对象包含列、索引和触发器。

  • 列(Columns):也称属性列,在具体创建表时,必须指定列的名字和数据类型
  • 索引(Indexes):时根据指定的数据库表列建立起来的顺序,提供了快速访问数据的途径且可监督表的数据,是其索引执行的列中的数据不重复。
  • 触发器(Triggers):是指用户定义的事务命令的集合,当对一个表中的数据进行插入、更新或者删除时这组命令就会自动执行,可以用来确保数据的完整性和安全性。

创建表:

create table 表名(
    列名 列的类型 [列的约束],
    列名 列的类型 [列的约束]
);

查看表:

--查看所有的表
show tables;
--查看表的创建过程
show create table 表名;
或者
show create table 表名 \G
--查看表的结构
desc 表名;
或者
describe 表名;

更新表

alter table 旧表名 rename [to] 新表名;
或者
rename table 旧表名 to 新表名;
alter table 表名 character set 字符集;

删除表:

drop table 表名;

列的CRUD操作

列的类型

列的类型 分为如下:
数字类型
整数: tinyint、smallint、mediumint、int、bigint
浮点数: float、double、real、decimal
日期和时间: date、time、datetime、timestamp、year

字符串类型
字符串: char、varchar
文本: tinytext、text、mediumtext、longtext

二进制(可用来存储图片、音乐等): tinyblob、blob、mediumblob、longblob

对比Java中的类型:
列的类型
java                mysql
byte                 TinyInt
short                SMALLINT
int                 int
float               float
double              double
String              char(长度)/varchar(长度)

char 和varchar:区别主要体现在存储字符时候,如果是char存储类型,不足的字符会以空格存储,varchar则不会

boolean             boolean
Date                date : YYYY-MM-DD 年/月/日
                    time : hh:mm:ss 时:分:秒
                    datetime:
                    timestamp:最大取值是2038年.

                    text: 大文本类型
                    blob: 二进制大对象类型 

列的约束

  • 主键约束: primary key,不能重复,不能为空 通常用在编号ID auto_increment(自增)
  • 唯一约束: unique,不能重复,但是可以为空
  • 非空约束: not null,不能为空
  • 默认约束:default,设置字段的默认值
  • 自增约束:auto_increment,约束字段的值为自动增长
  • 外键约束:foreign key,约束字段为表的外键

设置外键约束

--建表时
create table table_name(
    列名 列的类型 列的约束,
    列名 列的类型 列的约束
    ......
    constraint 外键约束名 foreign key(属性名) references 表名(外表的属性)
)

添加列:

alter table 表名 add 列名 列的类型 列的约束;
--在表的所有字段第一个位置添加字段
alter table 表名 add 列名 列的类型 列的约束 first;
--在表的指定字段添加字段
alter table 表名 add 列名 列的类型 列的约束 after 列名;

修改列:

--修改列的类型
alter table 表名 modify 列名 列的类型;
--修改某个字段的顺序
alter table 表名 modify 列名 列的类型 first|after 列名;
--修改列名
alter table 表名 change 旧列名 新列名 列的类型 列的约束;

删除列:

alter table 表名 drop 列名;

索引

​ 由于数据存储在数据库表中,所以索引是建立在数据库表对象上的,由表中的一个字段或者多个字段生成的键组成。这些键存储在数据结构中,通过MySQL快速有效地查找键值相关联的字段。根据索引的存储类型,可以将索引分为B型数索引(BTREE)和哈希索引(HASH)。

注意:InnoDB和MyISAM存储引擎支持BTREE类型索引,MEMORY存储引擎支持HSAH类型索引。

MySQL支持六种索引:普通索引、唯一索引、全文索引、单列索引、多列索引和空间索引。

创建索引

普通索引

1.创建表时创建普通索引
create table table_name(
    列名 列的类型 [列的约束],
    列名 列的类型 [列的约束],
    index|key [索引名](属性名 [长度] [asc|desc1]) 
)
2.在已经存在的表上创建普通索引
create index 索引名 on 表名(属性名 [长度] [asc|desc]) ;
3.通过SQL语句ALTER TABLE 创建普通索引
alter table table_name add index|key 索引名(属性名 [长度] [asc|desc]) ;

唯一索引

1.创建表时创建唯一索引
create table table_name(
    列名 列的类型 列的约束,
    列名 列的类型 列的约束,
    unique index|key [索引名](属性名 [长度] [asc|desc])
)
2.在已经存在的表中创建唯一索引
create unique index 索引名 on 表名(属性名 [长度] [asc|desc]);
3.通过SQL语句ALTER TABLE创建唯一索引
alter table table_name add  unique index|key 索引名(属性名 [长度] [asc|desc]);

全文索引

1.创建表时创建全文索引
create table table_name(
    列名 列的类型 [列的约束],
    列名 列的类型 [列的约束],
    fulltext index|key [索引名](属性名 [长度] [asc|desc])
)
2.在已经存在的表上创建全文索引
create fulltext index 索引名 on 表名(属性名 [长度] [asc|desc]);
3.通过SQL语句ALTER TABLE 创建全文索引
alter table table_name add fulltext index|key 索引名(属性名 [长度] [asc|desc]);

多列索引

1.创建表时创建全文索引
create table table_name(
    列名 列的类型 [列的约束],
    列名 列的类型 [列的约束],
    .....
    index|key [索引名](属性名 [长度] [asc|desc],
                       属性名 [长度] [asc|desc])
)
2.在已经存在的表上创建全文索引
create table table_name on 表名(属性名 [长度] [asc|desc],
                                属性名 [长度] [asc|desc]);
3.通过SQL语句ALTER TABLE 创建全文索引
alter table table_name add index|key 索引名(属性名 [长度] [asc|desc], 属性名 [长度] [asc|desc]);

删除索引

drop index index_name on table_name;

视图

未来提高复杂SQL语句的复用性和表操作的安全性,MySQL数据库管理系统提供了视图特性。所谓视图,本质上是一种虚拟表,其内容与真实的表相似,包含一些列带有名称的列和行数据。但是,视图并不在数据库中以存储的数据值形式存在。行和列数据来自定义视图的查询所引用的基本表,并且再具体引用视图时动态生成。

创建视图

create view view_name as 查询语句;

查看视图

show table status语句查看视图详细信息

show table status [form db_name] [like 'pattern'];
或者
show table status form db_name \G

查看视图定义信息

show create view view_name;
或者
show create view view_name \G

DESCRIBE|DESC查看视图设计信息

describe | desc view_name;

删除视图

删除一个或者多个视图

drop view view_name1 [,view_name2]....

修改视图

alter view view_name as 查询语句;

触发器的操作

触发器(TRIGGER)是MySQL的数据库对象之一,该对象与编程语言中的很函数类似,都需要声明、执行等,触发器是由时间出发激活的从而实现执行的。

创建触发器

create trigger trigger_name 
    before | after trigger_event
        on table_name for each row trigger_stmt;
  • trigger_event参数表示触发器事件,即触发器执行条件,包含delete、insert和update语句
  • table_name参数表示触发事件操作表的名字
  • for each row参数表示任何一条记录上的操作都满足触发器事件都会触发该触发器
  • trigger_stmt参数表示激活触发器后被执行的语句

创建包含多条执行语句的触发器

create trigger trigger_name
    before | after trigger_event
        on table_name for each row 
            begin
                trigger_stmt1;
                trigger_stmt2;
            end
            $$
            delimiter;

查看触发器

show triggers \G

执行SQL语句SELECT,查看系统表triggers中的所有记录

select * from triggers \G

插叙指定触发器的详细信息

select * from triggers where trigger_name='触发器的名称' \G

删除触发器

drop trigger trigger_name;

数据的操作

插入数据记录

插入单条数据

insert into table_name(field1,field2...)                            values(value1,value2...);

插入多条数据

insert into table_name(field1,field2...)                            values(value1,value2...),
                  (value1,value2...),
                  (value1,value2...);

插入查询结果

insert into table_name1(field1,field2...)
    select (field1,field2...)
        from table_name2
            where ...;

更新数据

更新特定数据

update table_name
    set field1=value2,
        field1=value2
    where condition;
  • condition参数指定更新满足条件的特定数据

更新所有数据

update table_name
    set field1=value2,
        field1=value2;

删除数据记录

删除特定数据记录

delete from table_name where condition;

删除所有数据

delete from table_name;

数据查询

简单查询

select * from table_name;

别名查询

select field1 as 列别名,field2 as 列别名
from table table_name as 表别名;
或者
select field1  列别名,field2  列别名
from table table_name  表别名;

去重查询

select distinct * from table_name;

运算查询

四则运算:

+、-、*、/或者div、%或者mod

关系运算:

>、<、=、!=或者<>、>=、<=

逻辑运算符:

and或者&&、or或者||,ornot或者!

其他运算符

between...and...
not between...and...
is null
is not null
in(value1,value2,value3...)
not in(value1,value2,value3...)

模糊查询——like、not like

  • %匹配0到多个字符
  • _匹配单个字符

排序查询——order by

单个字段排序

select * from table_name order by field desc;

多个字段排序

select * from table_name order by field1 desc
                               field2 asc;
  • 首先按照第一个字段进行排序,如果遇到值相同的字段则会按照第二个字段进行排序

限制数据记录查询数量——limit a,b

select * from table_name where condition 
limit offset_start,row_count;
  • offset_start参数不指定数据,则默认为0,显示row_count条数据
  • offset_start参数指定数据,表示offset_start+1开始,显示row_count条数据

聚合函数查询

  • count():查询表中数据记录的条数
  • avg():计算字段值的平均值
  • sum():求计算字段的总和
  • max():求计算字段的最大值
  • min():求计算字段的最小值

注意:如果所操作的表没有任何数据记录,则count()函数返回数据为0,其他则返回null。

分组查询——group by

实现多个字段分组查询

select * from group_concat(field),function(field)
    from table_name
        where condition
        group by field1,field2...;

分组数据查询——实现HAVING子句限定分组查询

select function(field) from table_name
    where condition
    group by field1,field2...
    having condition;

SQL编写顺序

select ... from ... where ... group by ... having ... order by;
  • 先from去查询表
  • 根据where的条件过滤
  • group by分组
  • having是对分组后的数据过滤
  • select查询
  • 最后order by排序

多表数据记录查询

交叉查询

select * from table_name1 cross join table_name2;
或者
select * from table_name1,table_name2;

内连接查询

  • 显示内连接

    select * from table_name1 inner join table_name2 on table_name1.field=table_name2.field where condition;
  • 隐式内连接

    select * from table_name1,table_name2 where condition;

外连接查询

  • 左外连接

    select * from table_name1 left outer join table_name2 on table_name.field1=table.name2.field2 where 条件;
  • 右外连接

    select * from table_name1 right outer join table_name2 on table_name.field1=table.name2.field2 where 条件;

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!