MySQL基础

Posted 心灵蚂蚁

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL基础相关的知识,希望对你有一定的参考价值。

一、MySQL的相关概念介绍

mysql 为关系型数据库(Relational Database Management System), 这种所谓的"关系型"可以理解为"表格"的概念, 一个关系型数据库由一个或数个表格组成。

MySQL规范

  • 在数据库系统中 , SQL语句不区分大小写 (建议用大写) , 但字符串常量区分大小写 ; 建议命令大写 , 表名库名小写
  • SQL语句可单行或多行书写 , 以" ; "结尾 , 关键字不能跨多行或简写
  • 用空格和缩进来提高语句的可读性 , 子句通常位于独立行 , 便于编辑 , 提高可读性
  • 单行注释 : -- 多行注释 : / *... */
  • SQL语句可拆行操作

二、MySQL中的数据类型

MySQL有三大类数据类型, 分别为数字、日期\\时间、字符串, 这三大类中又更细致的划分了许多子类型:

  • 数字类型
    • 整数: tinyint、smallint、mediumint、int、bigint
    • 浮点数: float、double、real、decimal
  • 日期和时间: date、time、datetime、timestamp、year
  • 字符串类型
    • 字符串: char、varchar
    • 文本: tinytext、text、mediumtext、longtext
    • 二进制(可用来存储图片、音乐等): tinyblob、blob、mediumblob、longblob

这里不能详细对这些类型进行介绍了, 篇幅可能会很长, 详细介绍参见: 《MySQL数据类型》 :http://www.cnblogs.com/zbseoag/archive/2013/03/19/2970004.html

三、使用MySQL数据库

当 MySQL 服务已经运行时, 我们可以通过MySQL自带的客户端工具登录到MySQL数据库中, 首先打开命令提示符, 输入以下格式的命名:

mysql -h 主机名 -u 用户名 -p 密码;
  • -h : 该命令用于指定客户端所要登录的MySQL主机名, 登录当前机器该参数可以省略;
  • -u : 所要登录的用户名;
  • -p : 告诉服务器将会使用一个密码来登录, 如果所要登录的用户名密码为空, 可以忽略此选项。

输入 exit 或 quit 退出登录。

登录,设置密码

初始状态下,管理员root,密码为空,默认只允许从本机登录localhost
设置密码
[root@egon ~]# mysqladmin -uroot password "123"        设置初始密码 由于原密码为空,因此-p可以不用
[root@egon ~]# mysqladmin -uroot -p"123" password "456"        修改mysql密码,因为已经有密码了,所以必须输入原密码才能设置新密码

命令格式:
[root@egon ~]# mysql -h172.31.0.2 -uroot -p456
[root@egon ~]# mysql -uroot -p
[root@egon ~]# mysql                    以root用户登录本机,密码为空
View Code

 忘记密码

linux平台下,破解密码的两种方式

[root@egon ~]# rm -rf /var/lib/mysql/mysql #所有授权信息全部丢失!!!
[root@egon ~]# systemctl restart mariadb
[root@egon ~]# mysql
方法一:删除授权库mysql,重新初始化
[root@egon ~]# vim /etc/my.cnf    #mysql主配置文件
[mysqld]
skip-grant-table
[root@egon ~]# systemctl restart mariadb
[root@egon ~]# mysql
MariaDB [(none)]> update mysql.user set password=password("123") where user="root" and host="localhost";
MariaDB [(none)]> flush privileges;
MariaDB [(none)]> \\q
[root@egon ~]# #打开/etc/my.cnf去掉skip-grant-table,然后重启
[root@egon ~]# systemctl restart mariadb
[root@egon ~]# mysql -u root -p123 #以新密码登录
方法二:启动时,跳过授权库

windows平台下,5.7版本mysql,破解密码的两种方式:

