MySQL

 

一.概述

  数据库技术是计算机应用领域中非常重要的技术,它产生于20世纪60年代末,是数据管理的最新技术,也是软件技术的一个重要分支。

1.什么是数据库(Database,简称DB)

  简单的说,数据库就是一个存放数据的仓库,这个仓库是按照一定的数据结构(数据结构是指数据的组织形式或数据之间的联系)来组织、存储的,我们可以通过数据库提供的多种方法来管理数据库里的数据。更简单的形象理解,数据库和我们生活中存放杂物的仓库性质一样,区别只是存放的东西不同。

 2.什么是数据库表(table)

  数据库表是一系列二维数组的集合,用来代表和储存数据对象之间的关系。它由纵向的列和横向的行组成,例如

3.什么是数据(data)

  存储在表中的信息就叫做数据.

 

4.数据库的分类: 在当今的互联网中,最常用的数据库模型主要是两种,即关系型数据库和非关系型数据库。

 4.1 关系型数据库介绍 

   (1) 关系型数据库 : 是把复杂的数据结构归结为简单的二元关系(即二维表格形式)。 

   (2) 目前主流的关系型数据库:MySQL、Oracle 、 Sql server、DB2、Sybase 。。。

 4.2  非关系型数据库介绍

   (1)非关系型数据库诞生背景

       非关系型数据库也被成为NoSQL数据库,NOSQL的本意是“Not Only SQL”.而不是“No SQL”的意思,因此,NoSQL的产生并不是要彻底地否定非关系型数据库,而是作为传统关系型数据库的一个有效补充。NOSQL数据库在特定的场景下可以发挥出难以想象的高效率和高性能。 

          随着互联网Web2.0网站的兴起,传统的关系型数据库在应付web2,0网站,特别是对于规模日益扩大的海量数据,超大规模和高并发的微博、微信、SNS类型的web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题。 

     例如:传统的关系型数据库IO瓶颈、性能瓶颈都难以有效突破,于是出现了大批针对特定场景,以高性能和使用便利为目的功能特异化的数据库产品。NOSQL(非关系型)类的数据就是在这样的情景下诞生并得到了非常迅速的发展 

        (2)  NOSQL非关系型数据库小结: 
    1、NOSQL不是否定关系数据库,而是作为关系数据库的一个重要补充 
    2、NOSQL为了高性能、高并发而生,但是要求对数据一致性要求不能高 
    3、NOSQL典型产品memcached (纯内存,k-v),redis(持久化缓存,k-v),mongodb(文档的数据库,xml-json)

5.数据库的组成部分:

  数据库系统有3个主要的组成部分。

   1.数据库(Database System):用于存储数据的地方。

   2.数据库管理系统(Database Management System,DBMS):用户管理数据库的软件。

   3.数据库应用程序(Database Application):为了提高数据库系统的处理能力所使用的管理数据库的软件补充。

6.什么是SQL?

  数据库管理系统可以接收一些命令,对数据文件进行添加、删除、修改、查询等操作。那么这些命令就是 SQL .

  SQL:(Structured Query Language)结构化查询语言缩写。是一门专门与数据库管理系统打交道的语言。

 二.MySQL 数据库的介绍

  MySQL 数据库:是互联网领域里一款最要的,深受广大用户欢迎的开源关系型数据库软件之一、由瑞典MySQL AB公司开发与维护。2008年。MySQL AB公司被SUN公司收购,2009年,SUN公司又被传统数据数据库领域大佬甲骨文(oracle)公司收购,因此,MySQL数据库软件目前属于Oracle公司,成为传统数据库领域老大的又一个数据库产品,甲骨文公司收购MySQL后,使得自身在商业数据库与开源软件领域市场占有份额都跃居第一的位置,这样的格局,引起了很多人的担忧,这种担忧直接导致后来的Mysql分支数据库MariaDB的诞生于发展。

  为什么选择MySQL数据库?

 (1) MySQL性能卓越、服务稳定,很少出现异常宕机 
 (2) MySQL开放源代码且无版权制约,自主性及使用成本低 
   (3) MySQL历史悠久,社区及用户活跃,遇到问题可以解决 
   (4) MySQL软件体积小,安装使用简单,并且易于维护,安装及维护成本低 
   (5) MySQL品牌口碑效应,使得企业无需考虑就直接用 
   (6) MySQL支持多用操作系统,提供多种API接口,支持多用开发语言,特别对流行的语言有很好的支持

 

 MariaDB数据库 : 出现在2009年. MAriaDB数据库管理系统是MySQL数据库的一个分支,主要由开源社区维护,采用GPL授权许可。开发这个MariaDB的原因之一是:甲骨文公司收购了MySQL后,MySQL有闭源的潜在风险,因此MySQL开源社区采用分支的方式来避开这个风险。点击查看详情 

  MariaDB默认的存储引擎是Maria,不是MyISAM。Maria可以支持事务,但是默认情况下没有打开事务支持,因为事务支持对性能会有影响。可以通过以下语句,转换为支持事务的Maria引擎。ALTER TABLE `tablename` ENGINE=MARIA TRANSACTIONAL=1;  

 三.下载及安装

