MySQL学习基础篇

Posted 三千丝

tags:

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

本文目录

1 数据库相关概念

  1.啥是数据库

  2.数据库的分类

  3.关系型数据库的特点

  4.关系型数据库的常用术语

2 认识MySQL

3 数据库的安装

4 数据库操作

  1.显示数据库

  2.创建数据库

  3.使用数据库

  4.用户管理

  5.授权管理

5 MySQL数据类型

  1.数值型

  2.字符串类型

  3.时间日期类型

  4.特殊的NULL类型

6 数据表操作

  1.创建表

  2.删除表

  3.清空表

  4.修改表

7 表的增删改查

  1.增加

  2.删除

  3.修改

  4.基本查询

  5.高级查询

  6.连接查询

8 子查询

9 存储引擎和字符集

  1.存储引擎

  2.字符集

 

 

数据库相关概念

1、啥是数据库

  • 简单理解
所谓的数据库,其实就是有点类似于excel表格,主要就是用来管理数据,对数据进行增删改查的。所以某种程度上来说,excel也可以看成一个简单的数库,只不过是在文件中对数据的读写速度相对较慢,所以现在我们使用数据库管理系统来管理和存储大量的数据
  • 官方定义
数据库(Database)是按照数据结构来组织、存储和管理数据的仓库

 

2、数据库的分类

  • 关系型数据库,如 mysql,Oracle,SqlServer等
  • 非关系型数据库,如 Redis,Mongodb,Memcache等

 

3、关系型数据库的特点

  • 数据以表格的形式出现
  • 每行为各种记录的数据
  • 每列为记录名称所对应的数据域
  • 许多的行和列组成一张表单
  • 若干的表单组成database

 

4、关系型数据库的常用术语

  • 数据库: 数据库是一些关联表的集合。
  • 数据表: 在一个数据库中的表看起来像一个简单的电子表格。
  • 列: 一列(数据元素) 包含了相同的数据, 例如邮政编码的数据。
  • 行:一行(=元组,或记录)是一组相关的数据,例如一条用户订阅的数据。
  • 冗余:存储两倍数据,冗余可以使系统速度更快。(在查询时可能经常需要在多个表之间进行连接查询;而进行连接操作会降低查询速度。例如,学生的信息存储在student表中,院系信息存储在department表中。通过student表中的dept_id字段与department表建立关联关系。如果要查询一个学生所在系的名称,必须从student表中查找学生所在院系的编号(dept_id),然后根据这个编号去department查找系的名称。如果经常需要进行这个操作时,连接查询会浪费很多的时间。因此可以在student表中增加一个冗余字段dept_name,该字段用来存储学生所在院系的名称。这样就不用每次都进行连接操作了。)
  • 主键:主键是唯一的。一个数据表中只能包含一个主键。你可以使用主键来查询数据。
  • 外键:外键用于关联两个表。
  • 复合键:复合键(组合键)将多个列作为一个索引键,一般用于复合索引。
  • 索引:使用索引可快速访问数据库表中的特定信息。索引是对数据库表中一列或多列的值进行排序的一种结构。类似于书籍的目录。

 

认识数据库

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

 

MySQL的特点:

  • MySQL是开源的,所以你不需要支付额外的费用。
  • MySQL使用标准的SQL数据语言形式。
  • MySQL可以允许于多个系统上,并且支持多种语言。这些编程语言包括C、C++、Python、Java、Perl、php、Eiffel、Ruby和Tcl等。
  • MySQL对PHP有很好的支持,PHP是目前最流行的Web开发语言。
  • MySQL支持大型数据库,支持5000万条记录的数据,32位系统表文件最大可支持4GB,64位系统支持最大的表文件为8TB。
  • MySQL是可以定制的,采用了GPL协议,你可以修改源码来开发自己的Mysql系统

 

数据库的安装

  • windows版本

1)下载

http://dev.mysql.com/downloads/mysql/

2)解压

如果想要让MySQL安装在指定目录,那么就将解压后的文件夹移动到指定目录,如:C:\\mysql-5.7.16-winx64

3)服务端初始化

MySQL解压后的 bin 目录下有一大堆的可执行文件,执行如下命令初始化数据

cd c:\\mysql-5.7.16-winx64\\bin
mysqld --initialize-insecure

4)启动MySQL服务器

由于初始化时使用的【mysqld –initialize-insecure】命令,其默认未给root账户设置密码

# 进入可执行文件目录
cd c:\\mysql-5.7.16-winx64\\bin
 
