MySQL学习基础篇

本文目录

1 数据库相关概念html

  1.啥是数据库python

  2.数据库的分类mysql

  3.关系型数据库的特色sql

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

2 认识MySQL编程

3 数据库的安装windows

4 数据库操做安全

  1.显示数据库服务器

  2.建立数据库session

  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.字符集

 

 

数据库相关概念

一、啥是数据库

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

 

二、数据库的分类

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

 

三、关系型数据库的特色

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

 

四、关系型数据库的经常使用术语

  • 数据库: 数据库是一些关联表的集合。
  • 数据表: 在一个数据库中的表看起来像一个简单的电子表格。
  • 列: 一列(数据元素) 包含了相同的数据, 例如邮政编码的数据。
  • 行:一行(=元组,或记录)是一组相关的数据,例如一条用户订阅的数据。
  • 冗余:存储两倍数据,冗余可使系统速度更快。(在查询时可能常常须要在多个表之间进行链接查询;而进行链接操做会下降查询速度。例如,学生的信息存储在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时,只须要重复上述四、5步骤便可。可是,在四、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

  

数据库操做

 一、显示数据库

SHOW DATABASES;

二、建立数据库

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

三、使用数据库

USE db_name;

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

四、用户管理

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

五、受权管理

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 = 字符集  

一、数值型

补充:

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

二、字符串类型

三、时间日期类型

四、特殊的NULL类型

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

 

数据表操做

一、建立表

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

  

二、删除表

drop table 表名

 

三、清空表

delete from 表名
truncate table 表名

 

四、修改表

添加列: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 外键名称

 

表的增删改查 

一、增长

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

  注释:列名能够不写,若是不写,则默认插入全部列的数据

 

二、删除

 

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

  

三、修改

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

  

四、基本查询

select * from 表

  

五、高级查询

  • 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

  

六、链接查询

  • 做用
从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 ..)}
  • 应用场景
查询出某大栏目下的全部商品

  

 

存储引擎和字符集

一、存储引擎

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

其实存储引擎和上述的状况都是同样的

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

  • 存储引擎的选择

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

 

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

 

二、字符集

字符集是一套符号和编码的规则,不管是在 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服务就生效

相关文章
相关标签/搜索