想使用MySQL数据库,我们需要先来完成如下工作:

1
2
3
4
5
a:官网下载mysql安装程序
b:安装mysql服务端
c:安装mysql客户端
d:客户端连接服务端
e:通过客户端向服务器发送命令,执行对数据库文件的增删改差操作。 

Windows版安装

#1.下载:MySQL Community Server 5.7.20
    https://dev.mysql.com/downloads/mysql/

#2.解压
将官网下载的解压包 解压到指定目录(例如 D://mysql-5.7.20-winx64)

#3.添加环境变量
【右键计算机】--》【属性】--》【高级系统设置】--》【高级】--》【环境变量】--》【在第二个内容框中找到 变量名为Path 的一行,双击】 --> 【将MySQL的bin目录路径追加到变值值中,用 ; 分割】

C:Program Files (x86)ParallelsParallels ToolsApplications;d:mysql-5.7.16-winx64in

#4.初始化
mysqld --initialize-insecure

#5.启动mysql服务
mysqld

#6.连接mysql服务
mysql -uroot -p  回车,有密码输入密码,没有继续回车

解压方式安装
解压方式安装
ps:制作服务必须使用全路径方式
# 制作MySQL的Windows服务,在终端执行此命令:
"c:mysql-5.7.16-winx64inmysqld" --install

# 移除MySQL的Windows服务,在终端执行此命令:
"c:mysql-5.7.16-winx64inmysqld" --remove'

# 启动MySQL服务
net start mysql(后面不加分号)

# 关闭MySQL服务
net stop mysql(后面不加分号)
制作服务

在启动mysql服务后,打开windows任务管理器,会有一个名为mysqld.exe的进程运行,所以mysqld.exe是MySQL服务器程序。

ps:退出登录:quit 或 exit 或 q ;

next
next
next
....
ps:mis方式安装,会安装的东西比较全,使用起来比较方便
推荐:mis方式安装

四.数据库操作

 SQL语言是一种数据库查询和程序设计语言,其主要用于存取数据,查询数据,更新数据和管理数据库系统。具体的,SQL分为4个部分:

    数据控制语言 ( DCL):数据库控制语言。主要用于控制用户的访问权限。其中GRANT语句用于给用户增加权限,REVOKE语句用于收回用户的权限

    数据定义语言(DDL):DROP、CREATE、ALTER等语句;数据库定义语言。主要用于定义数据库,表,视图,索引和触发器等。CREATE语句主要用于创建数据库,创建表,创建视图。ALTER语句主要用于修改表的定义,修改视图的定义。DROP语句主要用于删除数据库,删除表和删除视图等。

    数据操作语言(DML):INSERT、UPDATE、DELETE语句;数据库操作语言。主要用于插入数据,更新数据,删除数据。INSERT语句用于插入数据,UPDATE语句用于更新数据,DELETE语句用于删除数据.

    数据查询语言(DQL):SELECT语句。主要用于查询数据。

1.用户操作

1
2
3
4
5
6
7
8
#创建用户
create user '用户名'@'IP' identified by '密码' ;
  
#修改用户
rename user '旧用户'@'IP' to '新用户'@'IP';
  
#删除用户
drop user '用户名'@'IP';

2.授权操作

1
2
3
4
5
6
7
8
9
10
11
#显示用户权限
show grants for '用户名'@'IP';
  
#授权
grant 权限 on 数据库.表 to '用户名'@'IP';
  
#权限
roveke 权限 on 数据库.表  to '用户名'@'IP';
  
#刷新权限(立即生效)
flush privileges;
#1. 执行以下命令,查看当前数据库编码集,如果不是utf8则需要进行修改

show variables like '%char%';

#2.修改方法:
#2.1. 创建my.ini文件,放在mysql根路径下
#2.2. 在该文件中添加以下内容即可:
#2.3.添加此文件后需要重新启动服务,以保证此文件生效
------------------------------------------------------------
[client]

default-character-set=utf8

[mysql]

#设置mysql客户端默认字符集

default-character-set=utf8

[mysqld]

#设置3306端口

port = 3306

#允许最大连接数

max_connections=200

#服务端使用的字符集默认为8比特编码的latin1字符集

character-set-server=utf8

#创建新表时将使用的默认存储引擎

default-storage-engine=INNODB

#解决mysql在执行sql语句后出现1055错误,sql_mode = only_full_group_by不相容

sql_mode='NO_ENGINE_SUBSTITUTION'
中文乱码问题
方法1: 用SET PASSWORD命令

  mysql> -u root 

  mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('newpass');

  ps:此种方式适用于当前root用户没有密码的情况

 

方法2: 用UPDATE直接编辑user表

  mysql -u root 

  mysql> use mysql;

  mysql> UPDATE user SET Password = PASSWORD('newpass') WHERE user = 'root';

  mysql> FLUSH PRIVILEGES;  -- 刷新权限

  ps:此种方式不管有没有密码都可以进行修改

 

在丢失root密码的时候,可以这样:

#1.首先打开cmd 窗口,关闭mysql服务
net stop mysql 

#2.跳过权限检查,启动mysql,输入
mysqld --skip-grants-tables

#3.重新打开一个新的cmd窗口,启动客户端
mysql 

#免密码,直接进来,修改密码
update mysql.user set authentication_string=password('root') where user='root';

#刷新权限
flush privileges;
MySQL修改root密码的三种方式
all privileges  除grant外的所有权限
            select          仅查权限
            select,insert   查和插入权限
            ...
            usage                   无访问权限
            alter                   使用alter table
            alter routine           使用alter procedure和drop procedure
            create                  使用create table
            create routine          使用create procedure
            create temporary tables 使用create temporary tables
            create user             使用create user、drop user、rename user和revoke  all privileges
            create view             使用create view
            delete                  使用delete
            drop                    使用drop table
            execute                 使用call和存储过程
            file                    使用select into outfile 和 load data infile
            grant option            使用grant 和 revoke
            index                   使用index
            insert                  使用insert
            lock tables             使用lock table
            process                 使用show full processlist
            select                  使用select
            show databases          使用show databases
            show view               使用show view
            update                  使用update
            reload                  使用flush
            shutdown                使用mysqladmin shutdown(关闭MySQL)
            super                   使用change master、kill、logs、purge、master和set global。还允许mysqladmin调试登陆
            replication client      服务器位置的访问
            replication slave       由复制从属使用
用户权限列表
#创建新用户
create user 'alex'@'localhost' identified '123456';

#授权方式一:为alex授权 db1数据库下的所有表的 查询.更新.修改权限
grant select,update,delete on db1.*  to 'alex'@'localhost';

#授权方式二:为alex 授权 所有库的所有权限(除grant权限外)
grant all privileges on *.*  to 'alex'@'localhost';

#刷新用户权限
flush privileges;
创建用户及授权例子

3.显示数据库 

1
show databases;

默认数据库:

  mysql:核心数据库,里面包含用户、权限、关键字等信息。不可以删除

  information_schema :虚拟库,不占用磁盘空间,存储的是数据库启动后的一些参数,如用户表信息、列信息、权限信息、字符信息等

  performance_schema:mysql 5.5版本后添加的新库,主要收集系统性能参数,记录处理查询请求时发生的各种事件、锁等现象 

  sys : 通过这个库可以快速的了解系统的元数据信息,可以方便DBA发现数据库的很多信息,解决性能瓶颈都提供了巨大帮助

4..创建数据库

1
2
create database [if exists] 数据库名称 default charset utf8;
ps: if exists 判断当前数据库是否存在,存在不会再创建,不存在则进行创建. 好处:不会报错!
可以由字母、数字、下划线、@、#、$
区分大小写
唯一性
不能使用关键字如 create select
不能单独使用数字
最长128位
命名规范

5.切换数据库 

1
use 数据库名称;

6.删除数据库

1
drop database 数据库名称;

 

 五. 数据库表操作

 什么是表: 相当于文件,表中的一条记录就相当于文件的一行内容,需要注意的,表中的一条记录有对应的标题,标题 称之为 表的字段

1.创建数据表

1
2
3
4
CREATE TABLE 表名(
   列名  类型  约束 , 
   列名  类型  约束 
)ENGINE=innodb DEFAULT CHARSET utf8;
create table user(
    id  int not null auto_increment  primary key,
    name varchar(50) null,  
    email varchar(100) not null
)engine = innodb default charset utf8;

ps: not null :表示此列不能为空
     auto_increment :表示自增长,默认每次增长+1
注意:自增长只能添加在主键或者唯一索引字段上
  
     primary key :表示主键(唯一且不为空)
     engine =innodb :表示指定当前表的存储引擎
     default charset utf8 :设置表的默认编码集
表创建示例
主键,一种特殊的唯一索引,不允许有空值,如果主键使用单个列,则它的值必须唯一,如果是多列,则其组合必须唯一。
            create table tb1(
                nid int not null auto_increment primary key,
                num int null
            )
            或
            create table tb1(
                nid int not null,
                num int not null,
                primary key(nid,num)
            )
主键
自增,如果为某列设置自增列,插入数据时无需设置此列,默认将自增(表中只能有一个自增列)
            create table tb1(
                nid int not null auto_increment primary key,
                num int null
            )
            或
            create table tb1(
                nid int not null auto_increment,
                num int null,
                index(nid)
            )
            注意:1、对于自增列,必须是索引(含主键)。
                 2、对于自增可以设置步长和起始值
                     show session variables like 'auto_inc%';
                     set session auto_increment_increment=2;
                     set session auto_increment_offset=10;

                     show global  variables like 'auto_inc%';
                     set global auto_increment_increment=2;
                     set global auto_increment_offset=10;
自增

2.查询表

1
2
3
4
5
6
7
8
#查询表数据
select 字段(多个以","间隔) from 表名;
例:  select name,email from user;
或者: select from user;
  
#查看表结构
desc 表名;
例: desc user;

3.修改表结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#添加表字段
alter table 表名 add 字段名 类型 约束;
例如: alter table user add age int not null default after name;
ps: after name 表示在name字段后添加字段 age. 在什么之前使用 before
 
#修改表字段
方式一: alter table user modify 字段 varchar(100) null;
方式二: alter table user change 旧字段 新字段 int not null default 0;
ps:二者区别:
change 可以改变字段名字和属性
modify只能改变字段的属性
   
#删除表字段 :
alter table user drop 字段名;
 
#更新表名称:
rename table 旧表名 to 新表名;
#添加主键 : 
alter table user add primary key(字段,"多个","间隔");
 
#移除主键 : 
alter table user drop primary key;

ps:如果主键为自增长,以上方式则不被允许执行,请先去掉主键自增长属性,然后再移除主键
alter table user modify id int not null,drop primary key 
主键更新操作
#添加外键: alter table 从表 add CONSTRAINT fk_test foreign key 从表(字段) REFERENCES 主表(字段);

#移除外键: 
alter table 表 drop foreign key 外键名称;

ps:如果外键设置后想修改,那么只能是先删除,再添加
外键更新操作
#修改默认值 : 
alter table 表 alter 字段 set default 100;
#删除默认值 :
alter table 表 alter 字段 drop default;
默认值跟新操作

4.删除表

1
drop table 表名;

5.清空表

truncate table表名;

ps:速度快,如果有字段有自增数组,则清空表后,自增的值从0开始

6.复制表

1
2
3
4
5
6
7
#只复制表结构和表中数据
CREATE TABLE tb2 SELECT * FROM tb1;
ps:主键自增/索引/触发器/外键 不会 被复制
  
#只复制表结构
create table tb2 like tb1;
ps: 数据/触发器/外键 不会被复制

7.数据类型  

  MySQL支持多种类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型。

二进制类型:
    bit[(M)]
       二进制位(101001),m表示二进制位的长度(1-64),默认m=1

整数类型:
    tinyint[(m)] [unsigned] [zerofill]

        小整数,数据类型用于保存一些范围的整数数值范围:
        有符号:-128 ~ 127.
        无符号:~ 255

        特别的: MySQL中无布尔值,使用tinyint(1)构造。

    int[(m)][unsigned][zerofill]

        整数,数据类型用于保存一些范围的整数数值范围:
        有符号: -2147483648 ~ 2147483647
        无符号:~ 4294967295

    bigint[(m)][unsigned][zerofill]
        大整数,数据类型用于保存一些范围的整数数值范围:
        有符号:-9223372036854775808 ~ 9223372036854775807
        无符号:~  18446744073709551615
        
作用:存储年龄,等级,id,各种号码等

注意:为该类型指定宽度时,仅仅只是指定查询结果的显示宽度,与存储范围无关,所以我们使用默认的就可以了
    有符号和无符号的最大数字需要的显示宽度均为10,
    而针对有符号的最小值则需要11位才能显示完全,所以int类型默认的显示宽度为11是非常合理的
    
小数型:
    decimal[(m[,d])] [unsigned] [zerofill]
        准确的小数值,m是数字总个数(负号不算),d是小数点后个数。 m最大值为65,d最大值为30。

        特别的:对于精确数值计算时需要用此类型
        decaimal能够存储精确值的原因在于其内部按照字符串存储。

    FLOAT[(M,D)] [UNSIGNED] [ZEROFILL]
        单精度浮点数(非准确小数值),m是数字总个数,d是小数点后个数。
        无符号:-3.402823466E+38 to -1.175494351E-38,
        有符号:1.175494351E-38 to 3.402823466E+38

        **** 数值越大,越不准确 ****

    DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL]
        双精度浮点数(非准确小数值),m是数字总个数,d是小数点后个数。

        无符号:-1.7976931348623157E+308 to -2.2250738585072014E-308
        有符号:2.2250738585072014E-308 to 1.7976931348623157E+308
        
        **** 数值越大,越不准确 ****
        