# 连接MySQL服务器
mysql -u root -p
 
# 提示请输入密码,直接回车

  

登录成功后,会出现以下的显示

到此为止,MySQL服务端已经安装成功并且客户端已经可以连接上,以后再操作MySQL时,只需要重复上述4、5步骤即可。但是,在4、5步骤中重复的进入可执行文件目录比较繁琐,如想日后操作简便,可以做如下操作:

添加环境变量

将MySQL可执行文件添加到环境变量中,从而执行执行命令即可

右键计算机】--》【属性】--》【高级系统设置】--》【高级】--》【环境变量】--》【在第二个内容框中找到 变量名为Path 的一行,双击】 --> 【将MySQL的bin目录路径追加到变值值中,用 ; 分割】
 
如:
C:\\Program Files (x86)\\Parallels\\Parallels Tools\\Applications;%SystemRoot%\\system32;%SystemRoot%;%SystemRoot%\\System32\\Wbem;%SYSTEMROOT%\\System32\\WindowsPowerShell\\v1.0\\;C:\\Python27;C:\\Python35;C:\\mysql-5.7.16-winx64\\bin

 如此一来,以后再启动服务并连接时,仅需:

# 启动MySQL服务,在终端输入
mysqld
# 连接MySQL服务,在终端输入:
mysql -u root -p

将MySQL服务制作成windows服务

上一步解决了一些问题,但不够彻底,因为在执行【mysqd】启动MySQL服务器时,当前终端会被hang住,那么做一下设置即可解决此问题:

# 制作MySQL的Windows服务,在终端执行此命令:
"c:\\mysql-5.7.16-winx64\\bin\\mysqld" --install
 
# 移除MySQL的Windows服务,在终端执行此命令:
"c:\\mysql-5.7.16-winx64\\bin\\mysqld" --remove

注册成服务之后,以后再启动和关闭MySQL服务时,仅需执行如下命令:

# 启动MySQL服务
net start mysql
 
# 关闭MySQL服务
net stop mysql
  • Linux版本

yum包安装和源码安装两种方式,推荐使用yum包的方式进行安装

源码安装:http://www.cnblogs.com/shangzekai/p/4374489.html

yum安装:

yum install mysql-server 
service mysqld start
mysql -h host -u user -p

  

数据库操作

 1、显示数据库

SHOW DATABASES;

2、创建数据库

# utf-8
CREATE DATABASE 数据库名称 DEFAULT CHARSET utf8 COLLATE utf8_general_ci;

3、使用数据库

USE db_name;

显示当前使用的数据库中所有表:SHOW TABLES;

4、用户管理

创建用户
    create user \'用户名\'@\'IP地址\' identified by \'密码\';
删除用户
    drop user \'用户名\'@\'IP地址\';
修改用户
    rename user \'用户名\'@\'IP地址\'; to \'新用户名\'@\'IP地址\';;
修改密码
    set password for \'用户名\'@\'IP地址\' = Password(\'新密码\')
  
PS:用户权限相关数据保存在mysql数据库的user表中,所以也可以直接对其进行操作(不建议)

5、授权管理

show grants for \'用户\'@\'IP地址\'                  -- 查看权限
grant  权限 on 数据库.表 to   \'用户\'@\'IP地址\'      -- 授权
revoke 权限 on 数据库.表 from \'用户\'@\'IP地址\'      -- 取消权限
  • 授权目标数据库的各类方式
数据库名.*           数据库中的所有
数据库名.表          指定数据库中的某张表
数据库名.存储过程     指定数据库中的存储过程
*.*                所有数据库
  • 授权用户的各类方式
用户名@IP地址         用户只能在改IP下才能访问
用户名@192.168.1.%   用户只能在改IP段下才能访问(通配符%表示任意)
用户名@%             用户可以再任意IP下访问(默认IP地址为%)

常见的例子:

grant all privileges on db1.tb1 TO \'用户名\'@\'IP\'
grant select on db1.* TO \'用户名\'@\'IP\'
grant select,insert on *.* TO \'用户名\'@\'IP\'
revoke select on db1.tb1 from \'用户名\'@\'IP\'

  操作完成之后,不会立即生效,要想立即生效,可以如下操作

flush privileges,将数据读取到内存中,从而立即生效

 

MySQL数据类型

先学习一个简单的建表语句

create table 表名 (
    列1 [列属性 是否为null 默认值],
    列2 [列属性 是否为null 默认值],
    .....
    列n [列属性 是否为null 默认值]
)engine = 存储引擎  charset = 字符集  