#1 关闭mysql
#2 在cmd中执行:mysqld --skip-grant-tables
#3 在cmd中执行:mysql
#4 执行如下sql:
update mysql.user set authentication_string=password(\'\') where user = \'root\';
flush privileges;

#5 tskill mysqld #或taskkill -f /PID 7832
#6 重新启动mysql

方式一
方式一
#1. 关闭mysql,可以用tskill mysqld将其杀死
#2. 在解压目录下,新建mysql配置文件my.ini
#3. my.ini内容,指定
[mysqld]
skip-grant-tables

#4.启动mysqld
#5.在cmd里直接输入mysql登录,然后操作
update mysql.user set authentication_string=password(\'\') where user=\'root and host=\'localhost\';

flush privileges;

#6.注释my.ini中的skip-grant-tables,然后启动myqsld,然后就可以以新密码登录了

方式二
方式二

在windows下,为mysql服务指定配置文件

强调:配置文件中的注释可以有中文,但是配置项中不能出现中文

#在mysql的解压目录下,新建my.ini,然后配置
#1. 在执行mysqld命令时,下列配置会生效,即mysql服务启动时生效
[mysqld]
;skip-grant-tables
port=3306
character_set_server=utf8
default-storage-engine=innodb
innodb_file_per_table=1


#解压的目录
basedir=E:\\mysql-5.7.19-winx64
#data目录
datadir=E:\\my_data #在mysqld --initialize时,就会将初始数据存入此处指定的目录,在初始化之后,启动mysql时,就会去这个目录里找数据



#2. 针对客户端命令的全局配置,当mysql客户端命令执行时,下列配置生效
[client]
port=3306
default-character-set=utf8
user=root
password=123

#3. 只针对mysql这个客户端的配置,2中的是全局配置,而此处的则是只针对mysql这个命令的局部配置
[mysql]
;port=3306
;default-character-set=utf8
user=egon
password=4573


#!!!如果没有[mysql],则用户在执行mysql命令时的配置以[client]为准

my.ini
View Code

 统一字符编码

#1. 修改配置文件
[mysqld]
default-character-set=utf8 
[client]
default-character-set=utf8 
[mysql]
default-character-set=utf8

#mysql5.5以上:修改方式有所改动
[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8

#2. 重启服务
#3. 查看修改结果:
\\s
show variables like \'%char%\'
View Code

显示当前时间

select now();

显示数据库版本

select version();

创建一个数据库

create database 数据库名 [其他选项];

例如我们需要创建一个名为python01 的数据库, 在命令行下执行以下命令:

create database python01 charset=utf8;  # charset=utf8 是指定数据库支持的编码类型,默认是拉丁文,注意不是utf-8

注意: MySQL语句以分号(;)作为语句的结束

查看数据库

show databases; # 注意加s

查看数据库的创建语句

show create database python01;

修改数据库的字符类型

alter database python01 charset=utf8;

删除数据库

drop databse python01;

使用数据库

use python01;

查看当前使用的数据库

select database();

三、数据表的操作

创建数据表

create table 数据表名字 (字段 类型 约束, ....)

eg:

create table xxxx (id int, name varchar(30));

查看数据表

show tables;

查看数据表详细信息

desc xxxx;

 加约束

create table xxx (id int primary Key not null auto_increment, name varchar(30));

为了方便写的时候观看,可以拆成多行

create table xxx (
    id int primary Key not null auto_increment, 
    name varchar(30)
);

注意注意注意:表中的最后一个字段不要加逗号 

小练习题

create table student(
    id int unsigned not null primary Key auto_increment,
    name varchar(20),
    age tinyint unsigned default 0,
    hight decimal(5, 2), # 有5个数字,其中两个是小数
    gender enum("", "", "中性", "保密") default "保密", # 枚举  enum 单选 只能在给定的范围内选一个值,如性别 sex 男male/女female;set 多选 在给定的范围内可以选择一个或一个以上的值(爱好1,爱好2,爱好3...)
    cls_id int unsigned
);

往表中插入数据

insert into student value(0, "老王", 18, 180.88, "", 1);

查看表中所有列

 select * from student;

建立表之间的关系

#一对多或称为多对一
三张表:出版社,作者信息,书

一对多(或多对一):一个出版社可以出版多本书

关联方式:foreign key
=====================多对一=====================
create table press(
id int primary key auto_increment,
name varchar(20)
);

create table book(
id int primary key auto_increment,
name varchar(20),
press_id int not null,
foreign key(press_id) references press(id)
on delete cascade
on update cascade
);


insert into press(name) values
(\'北京工业地雷出版社\'),
(\'人民音乐不好听出版社\'),
(\'知识产权没有用出版社\')
;

insert into book(name,press_id) values
(\'九阳神功\',1),
(\'九阴真经\',2),
(\'九阴白骨爪\',2),
(\'独孤九剑\',3),
(\'降龙十巴掌\',2),
(\'葵花宝典\',3)
;
View Code
#多对多
三张表:出版社,作者信息,书

多对多:一个作者可以写多本书,一本书也可以有多个作者,双向的一对多,即多对多
  
关联方式:foreign key+一张新的表
=====================多对多=====================
create table author(
id int primary key auto_increment,
name varchar(20)
);


#这张表就存放作者表与书表的关系,即查询二者的关系查这表就可以了
create table author2book(
id int not null unique auto_increment,
author_id int not null,
book_id int not null,
constraint fk_author foreign key(author_id) references author(id)
on delete cascade
on update cascade,
constraint fk_book foreign key(book_id) references book(id)
on delete cascade
on update cascade,
primary key(author_id,book_id)
);


#插入四个作者,id依次排开
insert into author(name) values(\'egon\'),(\'alex\'),(\'yuanhao\'),(\'wpq\');

#每个作者与自己的代表作如下
egon: 
九阳神功
九阴真经
九阴白骨爪
独孤九剑
降龙十巴掌
葵花宝典
alex: 
九阳神功
葵花宝典
yuanhao:
独孤九剑
降龙十巴掌
葵花宝典
wpq:
九阳神功


insert into author2book(author_id,book_id) values
(1,1),
(1,2),
(1,3),
(1,4),
(1,5),
(1,6),
(2,1),
(2,6),
(3,4),
(3,5),
(3,6),
(4,1)
;
View Code

四、数据表的增删改查

增加字段

alter table student add birthday datetime;

修改字段,不重命名版

alter table student modify birthday date; # birthday字段不变,改变类型

修改字段,重命名版

alter table student change birthday birth date default "1990-01-01";

删除字段

alter table student drop hight;

相应的值也会被删除

删除数据表

 drop table xxx;

最常用的部分,数据的增删改查

向表中插入数据

insert into classes value(0, "菜鸟班"); # classes的id被设定为自动增加,所以插入数据时id部分随便我们怎么写都行,都会自动改变按应该的顺序增加

eg:

insert into classes value(null, "菜鸟班");
insert into classes value(default, "菜鸟班");

# 枚举中的下标从1开始  1----------》 “男”

insert into student values(default, "小李飞刀“, 20, 1, 1, "1990-02-01");

部分插入

insert student(name, gender) values("小乔", 2);

多行插入

insert into student(name, gender) values("大乔", 2),("貂蝉", 2);

更新数据

update student set gender=2 where id=1; # 不指定id将全部修改

定条件查询

select * from student where name="小乔";
select * from student where id > 3;
select name, gender from student where id=2;
select name as 姓名, gender as 性别 from student where id=2;

删除数据

delect from student where xxx;

逻辑删除,用一个字段表示这条信息不在使用

给student添加is_delete字段,bit类型

alter table student add is_delete bit default 0;

复制表

复制表结构+记录 (key不会复制: 主键、外键和索引)
mysql> create table new_service select * from service;

只复制表结构
mysql> select * from service where 1=2;        //条件为假,查不到任何记录
Empty set (0.00 sec)
mysql> create table new1_service select * from service where 1=2;  
Query OK, 0 rows affected (0.00 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> create table t4 like employees;

总结

SQL语言主要用于存取数据、查询数据、更新数据和管理关系数据库系统,SQL语言由IBM开发。SQL语言分为3种类型:
#1、DDL语句    数据库定义语言: 数据库、表、视图、索引、存储过程,例如CREATE DROP ALTER
#2、DML语句    数据库操纵语言: 插入数据INSERT、删除数据DELETE、更新数据UPDATE、查询数据SELECT
#3、DCL语句    数据库控制语言: 例如控制用户的访问权限GRANT、REVOKE
#1. 操作文件夹
        增:create database db1 charset utf8;
        查:show databases;
        改:alter database db1 charset latin1;
        删除: drop database db1;


#2. 操作文件
    先切换到文件夹下:use db1
        增:create table t1(id int,name char);
        查:show tables
        改:alter table t1 modify name char(3);
              alter table t1 change name name1 char(2);
        删:drop table t1;
    

#3. 操作文件中的内容/记录
        增:insert into t1 values(1,\'egon1\'),(2,\'egon2\'),(3,\'egon3\');
        查:select * from t1;
        改:update t1 set name=\'sb\' where id=2;
        删:delete from t1 where id=1;

        清空表:
            delete from t1; #如果有自增id,新增的数据,仍然是以删除前的最后一样作为起始。
            truncate table t1;数据量大,删除速度比上一条快,且直接从零开始,

            auto_increment 表示:自增
            primary key 表示:约束(不能重复且不能为空);加速查找
View Code

五、存储引擎

1、什么是数据库引擎

mysql中建立的库===>文件夹

库中建立的表===>文件

现实生活中我们用来存储数据的文件有不同的类型,每种文件类型对应各自不同的处理机制:比如处理文本用txt类型,处理表格用excel,处理图片用png等

数据库中的表也应该有不同的类型,表的类型不同,会对应mysql不同的存取机制,表类型又称为存储引擎。

存储引擎说白了就是如何存储数据、如何为存储的数据建立索引和如何更新、查询数据等技术的实现方
法。因为在关系数据库中数据的存储是以表的形式存储的,所以存储引擎也可以称为表类型(即存储和
操作此表的类型)

在Oracle 和SQL Server等数据库中只有一种存储引擎,所有数据存储管理机制都是一样的。而MySql
数据库提供了多种存储引擎。用户可以根据不同的需求为数据表选择不同的存储引擎,用户也可以根据
自己的需要编写自己的存储引擎

创建新表时如果不指定存储引擎 , 那么系统就会使用默认存储引擎 , MySQL 5.5 之前的默认存储引擎是MyISAM , 5.5 之后改为了InnoDB

查看当前数据库支持的存储引擎类型;

SHOW ENGINES;

查看正在使用的存储引擎

show variables like \'storage_engine%\'; #查看正在使用的存储引擎

1.MyISAM 和 InnoDB的适用场景

MyISAM适合:(1)做很多count 的计算;(2)插入不频繁,查询非常频繁;(3)没有事务。

InnoDB适合:(1)可靠性要求比较高,或者要求事务;(2)表更新和查询都相当的频繁,并且表锁定的机会比较大的情况。

2.MyISAM 和 InnoDB的区别

1)MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持

2)myisam表不支持外键

3)在执行数据库写入的操作(insert,update,delete)的时候,myisam表会锁表,而innodb表会锁行

4)当你的数据库有大量的写入、更新操作而查询比较少或者数据完整性要求比较高的时候就选择innodb表。当你的数据库主要以查询为主,相比较而言更新和写 入比较少,并且业务方面数据完整性要求不那么严格,就选择mysiam表。因为mysiam表的查询操作效率和速度都比innodb要快

#InnoDB 存储引擎
支持事务,其设计目标主要面向联机事务处理(OLTP)的应用。其
特点是行锁设计、支持外键,并支持类似 Oracle 的非锁定读,即默认读取操作不会产生锁。 从 MySQL 5.5.8 版本开始是默认的存储引擎。
InnoDB 存储引擎将数据放在一个逻辑的表空间中,这个表空间就像黑盒一样由 InnoDB 存储引擎自身来管理。从 MySQL 4.1(包括 4.1)版本开始,可以将每个 InnoDB 存储引擎的 表单独存放到一个独立的 ibd 文件中。此外,InnoDB 存储引擎支持将裸设备(row disk)用 于建立其表空间。
InnoDB 通过使用多版本并发控制(MVCC)来获得高并发性,并且实现了 SQL 标准 的 4 种隔离级别,默认为 REPEATABLE 级别,同时使用一种称为 netx-key locking 的策略来 避免幻读(phantom)现象的产生。除此之外,InnoDB 存储引擎还提供了插入缓冲(insert buffer)、二次写(double write)、自适应哈希索引(adaptive hash index)、预读(read ahead) 等高性能和高可用的功能。
对于表中数据的存储,InnoDB 存储引擎采用了聚集(clustered)的方式,每张表都是按 主键的顺序进行存储的,如果没有显式地在表定义时指定主键,InnoDB 存储引擎会为每一 行生成一个 6 字节的 ROWID,并以此作为主键。
InnoDB 存储引擎是 MySQL 数据库最为常用的一种引擎,Facebook、Google、Yahoo 等 公司的成功应用已经证明了 InnoDB 存储引擎具备高可用性、高性能以及高可扩展性。对其 底层实现的掌握和理解也需要时间和技术的积累。如果想深入了解 InnoDB 存储引擎的工作 原理、实现和应用,可以参考《MySQL 技术内幕:InnoDB 存储引擎》一书。

#MyISAM 存储引擎
不支持事务、表锁设计、支持全文索引,主要面向一些 OLAP 数 据库应用,在 MySQL 5.5.8 版本之前是默认的存储引擎(除 Windows 版本外)。数据库系统 与文件系统一个很大的不同在于对事务的支持,MyISAM 存储引擎是不支持事务的。究其根 本,这也并不难理解。用户在所有的应用中是否都需要事务呢?在数据仓库中,如果没有 ETL 这些操作,只是简单地通过报表查询还需要事务的支持吗?此外,MyISAM 存储引擎的 另一个与众不同的地方是,它的缓冲池只缓存(cache)索引文件,而不缓存数据文件,这与 大多数的数据库都不相同。

#NDB 存储引擎
年,MySQL AB 公司从 Sony Ericsson 公司收购了 NDB 存储引擎。 NDB 存储引擎是一个集群存储引擎,类似于 Oracle 的 RAC 集群,不过与 Oracle RAC 的 share everything 结构不同的是,其结构是 share nothing 的集群架构,因此能提供更高级别的 高可用性。NDB 存储引擎的特点是数据全部放在内存中(从 5.1 版本开始,可以将非索引数 据放在磁盘上),因此主键查找(primary key lookups)的速度极快,并且能够在线添加 NDB 数据存储节点(data node)以便线性地提高数据库性能。由此可见,NDB 存储引擎是高可用、 高性能、高可扩展性的数据库集群系统,其面向的也是 OLTP 的数据库应用类型。

#Memory 存储引擎
正如其名,Memory 存储引擎中的数据都存放在内存中,数据库重 启或发生崩溃,表中的数据都将消失。它非常适合于存储 OLTP 数据库应用中临时数据的临时表,也可以作为 OLAP 数据库应用中数据仓库的维度表。Memory 存储引擎默认使用哈希 索引,而不是通常熟悉的 B+ 树索引。

#Infobright 存储引擎
第三方的存储引擎。其特点是存储是按照列而非行的,因此非常 适合 OLAP 的数据库应用。其官方网站是 http://www.infobright.org/,上面有不少成功的数据 仓库案例可供分析。

#NTSE 存储引擎
网易公司开发的面向其内部使用的存储引擎。目前的版本不支持事务, 但提供压缩、行级缓存等特性,不久的将来会实现面向内存的事务支持。

#BLACKHOLE
黑洞存储引擎,可以应用于主备复制中的分发主库。

MySQL 数据库还有很多其他存储引擎,上述只是列举了最为常用的一些引擎。如果 你喜欢,完全可以编写专属于自己的引擎,这就是开源赋予我们的能力,也是开源的魅 力所在。
MySQL存储引擎介绍

 

以上是关于MySQL基础的主要内容,如果未能解决你的问题,请参考以下文章

linux中怎么查看mysql数据库版本

从mysql的片段中加载ListView

[Go] 通过 17 个简短代码片段,切底弄懂 channel 基础

连接MySQL出现错误:ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using password: YES)(代码片段

使用 json rereiver php mysql 在片段中填充列表视图

关于mysql驱动版本报错解决,Cause: com.mysql.jdbc.exceptions.jdbc4Unknown system variable ‘query_cache_size(代码片段