作用:存储薪资、身高、体重、体质参数等

字符型:
    char (m)
        char数据类型用于表示固定长度的字符串,可以包含最多达255个字符。其中m代表字符串的长度。
        
        PS: 即使数据小于m长度,也会占用m长度,但是在查询时,查出的结果会自动删除尾部的空格
        
        特点:定长,简单粗暴,浪费空间,存取速度快
            
    varchar(m)
        varchar 数据类型用于变长的字符串,可以包含最多达65535个字符(理论上可以,但是实际上在超出21845长度后,mysql会自动帮您转换数据类型为文本类型)。
        其中m代表该数据类型所允许保存的字符串的最大长度,只要长度小于该最大值的字符串都可以被保存在该数据类型中。

        PS: varchar类型存储数据的真实内容,不会用空格填充,例如:如果'ab  ',尾部的空格也会被存起来
        强调:varchar类型会在真实数据前加1-2Bytes的前缀,该前缀用来表示真实数据的bytes字节数(1-2Bytes最大表示65535个数字,正好符合mysql对row的最大字节限制,即已经足够使用)
        如果真实的数据<255bytes则需要1Bytes的前缀(1Bytes=8bit 2**8最大表示的数字为255)
        如果真实的数据>255bytes则需要2Bytes的前缀(2Bytes=16bit 2**16最大表示的数字为65535)
        特点:变长,精准,节省空间,存取速度慢
        
        sql优化:创建表时,定长的类型往前放,变长的往后放
                        比如性别          比如地址或描述信息
        PS:虽然varchar使用起来较为灵活,但是从整个系统的性能角度来说,char数据类型的处理速度更快,有时甚至可以超出varchar处理速度的50%。
            因此,用户在设计数据库时应当综合考虑各方面的因素,以求达到最佳的平衡            
        
    text
        text数据类型用于保存变长的大字符串,可以最多到65535 (2**16 − 1)个字符。

