1 数据库相关概念html
1.啥是数据库python
2.数据库的分类mysql
3.关系型数据库的特色sql
2 认识MySQL编程
3 数据库的安装windows
4 数据库操做安全
1.显示数据库服务器
2.建立数据库session
6 数据表操做
7 表的增删改查
8 子查询
9 存储引擎和字符集
所谓的数据库,其实就是有点相似于excel表格,主要就是用来管理数据,对数据进行增删改查的。因此某种程度上来讲,excel也能够当作一个简单的数库,只不过是在文件中对数据的读写速度相对较慢,因此如今咱们使用数据库管理系统来管理和存储大量的数据
数据库(Database)是按照数据结构来组织、存储和管理数据的仓库
Mysql是最流行的关系型数据库管理系统,在WEB应用方面MySQL是最好的RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一。由瑞典MySQL AB公司开发,目前属于Oracle公司
MySQL的特色:
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
上一步解决了一些问题,但不够完全,由于在执行【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
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,将数据读取到内存中,从而当即生效
先学习一个简单的建表语句
create table 表名 ( 列1 [列属性 是否为null 默认值], 列2 [列属性 是否为null 默认值], ..... 列n [列属性 是否为null 默认值] )engine = 存储引擎 charset = 字符集
补充:
create table 表名 ( 列1 [列属性 是否为null 默认值], 列2 [列属性 是否为null 默认值], ..... 列n [列属性 是否为null 默认值] )engine = 存储引擎 charset = 字符集
对上述建表语句的解释
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 表
条件为真,则该行取出
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字符集间的转换
那为何会出现乱码?
咱们首先来看一下常常用的字符集的详细信息
对比以上三幅图能够知道,每种字符集中,用于存储一个字符的最大的字节数目都不一样,utf8最大,latin最
小。因此在通过字符集转换器的时候,若是处理不当,会形成数据丢失
好比:咱们将character_set_connection的值改成lantin的时候
从客户端发送过来的utf8数据,会被转成lantin1格式,由于utf8格式的数据占用的字符数较多,从而会形成数据丢失
其实很是的简单,就是数据在通过上面三层转换的时候,只要有一个数据的格式和它两个不同的话,都会出现乱码,所以咱们须要确保三者的字符集是一致的
*使用set names utf8来统一设置,上文已说过 *这种形式的设置只会在当前窗口有效,当窗口关闭后从新打开 CMD 客户端的时候又会出现乱码问题;那么,如何进行一个一劳永逸的设置呢?在 MySQL 的安装目录下有一个 my.ini 配置文件,经过修改这个配置文件能够一劳永逸的解决乱码问题。在这个配置文件中 [mysql] 与客户端配置相关,[mysqld] 与服务器配置相关。默认配置以下:
[mysql] default-character-set=utf8 [mysqld] character-set-server=utf8
修改完成后,service mysql restart重启mysql服务就生效