1、数值型

补充:

  • unsigned表示为无符号
  • float(M,D) 浮点型
  • decimal(M,D) 定点型 比float更加的精准
  • M: 精度(总位数)D: 标度(小数位)

2、字符串类型

3、时间日期类型

4、特殊的NULL类型

  • NULL 不是假,也不是真,而是”空”
  • NULL 的判断只能用is null,is not null
  • NULL 影响查询速度,一般避免使值为NULL

 

数据表操作

1、创建表

create table 表名 (
    列1 [列属性 是否为null 默认值],
    列2 [列属性 是否为null 默认值],
    .....
    列n [列属性 是否为null 默认值]
)engine = 存储引擎  charset = 字符集

  

对上述建表语句的解释

  • 是否为null
not null    - 不可空
null        - 可空
  • 默认值

创建列时可以指定默认值,当插入数据时如果未主动设置,则自动添加默认值

create table tb1(
    id int not null defalut 2,
    num int not null
)

  

  • 自增

如果为某列设置自增列,插入数据时无需设置此列,默认将自增(表中只能有一个自增列)

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)
)

  注意:

对于自增列,必须是索引(含主键)
对于自增可以设置步长和起始值

 

show session variables like \'auto_inc%\';
set session auto_increment_increment = 2;
set session auto_increment_offset = 10;
shwo global  variables like \'auto_inc%\';
set global auto_increment_increment = 2;
set global auto_increment_offset = 10;

  

  • 主键

一种特殊的唯一索引,不允许有空值,如果主键使用单个列,则它的值必须唯一,如果是多列,则其组合必须唯一

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)
)

  

  • 外键
creat table color(
    nid int not null primary key,
    name char(16) not null
)
create table fruit(
    nid int not null primary key,
    smt char(32) null ,
    color_id int not null,
    constraint fk_cc foreign key (color_id) references color(nid)
)

  

2、删除表

drop table 表名

 

3、清空表

delete from 表名
truncate table 表名

 

4、修改表

添加列:alter table 表名 add 列名 类型
删除列:alter table 表名 drop column 列名
修改列:
        alter table 表名 modify column 列名 类型;  -- 类型
        alter table 表名 change 原列名 新列名 类型; -- 列名,类型
  
添加主键:
        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 外键名称

 

表的增删改查 

1、增加

insert into 表 (列名,列名...) values (值,值,值...)
insert into 表 (列名,列名...) values (值,值,值...),(值,值,值...)
insert into 表 (列名,列名...) select (列名,列名...) from 表

  注释:列名可以不写,如果不写,则默认插入所有列的数据

 

2、删除

 

delete from 表
delete from 表 where id=1 and name=\'yb\'

  

3、修改

update 表 set name = \'yb\'
update 表 set name = \'yb\' where id>1

  

4、基本查询

select * from 表

  

5、高级查询

  • where条件查询

条件为真,则该行取出

select * from 表 where id > 1
select nid,name,gender from 表 where id > 1

  

注意:where之后可以跟的运算符类型如下

常见的例子

select * from 表 where id > 1 and name != \'yb\' and num = 12;
select * from 表 where id between 5 and 16;
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 表)

  

  • 通配符匹配
select * from 表 where name like \'y%\'  - y开头的所有(多个字符串)
select * from 表 where name like \'y_\'  - y开头的所有(一个字符)
  • 限制取几条
limit [偏移量], 取出条目
分页应用中最为典型,如第1页取1-20条,第2页取21-40条
select * from 表 limit 5;            - 前5行
select * from 表 limit 4,5;          - 从第4行开始的5行
select * from 表 limit 5 offset 4    - 从第4行开始的5行(不推荐) 
  • 排序
对栏目的商品按价格由高到低或由低到高排序
各种排序场合,如取热点新闻,发帖状元等
默认是升序排列
select * from 表 order by 列 asc              - 根据 “列” 从小到大排列
select * from 表 order by 列 desc             - 根据 “列” 从大到小排列
  • 分组
把行按某个字段进行分组
见于统计场合,如按栏目计算帖子数,统计每个人的平均成绩等
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 by 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之前

  

having和where的异同点:

1). having与where类似,可筛选数据
2). where针对表中的列发挥作用,查询数据
3). having针对查询结果中的列发挥作用,筛选数据

注意:上述查询条件写的时候的顺序

 