枚举类型(了解):      
    enum
     
        An ENUM column can have a maximum of 65,535 distinct elements. (The practical limit is less than 3000.)
        
        示例:
            CREATE TABLE user (
             name VARCHAR(40),
             sex ENUM('', '', '未知')
            );
            INSERT INTO user (name, sex) VALUES ('人1',''), ('人2',''),
                                                ('人3','未知'),('人4','人妖');
            PS:人4会插入成功吗??        
集合类型(了解):
    set
    
        A SET column can have a maximum of 64 distinct members.
        示例:
        CREATE TABLE myset (col SET('a', 'b', 'c', 'd'));
        
        INSERT INTO myset (col) VALUES ('a,d'), ('d,a'), ('a,d,a'), ('a,d,d'), ('d,a,d');

日期/时间类型:
                
    DATE
    
        YYYY-MM-DD(1000-01-01/9999-12-31)

    TIME
        HH:MM:SS('-838:59:59'/'838:59:59')

    YEAR
        YYYY(1901/2155)

    DATETIME

        YYYY-MM-DD HH:MM:SS(1000-01-01 00:00:00/9999-12-31 23:59:59)

    TIMESTAMP

        YYYYMMDD HHMMSS(1970-01-01 00:00:00/2037 年某时)
        
作用:存储用户注册时间,文章发布时间,员工入职时间,出生时间,过期时间等
常用数据类型

8.数据库存储引擎

  详情参考: http://www.cnblogs.com/wangfengming/p/7930333.html

 六.数据库的表操作(核心)

 对数据库文件内容的操作可以总结为:增/删/改/查 四个操作

1.新增操作

1
2
insert into 表(字段1,字段2 ...) values (值1,值2 ...);
insert into 表(字段1,字段2 ...) select 字段1,字段2 ... from 表;
insert into user(id,name,email) values(1,'小猪','xiaozhu@qq.com');
ps:插入一条数据

insert into user(id,name,email) values(1,'小猪','xiaozhu@qq.com'),(2,'小猪2','xiaozhu2@qq.com'),(3,'小猪3','xiaozhu3@qq.com');
ps:插入多条条数据


insert into user values(1,'小猪','xiaozhu@qq.com');
ps:如果插入的数据个数和位置正好与表的字段个数和位置匹配,则可以省略表名后面的字段定义

insert into user(id,name,email) select id,name,email from tb ;
ps:从tb表中查询数据并插入到 user表中
示例

2.更新操作

1
2
update 表 set 字段1= '值1', 字段2='值2' ... ; --更新整表数据
update 表 set 字段1= '值1', 字段2='值2' ... where 字段3 = 值3; -- 更新符合条件字段3的数据
update user set name = '猪猪哥' ;
ps:user表中所有的 name 字段 的值 全部被更新为 '猪猪哥'


update user set name= '猪猪哥' ,age =13 where id = 2;
ps: 更新 user 表中 name 和 age 字段的值,并且只更新 id = 2的一条记录
示例

3.删除操作

1
2
delete from 表 ; -- 整表数据删除
delete from 表 where 字段1=值1; -- 删除符合 where后条件的数据
delete from user;
ps:删除user 表中所有的数据,注意:如果有自增主键,主键记录的值不会被删除.

delete from user where id=1;
ps:只删除id 为1的数据.
示例

4.查询操作

下篇博客详细写.

原文地址:https://www.cnblogs.com/qinghuani/p/8619263.html