group by > order by > limit
select name,sum(score) from 表 where id > 10 group by score order by age desc limit 2, 10

  

6、连接查询

  • 作用
从2张或多张表中,取出有关联的数据
  • 场景
取文章及所在栏目名称,取个人信息及所发布的文章等
  • 种类
左连接
右连接
内连接
  • 左连接语法

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
  • 内连接语法

内连接是左右连接的交集

select A.num, A.name, B.name
from A inner join B
on A.nid = B.nid

  

子查询

子查询就是在原有的查询语句中,嵌入新的查询,来得到我们想要的结果集。

where型子查询

把内层sql语句查询的结果作为外层sql查询的条件
  • 典型语法
select * from tableName 
where colName = (select colName from tbName where ....) 
或
{where colName in (select colName from tbName where ..)}
  • 应用场景
查询出某大栏目下的所有商品

  

 

存储引擎和字符集

1、存储引擎

设有张马虎,李小心两人,都是地铁口的自行车管理员.每天都有很多人来存取自行车
张马虎的管理方式是:来存自己存,不记录存的是什么车,取时交5毛,也不检查取的是否是自己的车.
李小心呢,则在存取自己车时,记录存车人的特征与自行车的特征,当人来取车,还要小心核一下,人与车的特征是否对应

其实存储引擎和上述的情况都是一样的

数据库对同样的数据,有着不同的存储方式和管理方式
在mysql中,称为存储引擎
  • 存储引擎的特点和分类

  • 存储引擎的选择

1). 文章,新闻等安全性要求不高的,选myisam
2). 订单,资金,账单,火车票等对安全性要求高的,选用innodb
3). 对于临时中转表,可以用memory型 ,速度最快

 

MySQL在5.6版本以上,默认的存储引擎就是innodb

 

2、字符集

字符集是一套符号和编码的规则,不论是在 oracle 数据库还是在 mysql 数据库,都存在字符集的选择问题,而且如果在数据库创建阶段没有正确选择字符集,那么可能在后期需要更换字符集,而字符集的更换是代价比较高的操作,也存在一定的风险,所以,我们推荐在应用开始阶段,就按照需求正确的选择合适的字符集,避免后期不必要的调整
  • 查看所有字符集

在mysql客户端与mysql服务端之间,存在着一个字符集转换器,来看一下mysql字符集间的转换

  • character_set_client => utf8 (客户端告诉转换器发送过来的是utf8格式的编码)
  • character_set_connection => utf8(将客户端传送过来的数据转换成utf8格式)
  • character_set_results => utf8 (告诉客户端结果数据的编码是utf8)
    注:以上三个字符集可以使用set names utf8来统一进行设置

 

那为什么会出现乱码?

我们首先来看一下经常用的字符集的详细信息

  • latin字符集

latin.jpg

  • gbk字符集

gbk.jpg

  • utf8字符集

utf8.jpg

 

对比以上三幅图可以知道,每种字符集中,用于存储一个字符的最大的字节数目都不同,utf8最大,latin最
小。所以在经过字符集转换器的时候,如果处理不当,会造成数据丢失

 

比如:我们将character_set_connection的值改为lantin的时候
latin1.png

从客户端发送过来的utf8数据,会被转成lantin1格式,因为utf8格式的数据占用的字符数较多,从而会造成数据丢失

results.png

  • 如何避免以上的情况?
其实非常的简单,就是数据在经过上面三层转换的时候,只要有一个数据的格式和它两个不一样的话,都会出现乱码,因此我们需要确保三者的字符集是一致的
  • 设置字符集的两种方法
*使用set names utf8来统一设置,上文已说过
*这种形式的设置只会在当前窗口有效,当窗口关闭后重新打开 CMD 客户端的时候又会出现乱码问题;那么,如何进行一个一劳永逸的设置呢?在 MySQL 的安装目录下有一个 my.ini 配置文件,通过修改这个配置文件可以一劳永逸的解决乱码问题。在这个配置文件中 [mysql] 与客户端配置相关,[mysqld] 与服务器配置相关。默认配置如下:
[mysql]
default-character-set=utf8
[mysqld]
character-set-server=utf8

  修改完成后,service mysql restart重启mysql服务就生效

 

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

mysql基础篇 - 数据库及表的修改和删除

MySQL 总结篇 [在Oracle基础上学习的MySQL]

MySQL学习基础篇

《MySQL45讲》基础篇总结

《MySQL45讲》基础篇总结

MySQL学习基础篇Day9