<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>数据库 &#8211; 个人随笔</title>
	<atom:link href="/classify/%E6%95%B0%E6%8D%AE%E5%BA%93/feed" rel="self" type="application/rss+xml" />
	<link>/</link>
	<description></description>
	<lastBuildDate>Sun, 20 May 2018 01:23:42 +0000</lastBuildDate>
	<language>zh-CN</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.6.1</generator>

<image>
	<url>/wp-content/uploads/2022/01/cropped-截屏2022-01-01-18.57.09-32x32.png</url>
	<title>数据库 &#8211; 个人随笔</title>
	<link>/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Memcache 安装配置(C/S结构)、操作、算法、常见问题、分布式</title>
		<link>/%e6%95%b0%e6%8d%ae%e5%ba%93/5259.html</link>
					<comments>/%e6%95%b0%e6%8d%ae%e5%ba%93/5259.html#respond</comments>
		
		<dc:creator><![CDATA[Mr.Lee]]></dc:creator>
		<pubDate>Sat, 19 May 2018 14:32:49 +0000</pubDate>
				<category><![CDATA[Memcache]]></category>
		<category><![CDATA[数据库]]></category>
		<category><![CDATA[分布式]]></category>
		<category><![CDATA[安装配置(C/S结构)]]></category>
		<category><![CDATA[常见问题]]></category>
		<category><![CDATA[操作]]></category>
		<category><![CDATA[算法]]></category>
		<guid isPermaLink="false">/?p=5259</guid>

					<description><![CDATA[NoSQL（Memcache） 一、大型项目优化概述 1、PHP项目执行流程 【简单理解】 读取源码 -》 词 [&#8230;]]]></description>
										<content:encoded><![CDATA[<h1>NoSQL（Memcache）</h1>
<h1>一、大型项目优化概述</h1>
<h2>1、PHP项目执行流程  </h2>
<p><img fetchpriority="high" decoding="async" width="838" height="306" src="/wp-content/uploads/2018/05/word-image-4760.png" class="wp-image-5260" srcset="/wp-content/uploads/2018/05/word-image-4760.png 838w, /wp-content/uploads/2018/05/word-image-4760-300x110.png 300w, /wp-content/uploads/2018/05/word-image-4760-768x280.png 768w" sizes="(max-width: 838px) 100vw, 838px" /></p>
<p>
  【简单理解】
</p>
<p>
  读取源码 -》 词法分析  -》 创建opcode -》 执行opcode 重复创建会增加额外的内存和CPU开销
</p>
<p>
  【解决方案】
</p>
<p>
  安装ZendOptimizer或APC2.0等可以加速PHP代码访问，主要用于缓存opcode而不是每次重复编译减少CPU和内存开销（php5.5+后不需要安装第三方软件，直接开启PHP配置文件中Opcache即可。
</p>
</p>
<p><a href="http://www.cnblogs.com/HD/p/4554455.html">http://www.cnblogs.com/HD/p/4554455.html</a>
</p>
</p>
<h2>2、大型项目优化的方向</h2>
<h3>1）代码优化 </h3>
<p>
  开启opcode缓存
</p>
<p>
  重模型，轻控制器（减少冗余、保证项目完整运行 -&gt; 单元测试）
</p>
<p>
  能用单引号不用双引号，推荐PHP代码统一小驼峰，MySQL推荐下划线命名法
</p>
<h3>2）数据库优化</h3>
<p>
  架构：读写分离、主从复制
</p>
<p>
  设计：三范式、存储引擎、字段类型
</p>
<p>
  功能：索引、缓存、分区
</p>
<h3>缓存优化</h3>
<p>
  减少对数据库的操作，将数据保存到文件中或者内存（memcache）中&gt;内存 &gt;  文件（TP的S方法和F方法）  &gt; 数据库
</p>
<h3>架构优化</h3>
<p>
  负载均衡、集群（动静分离）、读写分离、主从复制、sphinx站内搜索、内存缓存（memcache和redis） 、CDN加速
</p>
<h1><a id="post-5259-_Toc477016872"></a>二、了解Memcache</h1>
<h2><a id="post-5259-_Toc477016873"></a><a id="post-5259-_Toc451441600"></a>1、什么是Memcache</h2>
<p>
  Memcache是一个高性能分布式内存缓存服务器。一般的使用目的是，通过缓存数据库查询结果，减少数据库访问次数，以提高动态 Web 应用的速度、提高可扩展性。
</p>
<p>
  集群：多个服务器实现同一个业务
</p>
<p>
  分布式：多个服务器使用不同的的业务
</p>
<p>
  简单概括：就是一软数据库软件，将数据保存到内存中。
</p>
<p>
  将数据保存到内存中，如果电脑关机后数据丢失
</p>
<h2><a id="post-5259-_Toc441419437"></a>2、与mysql比较</h2>
<ul>
<li>
    都是C/S架构（client/server）
  </li>
<li>
    MySQL将数据保存在磁盘文件中，Memcache保存在内存中
  </li>
<li>
    MySQL保存数据必须先创建数据库、再创建表最后才可以插入数据，Memcache直
  </li>
</ul>
<p>
  接插入键值对形式数据，如：数组[键=&gt;值,键=&gt;值]，js对象{键:值,键:值}。
</p>
<p>
  键key   		值value
</p>
<p>
  字串(唯一)    字符串,整数,浮点数,布尔,数组,对象,NULL,二进制数据(图片,视频,音频)
</p>
<h1>三、安装与配置Memcached（C/S结构）</h1>
<h2><a id="post-5259-_Toc448485102"></a>1、服务器端软件安装（win）</h2>
<h3>查看memcached.exe相关参数（常用参数说明）</h3>
<ul>
<li>
    -l  localhost  				服务器ip地址
  </li>
<li>
    -p  port		 				端口
  </li>
<li>
    -d  install/uninstall/start    服务管理
  </li>
<li>
    -m  memory					内存大小，默认64M
  </li>
</ul>
<h3>1）安装memcache（绿色版：直接解压即可）	</h3>
<p><img decoding="async" width="1103" height="533" src="/wp-content/uploads/2018/05/word-image-4761.png" class="wp-image-5261" srcset="/wp-content/uploads/2018/05/word-image-4761.png 1103w, /wp-content/uploads/2018/05/word-image-4761-300x145.png 300w, /wp-content/uploads/2018/05/word-image-4761-768x371.png 768w, /wp-content/uploads/2018/05/word-image-4761-1024x495.png 1024w" sizes="(max-width: 1103px) 100vw, 1103px" /></p>
<p>
  脚下留心：不能有中文或者空格
</p>
<h3>3）安装memcached服务</h3>
<p>
  命令：memcached -d install
</p>
<p><img decoding="async" width="338" height="170" src="/wp-content/uploads/2018/05/word-image-4762.png" class="wp-image-5262" srcset="/wp-content/uploads/2018/05/word-image-4762.png 338w, /wp-content/uploads/2018/05/word-image-4762-300x151.png 300w" sizes="(max-width: 338px) 100vw, 338px" /></p>
<p>
  脚下留心：必须使用管理员身份运行
</p>
<h3>4）启用memcached服务</h3>
<p>
  命令：memcached -d start
</p>
<p>
  复杂：memcached -l 127.0.0.1 -p 11211 -d start -m 64
</p>
<p>
  说明：处-d外其他参数必须，不写则默认
</p>
<p><img loading="lazy" decoding="async" width="545" height="258" src="/wp-content/uploads/2018/05/word-image-4763.png" class="wp-image-5264" srcset="/wp-content/uploads/2018/05/word-image-4763.png 545w, /wp-content/uploads/2018/05/word-image-4763-300x142.png 300w" sizes="(max-width: 545px) 100vw, 545px" /></p>
<h3>5）检查是否安装成功</h3>
<p>
  说明：通过netstat -ano查看端口11211是否存在
</p>
<p><img loading="lazy" decoding="async" width="954" height="451" src="/wp-content/uploads/2018/05/word-image-4764.png" class="wp-image-5265" srcset="/wp-content/uploads/2018/05/word-image-4764.png 954w, /wp-content/uploads/2018/05/word-image-4764-300x142.png 300w, /wp-content/uploads/2018/05/word-image-4764-768x363.png 768w" sizes="(max-width: 954px) 100vw, 954px" /></p>
<h2>2、客户端软件的安装（Telnet服务连接）</h2>
<h3>1）通过电脑的telnet服务</h3>
<p>
  测试系统中是否安装了Telnet服务
</p>
<p><img loading="lazy" decoding="async" width="476" height="96" src="/wp-content/uploads/2018/05/word-image-4765.png" class="wp-image-5266" srcset="/wp-content/uploads/2018/05/word-image-4765.png 476w, /wp-content/uploads/2018/05/word-image-4765-300x61.png 300w" sizes="(max-width: 476px) 100vw, 476px" /></p>
<p>
  如果弹出以下界面，代表安装了Telnet服务，否则代表电脑中没有安装此服务
</p>
<p><img loading="lazy" decoding="async" width="567" height="125" src="/wp-content/uploads/2018/05/word-image-4766.png" class="wp-image-5267" srcset="/wp-content/uploads/2018/05/word-image-4766.png 567w, /wp-content/uploads/2018/05/word-image-4766-300x66.png 300w" sizes="(max-width: 567px) 100vw, 567px" /></p>
<p>
  【默认情况下,Win7/Win8/Win10都是没有安装Telnet的，安装步骤如下】
</p>
<p>
  第一步：打开控制面板，找到程序和功能
</p>
<p><img loading="lazy" decoding="async" width="796" height="228" src="/wp-content/uploads/2018/05/word-image-4767.png" class="wp-image-5268" srcset="/wp-content/uploads/2018/05/word-image-4767.png 796w, /wp-content/uploads/2018/05/word-image-4767-300x86.png 300w, /wp-content/uploads/2018/05/word-image-4767-768x220.png 768w" sizes="(max-width: 796px) 100vw, 796px" /></p>
<p>
  第二步：打开和关闭Windows功能
</p>
<p><img loading="lazy" decoding="async" width="741" height="213" src="/wp-content/uploads/2018/05/word-image-4768.png" class="wp-image-5269" srcset="/wp-content/uploads/2018/05/word-image-4768.png 741w, /wp-content/uploads/2018/05/word-image-4768-300x86.png 300w" sizes="(max-width: 741px) 100vw, 741px" /></p>
<p>
  第三步：找到Telnet服务进行安装
</p>
<p>
  z
</p>
<p><img loading="lazy" decoding="async" width="427" height="211" src="/wp-content/uploads/2018/05/word-image-4769.png" class="wp-image-5270" srcset="/wp-content/uploads/2018/05/word-image-4769.png 427w, /wp-content/uploads/2018/05/word-image-4769-300x148.png 300w" sizes="(max-width: 427px) 100vw, 427px" /></p>
<p>
  安装完成后，使用Telnet连接Memcached服务器
</p>
<p><img loading="lazy" decoding="async" width="510" height="88" src="/wp-content/uploads/2018/05/word-image-4770.png" class="wp-image-5271" srcset="/wp-content/uploads/2018/05/word-image-4770.png 510w, /wp-content/uploads/2018/05/word-image-4770-300x52.png 300w" sizes="(max-width: 510px) 100vw, 510px" /></p>
<p>
  回车，如下图所示，代表连接成功：
</p>
<p><img loading="lazy" decoding="async" width="539" height="136" src="/wp-content/uploads/2018/05/word-image-4771.png" class="wp-image-5272" srcset="/wp-content/uploads/2018/05/word-image-4771.png 539w, /wp-content/uploads/2018/05/word-image-4771-300x76.png 300w" sizes="(max-width: 539px) 100vw, 539px" /></p>
<h3>2）通过putty第三方工具telnet协议</h3>
<p><img loading="lazy" decoding="async" width="450" height="441" src="/wp-content/uploads/2018/05/word-image-4772.png" class="wp-image-5273" srcset="/wp-content/uploads/2018/05/word-image-4772.png 450w, /wp-content/uploads/2018/05/word-image-4772-300x294.png 300w" sizes="(max-width: 450px) 100vw, 450px" /><br />
<img loading="lazy" decoding="async" width="561" height="260" src="/wp-content/uploads/2018/05/word-image-4773.png" class="wp-image-5274" srcset="/wp-content/uploads/2018/05/word-image-4773.png 561w, /wp-content/uploads/2018/05/word-image-4773-300x139.png 300w" sizes="(max-width: 561px) 100vw, 561px" /></p>
<h1>操作Memcached</h1>
<p><a href="http://www.runoob.com/memcached/memcached-tutorial.html">http://www.runoob.com/memcached/memcached-tutorial.html</a>
</p>
<h2>增/改键（set）</h2>
<ul>
<li>
    基本语法：set 键 是否压缩 缓存时间/s 字符长度
  </li>
<li>
    说    明：
  </li>
<li>
    键    	 &#8211; 不能超过250个字符
  </li>
<li>
    是否压缩 &#8211;  1-是，0-否（默认）   注：以空间换时间，以时间换空间
  </li>
<li>
    缓存时间 &#8211;  0-理论永久，最大不超过30天（存满了，重启服务）
  </li>
<li>
    字符长度 &#8211;  先声明回车后输入内容
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="271" height="217" src="/wp-content/uploads/2018/05/word-image-4774.png" class="wp-image-5275" /></p>
<h2><a id="post-5259-_Toc448485109"></a>获取键值（get）</h2>
<ul>
<li>
    基本语法：get 键
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="230" height="222" src="/wp-content/uploads/2018/05/word-image-4775.png" class="wp-image-5276" /></p>
<h2><a id="post-5259-_Toc448485110"></a>添加键数据（add）  </h2>
<ul>
<li>
    基本语法：add 键 是否压缩 时间 长度
  </li>
<li>
    说    明：只能添加不能修改
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="375" height="196" src="/wp-content/uploads/2018/05/word-image-4776.png" class="wp-image-5277" srcset="/wp-content/uploads/2018/05/word-image-4776.png 375w, /wp-content/uploads/2018/05/word-image-4776-300x157.png 300w" sizes="(max-width: 375px) 100vw, 375px" /></p>
<h2>修改键数据（replace）</h2>
<ul>
<li>
    基本语法：replace 键 是否压缩 时间 长度
  </li>
<li>
    说    明：只能修改不能添加
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="366" height="257" src="/wp-content/uploads/2018/05/word-image-4777.png" class="wp-image-5278" srcset="/wp-content/uploads/2018/05/word-image-4777.png 366w, /wp-content/uploads/2018/05/word-image-4777-300x211.png 300w" sizes="(max-width: 366px) 100vw, 366px" /></p>
<h2>删除键（delete）</h2>
<ul>
<li>
    基本语法：delete 键
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="264" height="227" src="/wp-content/uploads/2018/05/word-image-4778.png" class="wp-image-5279" /></p>
<h2>删除所有键（flush_all）</h2>
<ul>
<li>
    基本语法：flush_all
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="252" height="532" src="/wp-content/uploads/2018/05/word-image-4779.png" class="wp-image-5280" srcset="/wp-content/uploads/2018/05/word-image-4779.png 252w, /wp-content/uploads/2018/05/word-image-4779-142x300.png 142w" sizes="(max-width: 252px) 100vw, 252px" /></p>
<h2>递增（incr）</h2>
<ul>
<li>
    基本语法：incr 键 数字
  </li>
<li>
    说    明：返回增加后的值，键必须存在（注：后期用过php操作必须提前存在）
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="190" height="142" src="/wp-content/uploads/2018/05/word-image-4780.png" class="wp-image-5281" /></p>
<h2>递减（decr）</h2>
<ul>
<li>
    基本语法：decr 键 数字
  </li>
<li>
    说    明：返回减少后的值
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="186" height="149" src="/wp-content/uploads/2018/05/word-image-4781.png" class="wp-image-5282" /></p>
<h2>查看当前Memcached运行状态（stats）</h2>
<p><img loading="lazy" decoding="async" width="447" height="592" src="/wp-content/uploads/2018/05/word-image-4782.png" class="wp-image-5283" srcset="/wp-content/uploads/2018/05/word-image-4782.png 447w, /wp-content/uploads/2018/05/word-image-4782-227x300.png 227w" sizes="(max-width: 447px) 100vw, 447px" /></p>
<p>
  pid：	memcache服务器进程ID
</p>
<p>
  uptime：服务器已运行秒数
</p>
<p>
  time：服务器当前Unix时间戳
</p>
<p>
  version：memcache版本
</p>
<p>
  pointer_size：操作系统指针大小
</p>
<p>
  rusage_user：进程累计用户时间
</p>
<p>
  rusage_system：进程累计系统时间
</p>
<p>
  curr_connections：当前连接数量
</p>
<p>
  total_connections：Memcached运行以来连接总数
</p>
<p>
  connection_structures：Memcached分配的连接结构数量
</p>
<p>
  cmd_get：get命令请求次数
</p>
<p>
  cmd_set：set命令请求次数
</p>
<p>
  cmd_flush：flush命令请求次数
</p>
<p>
  get_hits：get命令命中次数
</p>
<p>
  get_misses：get命令未命中次数
</p>
<p>
  delete_misses：delete命令未命中次数
</p>
<p>
  delete_hits：delete命令命中次数
</p>
<p>
  incr_misses：incr命令未命中次数
</p>
<p>
  incr_hits：incr命令命中次数
</p>
<p>
  decr_misses：decr命令未命中次数
</p>
<p>
  decr_hits：decr命令命中次数
</p>
<p>
  cas_misses：cas命令未命中次数
</p>
<p>
  cas_hits：cas命令命中次数
</p>
<p>
  cas_badval：使用擦拭次数
</p>
<p>
  auth_cmds：认证命令处理的次数
</p>
<p>
  auth_errors：认证失败数目
</p>
<p>
  bytes_read：读取总字节数
</p>
<p>
  bytes_written：发送总字节数
</p>
<p>
  limit_maxbytes：分配的内存总大小（字节）
</p>
<p>
  accepting_conns：服务器是否达到过最大连接（0/1）
</p>
<p>
  listen_disabled_num：失效的监听数
</p>
<p>
  threads：当前线程数
</p>
<p>
  conn_yields：连接操作主动放弃数目
</p>
<p>
  bytes：当前存储占用的字节数
</p>
<p>
  curr_items：当前存储的数据总数
</p>
<p>
  total_items：启动以来存储的数据总数
</p>
<p>
  evictions：LRU释放的对象数目
</p>
<p>
  reclaimed：已过期的数据条目来存储新数据的数目
</p>
<h1>五、PHP操作Memcached</h1>
<h2>1、开启php的php_memcache.dll扩展</h2>
<ul>
<li>
    步骤1：下载扩展，网址：<a href="http://pecl.php.net/package/memcache/3.0.8/windows">http://pecl.php.net/package/memcache/3.0.8/windows</a>
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="717" height="317" src="/wp-content/uploads/2018/05/word-image-4783.png" class="wp-image-5284" srcset="/wp-content/uploads/2018/05/word-image-4783.png 717w, /wp-content/uploads/2018/05/word-image-4783-300x133.png 300w" sizes="(max-width: 717px) 100vw, 717px" /></p>
<ul>
<li>
    步骤2：查看php相关信息选择对应的扩展库文件
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="829" height="628" src="/wp-content/uploads/2018/05/word-image-4784.png" class="wp-image-5285" srcset="/wp-content/uploads/2018/05/word-image-4784.png 829w, /wp-content/uploads/2018/05/word-image-4784-300x227.png 300w, /wp-content/uploads/2018/05/word-image-4784-768x582.png 768w" sizes="(max-width: 829px) 100vw, 829px" /></p>
<ul>
<li>
    步骤3：将扩展文件移动到对应PHP版本的ext目录下
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="985" height="474" src="/wp-content/uploads/2018/05/word-image-4785.png" class="wp-image-5286" srcset="/wp-content/uploads/2018/05/word-image-4785.png 985w, /wp-content/uploads/2018/05/word-image-4785-300x144.png 300w, /wp-content/uploads/2018/05/word-image-4785-768x370.png 768w" sizes="(max-width: 985px) 100vw, 985px" /></p>
<ul>
<li>
    步骤4：修改php的配置文件（php.ini）
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="909" height="60" src="/wp-content/uploads/2018/05/word-image-4786.png" class="wp-image-5287" srcset="/wp-content/uploads/2018/05/word-image-4786.png 909w, /wp-content/uploads/2018/05/word-image-4786-300x20.png 300w, /wp-content/uploads/2018/05/word-image-4786-768x51.png 768w" sizes="(max-width: 909px) 100vw, 909px" /><br />
<img loading="lazy" decoding="async" width="439" height="76" src="/wp-content/uploads/2018/05/word-image-4787.png" class="wp-image-5288" srcset="/wp-content/uploads/2018/05/word-image-4787.png 439w, /wp-content/uploads/2018/05/word-image-4787-300x52.png 300w" sizes="(max-width: 439px) 100vw, 439px" /></p>
<ul>
<li>
    步骤5：重启apache
  </li>
</ul>
<h2>2、操作</h2>
<h3>■ 语法</h3>
<p>
  创建对象：$mem = new Memcachd;
</p>
<p>
  连接服务：$mem-&gt;connect(服务器ip地址，端口);
</p>
<p>
  关闭连接：$mem-&gt;close();
</p>
<p>
  添加数据：$mem-&gt;set（键，值 [,是否压缩，缓存时间]）   注：默认理论永久
</p>
<p>
  读取数据：$mem-&gt;get（键）;
</p>
<p>
  增加：$mem-&gt;incr(键，$num=1);
</p>
<p>
  减少：$mem-&gt;decr(键，$num=1);
</p>
<h3>1）创建memcache对象</h3>
<p><img loading="lazy" decoding="async" width="984" height="384" src="/wp-content/uploads/2018/05/word-image-4788.png" class="wp-image-5289" srcset="/wp-content/uploads/2018/05/word-image-4788.png 984w, /wp-content/uploads/2018/05/word-image-4788-300x117.png 300w, /wp-content/uploads/2018/05/word-image-4788-768x300.png 768w" sizes="(max-width: 984px) 100vw, 984px" /></p>
<h3>2）添加和获取数据</h3>
<p><img loading="lazy" decoding="async" width="626" height="386" src="/wp-content/uploads/2018/05/word-image-4789.png" class="wp-image-5290" srcset="/wp-content/uploads/2018/05/word-image-4789.png 626w, /wp-content/uploads/2018/05/word-image-4789-300x185.png 300w" sizes="(max-width: 626px) 100vw, 626px" /></p>
<p>
  &lt;?php
</p>
<p>
  //1.创建memcachd对象
</p>
<p>
  $mem = new Memcache;
</p>
<p>
  //2.连接服务
</p>
<p>
  $mem-&gt;connect(&#8216;127.0.0.1&#8217;, 11211);
</p>
<p>
  //3.设置数据
</p>
<p>
  $mem-&gt;set(&#8216;laotie&#8217;, &#8216;mei mao baobing&#8217;);
</p>
<p>
  //4.获取
</p>
<p>
  echo $mem-&gt;get(&#8216;laotie&#8217;);
</p>
<p>
  die;
</p>
<p><a id="post-5259-_Toc448485122"></a>
</p>
<h1>六、探究Memcache能存储的数据类型		</h1>
<h2>回顾PHP中的八种数据类型</h2>
<p><strong>PHP</strong>
</p>
<p>
  基本类型：整型、浮点型、字符型、布尔型
</p>
<p>
  复合类型：数组、对象
</p>
<p>
  特殊类型：资源、null
</p>
<p><strong>JS</strong>
</p>
<p>
  基本类型：数字型（整型、浮点型）、字符型、布尔型
</p>
<p>
  复合类型：数组、对象
</p>
<p>
  特殊类型：undefined、null
</p>
<h2>2、使用PHP存储标量类型</h2>
<p>
  数据：整型（8）、浮点型（8.88）、字符串型（php0225）、布尔型（true）
</p>
<p>
  验证：
</p>
<p><img loading="lazy" decoding="async" width="877" height="628" src="/wp-content/uploads/2018/05/word-image-4790.png" class="wp-image-5291" srcset="/wp-content/uploads/2018/05/word-image-4790.png 877w, /wp-content/uploads/2018/05/word-image-4790-300x215.png 300w, /wp-content/uploads/2018/05/word-image-4790-768x550.png 768w" sizes="(max-width: 877px) 100vw, 877px" /></p>
<p>
  &lt;?php
</p>
<p>
  //1.创建memcache对象
</p>
<p>
  $mem = new memcache;
</p>
<p>
  //2.连接服务
</p>
<p>
  $mem-&gt;connect(&#8216;localhost&#8217;, 11211);
</p>
<p>
  //3.设置服务
</p>
<p>
  $rs = $mem-&gt;set(&#8216;int1&#8217;, 8);
</p>
<p>
  var_dump($rs);
</p>
<p>
  $rs = $mem-&gt;set(&#8216;int2&#8217;, 8.88);
</p>
<p>
  var_dump($rs);
</p>
<p>
  $rs = $mem-&gt;set(&#8216;int3&#8217;, &#8216;php12&#8217;);
</p>
<p>
  var_dump($rs);
</p>
<p>
  $rs = $mem-&gt;set(&#8216;int4&#8217;, true);
</p>
<p>
  var_dump($rs);
</p>
<p>
  echo &#8216;&lt;hr /&gt;&#8217;;
</p>
<p>
  $rs = $mem-&gt;get(&#8216;int1&#8217;);
</p>
<p>
  var_dump($rs);
</p>
<p>
  $rs = $mem-&gt;get(&#8216;int2&#8217;);
</p>
<p>
  var_dump($rs);
</p>
<p>
  $rs = $mem-&gt;get(&#8216;int3&#8217;);
</p>
<p>
  var_dump($rs);
</p>
<p>
  $rs = $mem-&gt;get(&#8216;int4&#8217;);
</p>
<p>
  var_dump($rs);
</p>
<p>
  die;
</p>
<h2>3、使用PHP存储复合类型</h2>
<ul>
<li>
    数组：array(&#8216;name&#8217;=&gt;zhangsan,&#8217;age&#8217;=&gt;18)
  </li>
<li>
    对象：class test { public $name = 123}    $obj = new test()
  </li>
<li>
    验证：
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="1097" height="567" src="/wp-content/uploads/2018/05/word-image-4791.png" class="wp-image-5292" srcset="/wp-content/uploads/2018/05/word-image-4791.png 1097w, /wp-content/uploads/2018/05/word-image-4791-300x155.png 300w, /wp-content/uploads/2018/05/word-image-4791-768x397.png 768w, /wp-content/uploads/2018/05/word-image-4791-1024x529.png 1024w" sizes="(max-width: 1097px) 100vw, 1097px" /></p>
<p>
  &lt;?php
</p>
<p>
  //1.创建memcache对象
</p>
<p>
  $mem = new memcache;
</p>
<p>
  //2.连接服务
</p>
<p>
  $mem-&gt;connect(&#8216;localhost&#8217;, 11211);
</p>
<p>
  //3.设置服务
</p>
<p>
  $data1 = array(&#8216;name&#8217;=&gt;&#8217;zhangsan&#8217;,&#8217;age&#8217;=&gt;18);
</p>
<p>
  class test { public $name = 123;}
</p>
<p>
  $data2 = new test();
</p>
<p>
  $rs = $mem-&gt;set(&#8216;arr1&#8217;, $data1);
</p>
<p>
  var_dump($rs);
</p>
<p>
  $rs = $mem-&gt;set(&#8216;obj2&#8217;, $data2);
</p>
<p>
  var_dump($rs);
</p>
<p>
  echo &#8216;&lt;hr /&gt;&#8217;;
</p>
<p>
  $rs = $mem-&gt;get(&#8216;arr1&#8217;);
</p>
<p>
  var_dump($rs);
</p>
<p>
  echo &#8216;&lt;br /&gt;&#8217;;
</p>
<p>
  $rs = $mem-&gt;get(&#8216;obj2&#8217;);
</p>
<p>
  var_dump($rs);
</p>
<p>
  die;
</p>
<h2>4、使用PHP存储特殊类型</h2>
<p><img loading="lazy" decoding="async" width="849" height="526" src="/wp-content/uploads/2018/05/word-image-4792.png" class="wp-image-5293" srcset="/wp-content/uploads/2018/05/word-image-4792.png 849w, /wp-content/uploads/2018/05/word-image-4792-300x186.png 300w, /wp-content/uploads/2018/05/word-image-4792-768x476.png 768w" sizes="(max-width: 849px) 100vw, 849px" /></p>
<p>
  &lt;?php
</p>
<p>
  //1.创建memcache对象
</p>
<p>
  $mem = new memcache;
</p>
<p>
  //2.连接服务
</p>
<p>
  $mem-&gt;connect(&#8216;localhost&#8217;, 11211);
</p>
<p>
  //3.设置服务
</p>
<p>
  $data = fopen(&#8216;xxxx&#8217;, &#8216;a+&#8217;);
</p>
<p>
  $rs = $mem-&gt;set(&#8216;source&#8217;, $data);
</p>
<p>
  var_dump($rs);
</p>
<p>
  $rs = $mem-&gt;set(&#8216;null1&#8217;, null);
</p>
<p>
  var_dump($rs);
</p>
<p>
  echo &#8216;&lt;hr /&gt;&#8217;;
</p>
<p>
  $rs = $mem-&gt;get(&#8216;source&#8217;);
</p>
<p>
  var_dump($rs);
</p>
<p>
  echo &#8216;&lt;br /&gt;&#8217;;
</p>
<p>
  $rs = $mem-&gt;get(&#8216;null1&#8217;);
</p>
<p>
  var_dump($rs);
</p>
<p>
  die;
</p>
<h1>七、Memcache的相关算法【★★★】</h1>
<h2>1、惰性过期机制（lazy expiration）</h2>
<ul>
<li>
    说明：memcached内部不会监视记录是否过期，而是在get时查看记录的时间戳，
  </li>
</ul>
<p>
  检查记录是否过期。这种技术被称为惰性过期。
</p>
<ul>
<li>
    好处：memcached不会在过期监视上耗费CPU时间 。
  </li>
<li>
    注意：memcached最大存储时间为30天
  </li>
<li>
    验证：
  </li>
</ul>
<p>
  #关闭服务
</p>
<p>
  memcached -d stop
</p>
<p>
  #启动服务
</p>
<p>
  memcached -d start
</p>
<p>
  #查看状态
</p>
<p>
  stats
</p>
<p>
  #设置一个键
</p>
<p>
  set php1 0 10 1
</p>
<p>
  #10s内，再查看状态
</p>
<p>
  stats
</p>
<p>
  #10s后，再查看状态
</p>
<p>
  #get后查看状态
</p>
<h2>2、最近最少使用算法（LRU：Least Recently Used）</h2>
<p>
  答：缓存空间已满，采用LRU策略，删除旧的缓存项（最近最少使用算法）
</p>
<p>
  LRU：Least Recently USE。
</p>
<h1><a id="post-5259-_Toc448485123"></a>八、Memcache常见问题</h1>
<h2><a id="post-5259-_Toc448485124"></a>1、单个key键名的最大长度是多少？</h2>
<p>
  答：最大不能超过250个字符
</p>
<h2><a id="post-5259-_Toc448485125"></a>2、每个item选项其最大可以存储多少M的数据</h2>
<p>
  答：每个item最大只能存储1M的数据
</p>
<h2><a id="post-5259-_Toc448485126"></a>3、最大存储时间（30天）</h2>
<p><img loading="lazy" decoding="async" width="966" height="641" src="/wp-content/uploads/2018/05/word-image-4793.png" class="wp-image-5294" srcset="/wp-content/uploads/2018/05/word-image-4793.png 966w, /wp-content/uploads/2018/05/word-image-4793-300x199.png 300w, /wp-content/uploads/2018/05/word-image-4793-768x510.png 768w" sizes="(max-width: 966px) 100vw, 966px" /></p>
<p>
  &lt;?php
</p>
<p>
  //1.创建memcache对象
</p>
<p>
  $mem = new Memcache;
</p>
<p>
  //2.连接服务
</p>
<p>
  $mem-&gt;connect(&#8216;127.0.0.1&#8217;, 11211);
</p>
<p>
  //3.设置数据
</p>
<p>
  $rs = $mem-&gt;set(&#8216;time1&#8217;, 111, 0, 3600 * 24 * 30 -1); //30天-1s
</p>
<p>
  var_dump($rs);
</p>
<p>
  $rs = $mem-&gt;set(&#8216;time2&#8217;, 222, 0, 3600 * 24 * 30);    //30天
</p>
<p>
  var_dump($rs);
</p>
<p>
  $rs = $mem-&gt;set(&#8216;time3&#8217;, 333, 0, 3600 * 24 * 30 +1); //30天+1s
</p>
<p>
  var_dump($rs);
</p>
<p>
  echo &#8216;&lt;hr /&gt;&#8217;;
</p>
<p>
  //4.获取数据
</p>
<p>
  $rs = $mem-&gt;get(&#8216;time1&#8217;);
</p>
<p>
  var_dump($rs);
</p>
<p>
  $rs = $mem-&gt;get(&#8216;time2&#8217;);
</p>
<p>
  var_dump($rs);
</p>
<p>
  $rs = $mem-&gt;get(&#8216;time3&#8217;);
</p>
<p>
  var_dump($rs);
</p>
<p>
  die;
</p>
<h2>memcached的cache机制是怎样的？ </h2>
<p>
  惰性过期机制：当过期之后不会删除，而是当get时候在删除
</p>
<p>
  最近最少使用：内存存满之后，删除最近最少使用
</p>
<h2>6、memcache里面适合存储哪些数据</h2>
<ul>
<li>
    明确使用场景：数据缓存
  </li>
<li>
    适合存储哪些数据：
  </li>
</ul>
<p>
  访问比较频繁的数据，安全性差的数据，丢失无所谓的数据。
</p>
<p>
  数据更新，比较频繁的数据，比如用户的在线状态。
</p>
<p>
  数据的单个键值不能太大，不要超过1Mb数据。
</p>
<p>
  文件缓存案例
</p>
<p>
  //获取缓存中的数据
</p>
<p>
  $data = file_get_contents（唯一标识）;
</p>
<p>
  if (!$data) {
</p>
<p>
  $data = 连接数据库获取的数据;
</p>
<p>
  file_put_contents(唯一标识，$data);
</p>
<p>
  }
</p>
<p>
  $this-&gt;assign(&#8216;data&#8217;, $data);
</p>
<h1><a id="post-5259-_Toc448485128"></a>九、分布式Memcache服务器</h1>
<h2><a id="post-5259-_Toc448485129"></a>1）分布式服务器原理</h2>
<p><img loading="lazy" decoding="async" width="1147" height="307" src="/wp-content/uploads/2018/05/word-image-4794.png" class="wp-image-5295" srcset="/wp-content/uploads/2018/05/word-image-4794.png 1147w, /wp-content/uploads/2018/05/word-image-4794-300x80.png 300w, /wp-content/uploads/2018/05/word-image-4794-768x206.png 768w, /wp-content/uploads/2018/05/word-image-4794-1024x274.png 1024w" sizes="(max-width: 1147px) 100vw, 1147px" /></p>
<h2><a id="post-5259-_Toc448485130"></a>2）使用PHP实现分布式Memcache</h2>
<p><img loading="lazy" decoding="async" width="751" height="650" src="/wp-content/uploads/2018/05/word-image-4795.png" class="wp-image-5296" srcset="/wp-content/uploads/2018/05/word-image-4795.png 751w, /wp-content/uploads/2018/05/word-image-4795-300x260.png 300w" sizes="(max-width: 751px) 100vw, 751px" /></p>
<p>
  &lt;?php
</p>
<p>
  //1.创建memcache对象
</p>
<p>
  $mem = new Memcache;
</p>
<p>
  //2.通过addServer方法添加到memcache连接池
</p>
<p>
  $mem-&gt;addServer(&#8216;127.0.0.1&#8217;, 11211);
</p>
<p>
  $mem-&gt;addServer(&#8216;192.168.72.53&#8217;, 11211);
</p>
<p>
  $mem-&gt;addServer(&#8216;192.168.72.38&#8217;, 11211);
</p>
<p>
  //3.向连接池中保存数据
</p>
<p>
  $mem-&gt;set(&#8216;userinfo&#8217;, [&#8216;name&#8217; =&gt; &#8216;瑶瑶&#8217;, &#8216;age&#8217; =&gt; 18]);
</p>
<p>
  $mem-&gt;set(&#8216;orderinfo&#8217;, [&#8216;id&#8217; =&gt; 18, &#8216;price&#8217; =&gt; 1]);
</p>
<p>
  $mem-&gt;set(&#8216;address&#8217;, 123);
</p>
<p>
  $data = $mem-&gt;get(&#8216;userinfo&#8217;);
</p>
<p>
  var_dump($data);
</p>
<p>
  echo &#8216;&lt;hr /&gt;&#8217;;
</p>
<p>
  $data = $mem-&gt;get(&#8216;orderinfo&#8217;);
</p>
<p>
  var_dump($data);
</p>
<p>
  echo &#8216;&lt;hr /&gt;&#8217;;
</p>
<p>
  $data = $mem-&gt;get(&#8216;address&#8217;);
</p>
<p>
  var_dump($data);
</p>
<p>
  echo &#8216;&lt;hr /&gt;&#8217;;
</p>
<p>
  die;
</p>
<p><img loading="lazy" decoding="async" width="1070" height="415" src="/wp-content/uploads/2018/05/word-image-4796.png" class="wp-image-5297" srcset="/wp-content/uploads/2018/05/word-image-4796.png 1070w, /wp-content/uploads/2018/05/word-image-4796-300x116.png 300w, /wp-content/uploads/2018/05/word-image-4796-768x298.png 768w, /wp-content/uploads/2018/05/word-image-4796-1024x397.png 1024w" sizes="(max-width: 1070px) 100vw, 1070px" /></p>
<h1><a id="post-5259-_Toc448485132"></a>十、Session入Memcache缓存</h1>
<h2>方法1：修改php配置文件，永久（php.ini）</h2>
<p><img loading="lazy" decoding="async" width="494" height="103" src="/wp-content/uploads/2018/05/word-image-4797.png" class="wp-image-5298" srcset="/wp-content/uploads/2018/05/word-image-4797.png 494w, /wp-content/uploads/2018/05/word-image-4797-300x63.png 300w" sizes="(max-width: 494px) 100vw, 494px" /><br />
<img loading="lazy" decoding="async" width="693" height="99" src="/wp-content/uploads/2018/05/word-image-4798.png" class="wp-image-5299" srcset="/wp-content/uploads/2018/05/word-image-4798.png 693w, /wp-content/uploads/2018/05/word-image-4798-300x43.png 300w" sizes="(max-width: 693px) 100vw, 693px" /></p>
<p>
  =================================================================
</p>
<p><img loading="lazy" decoding="async" width="1165" height="603" src="/wp-content/uploads/2018/05/word-image-4799.png" class="wp-image-5300" srcset="/wp-content/uploads/2018/05/word-image-4799.png 1165w, /wp-content/uploads/2018/05/word-image-4799-300x155.png 300w, /wp-content/uploads/2018/05/word-image-4799-768x398.png 768w, /wp-content/uploads/2018/05/word-image-4799-1024x530.png 1024w" sizes="(max-width: 1165px) 100vw, 1165px" /></p>
<p>
  &lt;?php
</p>
<p>
  session_start();
</p>
<p>
  $_SESSION[&#8216;yaoyiyao&#8217;] = &#8216;别闹&#8217;;
</p>
<p>
  $_SESSION[&#8216;huangyihuang&#8217;] = &#8216;哈哈&#8217;;
</p>
<p>
  $_SESSION[&#8216;douyidou&#8217;] = &#8216;嘿咻&#8217;;
</p>
<p>
  echo &#8216;&lt;hr /&gt;&#8217;;
</p>
<p>
  echo session_id();
</p>
<p>
  echo &#8216;&lt;br /&gt;&#8217;;
</p>
<p>
  print_r($_SESSION);
</p>
<p>
  die;
</p>
<h2>方法2，临时，在php中使用 ini_set函数</h2>
<p><img loading="lazy" decoding="async" width="1159" height="499" src="/wp-content/uploads/2018/05/word-image-4800.png" class="wp-image-5301" srcset="/wp-content/uploads/2018/05/word-image-4800.png 1159w, /wp-content/uploads/2018/05/word-image-4800-300x129.png 300w, /wp-content/uploads/2018/05/word-image-4800-768x331.png 768w, /wp-content/uploads/2018/05/word-image-4800-1024x441.png 1024w" sizes="(max-width: 1159px) 100vw, 1159px" /></p>
<p>
  &lt;?php
</p>
<p>
  //1.更改session存储方式
</p>
<p>
  ini_set(&#8216;session.save_handler&#8217;, &#8216;memcache&#8217;);
</p>
<p>
  //2.存储路径（说明：分布式则逗号隔开）
</p>
<p>
  ini_set(&#8216;session.save_path&#8217;, &#8216;tcp://127.0.0.1:11211,tcp://192.168.72.68:11211&#8217;);
</p>
<p>
  session_start();
</p>
<p>
  $_SESSION[&#8216;yaoyiyao&#8217;] = &#8216;别aaaaa闹&#8217;;
</p>
<p>
  $_SESSION[&#8216;huangyihuang&#8217;] = &#8216;哈aaaa哈&#8217;;
</p>
<p>
  $_SESSION[&#8216;douyidou&#8217;] = &#8216;嘿aa咻&#8217;;
</p>
<p>
  echo &#8216;&lt;hr /&gt;&#8217;;
</p>
<p>
  echo session_id();
</p>
<p>
  echo &#8216;&lt;br /&gt;&#8217;;
</p>
<p>
  print_r($_SESSION);
</p>
<p>
  die;
</p>
<h1>总结</h1>
<p>
  什么是memcache：基于内存数据库（注：重启后数据丢失）
</p>
<p>
  相关参数
</p>
<p>
  -l  服务ip地址（localhost）
</p>
<p>
  -p  端口（port）
</p>
<p>
  -d  服务管理（start/stop/install/uninstall）
</p>
<p>
  -m  内存大小（memory）
</p>
<p>
  memcache命令
</p>
<p>
  memcache的set：set 键 是否压缩  时间  长度（1-压缩，0-不压缩，时间：0-理论永久，最大不超过30天）
</p>
<p>
  memcache的get：get 键
</p>
<p>
  php操作memcache（http://pecl.php.net/package/memcache）
</p>
<p>
  创建对象：$mem = new Memcache;
</p>
<p>
  连接服务：$mem-&gt;connect(服务器ip地址，端口号)
</p>
<p>
  关闭服务：$mem-&gt;close()
</p>
<p>
  设置数据：$mem-&gt;set(键，值，[是否压缩，压缩时间])
</p>
<p>
  获取数据：$mem-&gt;get(键)
</p>
<p>
  递增：$mem-&gt;incr(键，值)
</p>
<p>
  递减：$mem-&gt;decr(键，值)
</p>
<p>
  算法，
</p>
<p>
  惰性过期机制：不过监控是否过期，而是get后检测
</p>
<p>
  最近最少使用算法：内存占满了就删除最近最少使用的
</p>
<p>
  分布式：多台服务器实现不同的业务
</p>
<p>
  分布式：$mem-&gt;addServer（服务器ip地址，端口）
</p>
<p>
  session入库
</p>
<p>
  ini_set(&#8216;session.save_handler);
</p>
<p>
  ini_set(&#8216;session.save_path&#8217;, &#8216;tcp://服务器ip地址:端口,tcp://服务器ip地址:端口&#8217;)</p>
]]></content:encoded>
					
					<wfw:commentRss>/%e6%95%b0%e6%8d%ae%e5%ba%93/5259.html/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Redis 安装部署、数据类型、应用场景、TP中使用Redis</title>
		<link>/%e6%95%b0%e6%8d%ae%e5%ba%93/5175.html</link>
					<comments>/%e6%95%b0%e6%8d%ae%e5%ba%93/5175.html#respond</comments>
		
		<dc:creator><![CDATA[Mr.Lee]]></dc:creator>
		<pubDate>Sat, 19 May 2018 14:29:11 +0000</pubDate>
				<category><![CDATA[Redis]]></category>
		<category><![CDATA[数据库]]></category>
		<category><![CDATA[TP中使用Redis]]></category>
		<category><![CDATA[安装部署]]></category>
		<category><![CDATA[应用场景]]></category>
		<category><![CDATA[数据类型]]></category>
		<guid isPermaLink="false">/?p=5175</guid>

					<description><![CDATA[NoSQL（Redis） 一、了解Redis 1、什么是Redis Redis是一个用C语言编写的开源软件 R [&#8230;]]]></description>
										<content:encoded><![CDATA[<h1>NoSQL（Redis）</h1>
<h1>一、了解Redis</h1>
<h2>1、什么是Redis</h2>
<ul>
<li>
    Redis是一个用C语言编写的开源软件
  </li>
<li>
    Redis是基于内存的存储的键值对（Key-Value）数据库（注：默认支持数据持久化）
  </li>
<li>
    Redis支持丰富的数据类型，如： String（字符串）、hash（哈希）list （列表）、
  </li>
</ul>
<p>
  set（集合）、sorted set（有序集合）。
</p>
<p>
  键值对形式存储
</p>
<p>
  js  -&gt;  {键:值}
</p>
<p>
  数组 -&gt; [键=&gt;指]
</p>
<p>
  数据持久化：数据不会丢失
</p>
<h2>2、Redis的优势</h2>
<ul>
<li>
    性能极高 – Redis能读的速度是11万次/s，写的速度是8.1万次/s 。
  </li>
<li>
    支持丰富的数据结构：String（字符串）、hash（哈希）、list （列表）、set（集合）、
  </li>
</ul>
<p>
  sorted set（有序集合）等。
</p>
<ul>
<li>
    支持数据持久化（服务器重启后数据不会丢失，自动从文件中加载到内存中）
  </li>
</ul>
<h2>Redis与Memcache的区别</h2>
<p>
  都是基于内存存储的
</p>
<p>
  redis支持的数据类型更多、memcache只支持字符串
</p>
<p>
  redis支持数据持久化
</p>
<h1>二、Redis的安装和部署</h1>
<h2>步骤一，下载安装包</h2>
<p>
  去官网下（http://redis.io/download）载并上传到服务器
</p>
<p><img loading="lazy" decoding="async" width="888" height="408" src="/wp-content/uploads/2018/05/word-image-4679.png" class="wp-image-5176" srcset="/wp-content/uploads/2018/05/word-image-4679.png 888w, /wp-content/uploads/2018/05/word-image-4679-300x138.png 300w, /wp-content/uploads/2018/05/word-image-4679-768x353.png 768w" sizes="(max-width: 888px) 100vw, 888px" /></p>
<h2>步骤二，编译源程序</h2>
<ul>
<li>
    tar -zxvf redis-2.6.14.tar.gz #解压
  </li>
<li>
    cd redis-2.6.14 			  #进入解压目录
  </li>
<li>
    make      		  		  #编译（将源代码文件编译成可执行文件）
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="653" height="290" src="/wp-content/uploads/2018/05/word-image-4680.png" class="wp-image-5177" srcset="/wp-content/uploads/2018/05/word-image-4680.png 653w, /wp-content/uploads/2018/05/word-image-4680-300x133.png 300w" sizes="(max-width: 653px) 100vw, 653px" /></p>
<h2>步骤三，将redis源码目录下的  src目录里的 redis-cli和 redis-server 拷贝到工作目录里.同时将源码根目录下的redis.conf 也拷贝到工作目录里</h2>
<ul>
<li>
    mkdir -p /php/server/redis   #创建redis文件夹
  </li>
<li>
    \cp -rf /php/tools/redis-2.6.14/src/redis-cli /php/server/redis   #拷贝redis客户端文件
  </li>
<li>
    \cp -rf /php/tools/redis-2.6.14/src/redis-server /php/server/redis #拷贝redis服务端文件
  </li>
<li>
    \cp -rf /php/tools/redis-2.6.14/redis.conf /php/server/redis     #拷贝redis配置文件
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="408" height="138" src="/wp-content/uploads/2018/05/word-image-4681.png" class="wp-image-5178" srcset="/wp-content/uploads/2018/05/word-image-4681.png 408w, /wp-content/uploads/2018/05/word-image-4681-300x101.png 300w" sizes="(max-width: 408px) 100vw, 408px" /></p>
<h2>步骤四，启动redis服务器</h2>
<ul>
<li>
    语法：./redis-server ./redis.conf
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="973" height="552" src="/wp-content/uploads/2018/05/word-image-4682.png" class="wp-image-5179" srcset="/wp-content/uploads/2018/05/word-image-4682.png 973w, /wp-content/uploads/2018/05/word-image-4682-300x170.png 300w, /wp-content/uploads/2018/05/word-image-4682-768x436.png 768w" sizes="(max-width: 973px) 100vw, 973px" /></p>
<p>
  脚下留心：默认是前台启动，启动后将无法继续执行其他指令
</p>
<p>
  解决：
</p>
<p><img loading="lazy" decoding="async" width="610" height="411" src="/wp-content/uploads/2018/05/word-image-4683.png" class="wp-image-5180" srcset="/wp-content/uploads/2018/05/word-image-4683.png 610w, /wp-content/uploads/2018/05/word-image-4683-300x202.png 300w" sizes="(max-width: 610px) 100vw, 610px" /><br />
<img loading="lazy" decoding="async" width="601" height="122" src="/wp-content/uploads/2018/05/word-image-4684.png" class="wp-image-5181" srcset="/wp-content/uploads/2018/05/word-image-4684.png 601w, /wp-content/uploads/2018/05/word-image-4684-300x61.png 300w" sizes="(max-width: 601px) 100vw, 601px" /></p>
<h2>步骤四，登陆验证</h2>
<ul>
<li>
    语法：./redis-cli
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="398" height="118" src="/wp-content/uploads/2018/05/word-image-4685.png" class="wp-image-5182" srcset="/wp-content/uploads/2018/05/word-image-4685.png 398w, /wp-content/uploads/2018/05/word-image-4685-300x89.png 300w" sizes="(max-width: 398px) 100vw, 398px" /></p>
<h1>三、操作Redis</h1>
<ul>
<li>
    使用redis客户端redis-cli操作（CRUD）
  </li>
<li>
    使用PHP程序来操作（CURD）
  </li>
</ul>
<h1>四、使用redis客户端redis-cli操作（CRUD）</h1>
<h2>1、连接redis服务通过redis客户端redis-cli</h2>
<ul>
<li>
    语法：./redis 参数
  </li>
<li>
    参数：
  </li>
<li>
    -h  服务器地址（host）
  </li>
<li>
    -p  端口（6379）
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="636" height="188" src="/wp-content/uploads/2018/05/word-image-4686.png" class="wp-image-5183" srcset="/wp-content/uploads/2018/05/word-image-4686.png 636w, /wp-content/uploads/2018/05/word-image-4686-300x89.png 300w" sizes="(max-width: 636px) 100vw, 636px" /></p>
<h2>2、Redis操作基础命令</h2>
<h3>1）添加、修改（CU）</h3>
<ul>
<li>
    语法：set 键 值
  </li>
<li>
    说明：存在-修改，不存在-则创建
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="624" height="261" src="/wp-content/uploads/2018/05/word-image-4687.png" class="wp-image-5184" srcset="/wp-content/uploads/2018/05/word-image-4687.png 624w, /wp-content/uploads/2018/05/word-image-4687-300x125.png 300w" sizes="(max-width: 624px) 100vw, 624px" /></p>
<h3>2）获取指定key的值（R）</h3>
<ul>
<li>
    语法：get 键
  </li>
<li>
    说明：不存在则返回nil（表示无值）
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="404" height="160" src="/wp-content/uploads/2018/05/word-image-4688.png" class="wp-image-5185" srcset="/wp-content/uploads/2018/05/word-image-4688.png 404w, /wp-content/uploads/2018/05/word-image-4688-300x119.png 300w" sizes="(max-width: 404px) 100vw, 404px" /></p>
<h3>3）删除指定key的值（D）</h3>
<ul>
<li>
    语法： del 键1&#8230;.键n
  </li>
<li>
    说明： 返回删除成功的个数（多个之间用空格隔开）
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="405" height="244" src="/wp-content/uploads/2018/05/word-image-4689.png" class="wp-image-5186" srcset="/wp-content/uploads/2018/05/word-image-4689.png 405w, /wp-content/uploads/2018/05/word-image-4689-300x181.png 300w" sizes="(max-width: 405px) 100vw, 405px" /></p>
<h1>redis常用的数据类型</h1>
<h2>■ 介绍</h2>
<p><img loading="lazy" decoding="async" width="524" height="214" src="/wp-content/uploads/2018/05/word-image-4690.png" class="wp-image-5187" srcset="/wp-content/uploads/2018/05/word-image-4690.png 524w, /wp-content/uploads/2018/05/word-image-4690-300x123.png 300w" sizes="(max-width: 524px) 100vw, 524px" /></p>
<p><a href="http://www.redis.net.cn/tutorial/3502.html">http://www.redis.net.cn/tutorial/3502.html</a>
</p>
<h2>1、字符串（String）类型及操作</h2>
<h3>1）概念</h3>
<p><img loading="lazy" decoding="async" width="466" height="86" src="/wp-content/uploads/2018/05/word-image-4691.png" class="wp-image-5188" srcset="/wp-content/uploads/2018/05/word-image-4691.png 466w, /wp-content/uploads/2018/05/word-image-4691-300x55.png 300w" sizes="(max-width: 466px) 100vw, 466px" /></p>
<h3>2）设置N个键（mset）</h3>
<p>
  语法：mset  键1  值1  &#8230;   键n  值n
</p>
<p>
  说明：m开头一般代表操作多个键
</p>
<p><img loading="lazy" decoding="async" width="609" height="390" src="/wp-content/uploads/2018/05/word-image-4692.png" class="wp-image-5189" srcset="/wp-content/uploads/2018/05/word-image-4692.png 609w, /wp-content/uploads/2018/05/word-image-4692-300x192.png 300w" sizes="(max-width: 609px) 100vw, 609px" /></p>
<h3>3）获取N个键（mget）</h3>
<p>
  语法：mget 键1 &#8230;. 键n
</p>
<p>
  说明：一次性返回多个值（不存在则返回nil）
</p>
<p><img loading="lazy" decoding="async" width="486" height="113" src="/wp-content/uploads/2018/05/word-image-4693.png" class="wp-image-5190" srcset="/wp-content/uploads/2018/05/word-image-4693.png 486w, /wp-content/uploads/2018/05/word-image-4693-300x70.png 300w" sizes="(max-width: 486px) 100vw, 486px" /></p>
<h3>4）递增递减（incr和decr）</h3>
<ul>
<li>
    语法：
  </li>
<li>
    incr 键
  </li>
<li>
    decr 键
  </li>
<li>
    说明：默认增加1（必须是整型）、返回增加后的数字
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="573" height="309" src="/wp-content/uploads/2018/05/word-image-4694.png" class="wp-image-5191" srcset="/wp-content/uploads/2018/05/word-image-4694.png 573w, /wp-content/uploads/2018/05/word-image-4694-300x162.png 300w" sizes="(max-width: 573px) 100vw, 573px" /></p>
<h3>5）增减指定值（incrby和decrby）</h3>
<ul>
<li>
    语法：
  </li>
<li>
    incrby 键 数字
  </li>
<li>
    decrby 键 数字
  </li>
<li>
    说明：给键设置指定值
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="417" height="235" src="/wp-content/uploads/2018/05/word-image-4695.png" class="wp-image-5192" srcset="/wp-content/uploads/2018/05/word-image-4695.png 417w, /wp-content/uploads/2018/05/word-image-4695-300x169.png 300w" sizes="(max-width: 417px) 100vw, 417px" /></p>
<h3>6）拼接-字符串追加（append）</h3>
<ul>
<li>
    语法：append  键  追加的内容
  </li>
<li>
    说明：返回追加之后的字符长度
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="482" height="265" src="/wp-content/uploads/2018/05/word-image-4696.png" class="wp-image-5193" srcset="/wp-content/uploads/2018/05/word-image-4696.png 482w, /wp-content/uploads/2018/05/word-image-4696-300x165.png 300w" sizes="(max-width: 482px) 100vw, 482px" /></p>
<h3>7）字符串截取（substr）</h3>
<ul>
<li>
    语法：substr 键 起始位置 结束位置
  </li>
<li>
    说明：下标从0开始（含前含后）
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="472" height="156" src="/wp-content/uploads/2018/05/word-image-4697.png" class="wp-image-5194" srcset="/wp-content/uploads/2018/05/word-image-4697.png 472w, /wp-content/uploads/2018/05/word-image-4697-300x99.png 300w" sizes="(max-width: 472px) 100vw, 472px" /></p>
<h3>︴场景案例</h3>
<p>
  网站计数统计
</p>
<p>
  文章详情页统计
</p>
<p><a href="http://web.umeng.com/main.php?c=user&amp;a=index">http://web.umeng.com/main.php?c=user&amp;a=index</a>
</p>
<p>
  incr 键
</p>
<h2>2、哈希（Hash）类型</h2>
<h3>︴思考：为什么学习该类型</h3>
<p>
  用来存储复杂的数据结果，如存储人信息（有姓名、年龄、电话等）存储商品（有价格、颜色等属性）。
</p>
<h3>1）概念</h3>
<p><img loading="lazy" decoding="async" width="517" height="157" src="/wp-content/uploads/2018/05/word-image-4698.png" class="wp-image-5195" srcset="/wp-content/uploads/2018/05/word-image-4698.png 517w, /wp-content/uploads/2018/05/word-image-4698-300x91.png 300w" sizes="(max-width: 517px) 100vw, 517px" /><br />
<img loading="lazy" decoding="async" width="594" height="178" src="/wp-content/uploads/2018/05/word-image-4699.png" class="wp-image-5196" srcset="/wp-content/uploads/2018/05/word-image-4699.png 594w, /wp-content/uploads/2018/05/word-image-4699-300x90.png 300w" sizes="(max-width: 594px) 100vw, 594px" /><br />
<img loading="lazy" decoding="async" width="403" height="182" src="/wp-content/uploads/2018/05/word-image-4700.png" class="wp-image-5197" srcset="/wp-content/uploads/2018/05/word-image-4700.png 403w, /wp-content/uploads/2018/05/word-image-4700-300x135.png 300w" sizes="(max-width: 403px) 100vw, 403px" /></p>
<h3>2）设置/获取hash字段（hset）</h3>
<p>
  语法：hset 键 字段 值
</p>
<p><img loading="lazy" decoding="async" width="660" height="170" src="/wp-content/uploads/2018/05/word-image-4701.png" class="wp-image-5199" srcset="/wp-content/uploads/2018/05/word-image-4701.png 660w, /wp-content/uploads/2018/05/word-image-4701-300x77.png 300w" sizes="(max-width: 660px) 100vw, 660px" /></p>
<h3>3）键获取一个字段值（hget）</h3>
<p>
  语法：hget 键 字段
</p>
<p><img loading="lazy" decoding="async" width="660" height="207" src="/wp-content/uploads/2018/05/word-image-4702.png" class="wp-image-5200" srcset="/wp-content/uploads/2018/05/word-image-4702.png 660w, /wp-content/uploads/2018/05/word-image-4702-300x94.png 300w" sizes="(max-width: 660px) 100vw, 660px" /></p>
<h3>4）键添加N个字段（hmset）</h3>
<p>
  语法：hmset 键 字段1 值1 &#8230; 字段n 值n
</p>
<p><img loading="lazy" decoding="async" width="705" height="100" src="/wp-content/uploads/2018/05/word-image-4703.png" class="wp-image-5201" srcset="/wp-content/uploads/2018/05/word-image-4703.png 705w, /wp-content/uploads/2018/05/word-image-4703-300x43.png 300w" sizes="(max-width: 705px) 100vw, 705px" /></p>
<h3>5）键获取N个字段（hmget）</h3>
<p>
  语法：hmget 键 字段1 字段n
</p>
<p><img loading="lazy" decoding="async" width="707" height="204" src="/wp-content/uploads/2018/05/word-image-4704.png" class="wp-image-5202" srcset="/wp-content/uploads/2018/05/word-image-4704.png 707w, /wp-content/uploads/2018/05/word-image-4704-300x87.png 300w" sizes="(max-width: 707px) 100vw, 707px" /></p>
<h3>6）字段增值（hincrby）</h3>
<p>
  语法：hincrby 键 字段 数字
</p>
<p><img loading="lazy" decoding="async" width="700" height="181" src="/wp-content/uploads/2018/05/word-image-4705.png" class="wp-image-5203" srcset="/wp-content/uploads/2018/05/word-image-4705.png 700w, /wp-content/uploads/2018/05/word-image-4705-300x78.png 300w" sizes="(max-width: 700px) 100vw, 700px" /></p>
<h3>7）检测键字段（hexists）</h3>
<p>
  语法：hexists 键 字段
</p>
<p>
  说明：1-存在，0-不存在
</p>
<p><img loading="lazy" decoding="async" width="667" height="164" src="/wp-content/uploads/2018/05/word-image-4706.png" class="wp-image-5204" srcset="/wp-content/uploads/2018/05/word-image-4706.png 667w, /wp-content/uploads/2018/05/word-image-4706-300x74.png 300w" sizes="(max-width: 667px) 100vw, 667px" /></p>
<h3>8）删除键字段（hdel）</h3>
<p>
  语法：hdel 键 字段
</p>
<p><img loading="lazy" decoding="async" width="588" height="164" src="/wp-content/uploads/2018/05/word-image-4707.png" class="wp-image-5205" srcset="/wp-content/uploads/2018/05/word-image-4707.png 588w, /wp-content/uploads/2018/05/word-image-4707-300x84.png 300w" sizes="(max-width: 588px) 100vw, 588px" /></p>
<h3>9）键个数（hlen）</h3>
<p>
  语法：hlen 键
</p>
<p><img loading="lazy" decoding="async" width="434" height="128" src="/wp-content/uploads/2018/05/word-image-4708.png" class="wp-image-5206" srcset="/wp-content/uploads/2018/05/word-image-4708.png 434w, /wp-content/uploads/2018/05/word-image-4708-300x88.png 300w" sizes="(max-width: 434px) 100vw, 434px" /></p>
<h3>10）哈希查询（hkeys 和 hvals 和 hgetall）</h3>
<ul>
<li>
    语法：
  </li>
<li>
    查询所有键   	hkeys*
  </li>
<li>
    查询所有值   	hvals
  </li>
<li>
    查询所有键和值 hgetall
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="504" height="343" src="/wp-content/uploads/2018/05/word-image-4709.png" class="wp-image-5207" srcset="/wp-content/uploads/2018/05/word-image-4709.png 504w, /wp-content/uploads/2018/05/word-image-4709-300x204.png 300w, /wp-content/uploads/2018/05/word-image-4709-220x150.png 220w" sizes="(max-width: 504px) 100vw, 504px" /></p>
<h2>列表（List）类型（注：后期可以当消息队列来使用 ★★★★★）</h2>
<h3>1）概念</h3>
<p><img loading="lazy" decoding="async" width="521" height="202" src="/wp-content/uploads/2018/05/word-image-4710.png" class="wp-image-5208" srcset="/wp-content/uploads/2018/05/word-image-4710.png 521w, /wp-content/uploads/2018/05/word-image-4710-300x116.png 300w" sizes="(max-width: 521px) 100vw, 521px" /><br />
<img loading="lazy" decoding="async" width="743" height="332" src="/wp-content/uploads/2018/05/word-image-4711.png" class="wp-image-5209" srcset="/wp-content/uploads/2018/05/word-image-4711.png 743w, /wp-content/uploads/2018/05/word-image-4711-300x134.png 300w" sizes="(max-width: 743px) 100vw, 743px" /></p>
<p>
  先进后出：lpush   lpop
</p>
<p>
  先进先出：lpush   rpop
</p>
<p><img loading="lazy" decoding="async" width="218" height="159" src="/wp-content/uploads/2018/05/word-image-4712.png" class="wp-image-5210" /></p>
<h3>2）左进（lpush）</h3>
<p>
  语法：lpush 键 值
</p>
<p>
  说明：返回数据长度（从左边压入）
</p>
<p><img loading="lazy" decoding="async" width="474" height="145" src="/wp-content/uploads/2018/05/word-image-4713.png" class="wp-image-5211" srcset="/wp-content/uploads/2018/05/word-image-4713.png 474w, /wp-content/uploads/2018/05/word-image-4713-300x92.png 300w" sizes="(max-width: 474px) 100vw, 474px" /></p>
<h3>3）查询（lrange）</h3>
<p>
  语法：lrange 键 起始位置 结束位置
</p>
<p>
  说明：下标从0开始含前含后（注：-1表示倒数第一个，-2倒数第二个）
</p>
<p><img loading="lazy" decoding="async" width="573" height="179" src="/wp-content/uploads/2018/05/word-image-4714.png" class="wp-image-5212" srcset="/wp-content/uploads/2018/05/word-image-4714.png 573w, /wp-content/uploads/2018/05/word-image-4714-300x94.png 300w" sizes="(max-width: 573px) 100vw, 573px" /></p>
<h3>4）右进（rpush）</h3>
<p>
  语法：rpush 键 值
</p>
<p>
  说明：返回数据长度（从右边压入）
</p>
<p><img loading="lazy" decoding="async" width="656" height="341" src="/wp-content/uploads/2018/05/word-image-4715.png" class="wp-image-5213" srcset="/wp-content/uploads/2018/05/word-image-4715.png 656w, /wp-content/uploads/2018/05/word-image-4715-300x156.png 300w" sizes="(max-width: 656px) 100vw, 656px" /></p>
<h3>5）头出（lpop）</h3>
<p>
  语法：lpop 键
</p>
<p>
  说明：从左边弹出，返回弹出的数据
</p>
<h3>6）尾出（rpop）</h3>
<p>
  语法：rpop 键
</p>
<p>
  说明：从右边弹出，返回弹出的数据
</p>
<p><img loading="lazy" decoding="async" width="627" height="324" src="/wp-content/uploads/2018/05/word-image-4716.png" class="wp-image-5214" srcset="/wp-content/uploads/2018/05/word-image-4716.png 627w, /wp-content/uploads/2018/05/word-image-4716-300x155.png 300w" sizes="(max-width: 627px) 100vw, 627px" /></p>
<h2>4、集合（Set）类型</h2>
<h3>︴案例：可能认识好友</h3>
<p>
  用户表
</p>
<p>
  张三  1
</p>
<p>
  李四  2
</p>
<p>
  王五  3
</p>
<p>
  &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-
</p>
<p>
  好友关系表
</p>
<p>
  自增主键    用户ID    粉丝
</p>
<p>
  1   	      1           2
</p>
<p>
  2           1           3
</p>
<p>
  3           2           1
</p>
<p>
  4           2           3
</p>
<p>
  查出关注张三的用户（张三的粉丝）    2  3
</p>
<p>
  查出关注李四的用户（李四的粉丝）    1  3
</p>
<p>
  通过PHP赛选公共用户
</p>
<p>
  步骤1：查询张三的粉丝
</p>
<p>
  select * from 好友表 where id = 1
</p>
<p>
  步骤2：查询李四的粉丝
</p>
<p>
  select * from 好友表 where id = 2
</p>
<p>
  步骤3：通过php赛选获取公共好友
</p>
<p><img loading="lazy" decoding="async" width="620" height="331" src="/wp-content/uploads/2018/05/word-image-4717.png" class="wp-image-5215" srcset="/wp-content/uploads/2018/05/word-image-4717.png 620w, /wp-content/uploads/2018/05/word-image-4717-300x160.png 300w" sizes="(max-width: 620px) 100vw, 620px" /></p>
<h3>︴语法图</h3>
<p><img loading="lazy" decoding="async" width="754" height="288" src="/wp-content/uploads/2018/05/word-image-4718.png" class="wp-image-5216" srcset="/wp-content/uploads/2018/05/word-image-4718.png 754w, /wp-content/uploads/2018/05/word-image-4718-300x115.png 300w" sizes="(max-width: 754px) 100vw, 754px" /></p>
<h3>1）添加（sadd）</h3>
<p>
  语法： sadd 集合名 数据
</p>
<p>
  说明： 给指定集合添加数据
</p>
<p><img loading="lazy" decoding="async" width="468" height="279" src="/wp-content/uploads/2018/05/word-image-4719.png" class="wp-image-5217" srcset="/wp-content/uploads/2018/05/word-image-4719.png 468w, /wp-content/uploads/2018/05/word-image-4719-300x179.png 300w" sizes="(max-width: 468px) 100vw, 468px" /></p>
<h3>2）查看 （smembers key）</h3>
<ul>
<li>
    语法：smembers key
  </li>
<li>
    作用：查看指定集合中的数据
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="468" height="279" src="/wp-content/uploads/2018/05/word-image-4720.png" class="wp-image-5218" srcset="/wp-content/uploads/2018/05/word-image-4720.png 468w, /wp-content/uploads/2018/05/word-image-4720-300x179.png 300w" sizes="(max-width: 468px) 100vw, 468px" /></p>
<h3>3）差集（sdiff）</h3>
<ul>
<li>
    语法：sdiff 集合名1 &#8230; 集合名n
  </li>
<li>
    作用：获取输入第一个集合不属于其他集合的数据
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="836" height="86" src="/wp-content/uploads/2018/05/word-image-4721.png" class="wp-image-5219" srcset="/wp-content/uploads/2018/05/word-image-4721.png 836w, /wp-content/uploads/2018/05/word-image-4721-300x31.png 300w, /wp-content/uploads/2018/05/word-image-4721-768x79.png 768w" sizes="(max-width: 836px) 100vw, 836px" /></p>
<p>
  ︴案例1
</p>
<p>
  set_1   1  2  3
</p>
<p>
  set_2   2  4  5
</p>
<p>
  指令：sdiff  set_1   set_2
</p>
<p>
  答案：1 3
</p>
<p><img loading="lazy" decoding="async" width="572" height="380" src="/wp-content/uploads/2018/05/word-image-4722.png" class="wp-image-5220" srcset="/wp-content/uploads/2018/05/word-image-4722.png 572w, /wp-content/uploads/2018/05/word-image-4722-300x199.png 300w" sizes="(max-width: 572px) 100vw, 572px" /></p>
<p>
  ︴案例2
</p>
<p>
  set_1   1  2  3
</p>
<p>
  set_2   1  4  5
</p>
<p>
  set_3   2  6  8
</p>
<p>
  指令：sdiff   set_1  set_2  set_3
</p>
<p>
  结果：3
</p>
<p><img loading="lazy" decoding="async" width="648" height="384" src="/wp-content/uploads/2018/05/word-image-4723.png" class="wp-image-5221" srcset="/wp-content/uploads/2018/05/word-image-4723.png 648w, /wp-content/uploads/2018/05/word-image-4723-300x178.png 300w" sizes="(max-width: 648px) 100vw, 648px" /></p>
<h3>4）并集（sunion）</h3>
<ul>
<li>
    语法：sunion 集合1 &#8230; 集合n
  </li>
<li>
    作用：合并去重
  </li>
<li>
    案例：
  </li>
</ul>
<p>
  张三：1,2,3
</p>
<p>
  李四：3,4,5
</p>
<p>
  合并：1,2,3,3,4,5
</p>
<p>
  去重：12345
</p>
<p><img loading="lazy" decoding="async" width="497" height="381" src="/wp-content/uploads/2018/05/word-image-4724.png" class="wp-image-5222" srcset="/wp-content/uploads/2018/05/word-image-4724.png 497w, /wp-content/uploads/2018/05/word-image-4724-300x230.png 300w" sizes="(max-width: 497px) 100vw, 497px" /></p>
<h3>5）交集（sinter）</h3>
<ul>
<li>
    语法：sinter 集合名1 &#8230; 集合名n
  </li>
<li>
    作用：相同数据
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="568" height="444" src="/wp-content/uploads/2018/05/word-image-4725.png" class="wp-image-5223" srcset="/wp-content/uploads/2018/05/word-image-4725.png 568w, /wp-content/uploads/2018/05/word-image-4725-300x235.png 300w" sizes="(max-width: 568px) 100vw, 568px" /></p>
<h3>应用场景</h3>
<p>
  新浪共同的好友，你可能认识的好友
</p>
<h1>键（Key）操作</h1>
<h2>键是否存在（exists）</h2>
<p>
  语法：exists 键名
</p>
<p>
  说明：1-存在，0-不存在
</p>
<p><img loading="lazy" decoding="async" width="481" height="157" src="/wp-content/uploads/2018/05/word-image-4726.png" class="wp-image-5224" srcset="/wp-content/uploads/2018/05/word-image-4726.png 481w, /wp-content/uploads/2018/05/word-image-4726-300x98.png 300w" sizes="(max-width: 481px) 100vw, 481px" /></p>
<h2>键类型（type）</h2>
<p>
  语法：type 键
</p>
<p><img loading="lazy" decoding="async" width="453" height="171" src="/wp-content/uploads/2018/05/word-image-4727.png" class="wp-image-5225" srcset="/wp-content/uploads/2018/05/word-image-4727.png 453w, /wp-content/uploads/2018/05/word-image-4727-300x113.png 300w" sizes="(max-width: 453px) 100vw, 453px" /></p>
<h2>键查询 （keys *）</h2>
<ul>
<li>
    语法：keys *
  </li>
<li>
    说明：
  </li>
<li>
    查询所有键 			 keys *
  </li>
<li>
    查询指定开头键		keys 内容*
  </li>
<li>
    查询指定结尾键    keys *内容
  </li>
<li>
    查询包含键			keys *内容*
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="522" height="540" src="/wp-content/uploads/2018/05/word-image-4728.png" class="wp-image-5226" srcset="/wp-content/uploads/2018/05/word-image-4728.png 522w, /wp-content/uploads/2018/05/word-image-4728-290x300.png 290w" sizes="(max-width: 522px) 100vw, 522px" /></p>
<h2>随机键（randomkey）</h2>
<p>
  语法：randomkey
</p>
<p><img loading="lazy" decoding="async" width="442" height="369" src="/wp-content/uploads/2018/05/word-image-4729.png" class="wp-image-5227" srcset="/wp-content/uploads/2018/05/word-image-4729.png 442w, /wp-content/uploads/2018/05/word-image-4729-300x250.png 300w" sizes="(max-width: 442px) 100vw, 442px" /></p>
<h2>键更名（rename oldkey newkey）</h2>
<p>
  语法：rename 旧键 新键
</p>
<p><img loading="lazy" decoding="async" width="535" height="446" src="/wp-content/uploads/2018/05/word-image-4730.png" class="wp-image-5228" srcset="/wp-content/uploads/2018/05/word-image-4730.png 535w, /wp-content/uploads/2018/05/word-image-4730-300x250.png 300w" sizes="(max-width: 535px) 100vw, 535px" /></p>
<h2>键统计（dbsize）</h2>
<p>
  语法：dbsize
</p>
<p><img loading="lazy" decoding="async" width="424" height="347" src="/wp-content/uploads/2018/05/word-image-4731.png" class="wp-image-5229" srcset="/wp-content/uploads/2018/05/word-image-4731.png 424w, /wp-content/uploads/2018/05/word-image-4731-300x246.png 300w" sizes="(max-width: 424px) 100vw, 424px" /></p>
<h2>键设置过期时间（expire key 秒数  和 ttl key）</h2>
<p>
  语法1：expire 键 秒数
</p>
<p>
  含义1：设置指定键等待多久后过期
</p>
<p>
  语法2：ttl 键
</p>
<p>
  含义2：查看状态（-1 表示过期或者键不存在）
</p>
<p><img loading="lazy" decoding="async" width="607" height="148" src="/wp-content/uploads/2018/05/word-image-4732.png" class="wp-image-5230" srcset="/wp-content/uploads/2018/05/word-image-4732.png 607w, /wp-content/uploads/2018/05/word-image-4732-300x73.png 300w" sizes="(max-width: 607px) 100vw, 607px" /><br />
<img loading="lazy" decoding="async" width="550" height="411" src="/wp-content/uploads/2018/05/word-image-4733.png" class="wp-image-5231" srcset="/wp-content/uploads/2018/05/word-image-4733.png 550w, /wp-content/uploads/2018/05/word-image-4733-300x224.png 300w" sizes="(max-width: 550px) 100vw, 550px" /></p>
<h2>选择数据库（select）</h2>
<ul>
<li>
    语法：select  下标
  </li>
<li>
    说明：默认16个数据库，下标从0开始也就是最大小标是15
  </li>
</ul>
<p>
  配置文件
</p>
<p><img loading="lazy" decoding="async" width="491" height="132" src="/wp-content/uploads/2018/05/word-image-4734.png" class="wp-image-5232" srcset="/wp-content/uploads/2018/05/word-image-4734.png 491w, /wp-content/uploads/2018/05/word-image-4734-300x81.png 300w" sizes="(max-width: 491px) 100vw, 491px" /><br />
<img loading="lazy" decoding="async" width="500" height="308" src="/wp-content/uploads/2018/05/word-image-4735.png" class="wp-image-5233" srcset="/wp-content/uploads/2018/05/word-image-4735.png 500w, /wp-content/uploads/2018/05/word-image-4735-300x185.png 300w" sizes="(max-width: 500px) 100vw, 500px" /></p>
<h2>键移库（move）</h2>
<p>
  语法：move 旧键 数据库下标
</p>
<p>
  说明：将指定键移动到指定数据库中
</p>
<p><img loading="lazy" decoding="async" width="621" height="480" src="/wp-content/uploads/2018/05/word-image-4736.png" class="wp-image-5234" srcset="/wp-content/uploads/2018/05/word-image-4736.png 621w, /wp-content/uploads/2018/05/word-image-4736-300x232.png 300w" sizes="(max-width: 621px) 100vw, 621px" /></p>
<h2>键删除-当前库（flushdb）</h2>
<h2>键删除-全部库（flushall）</h2>
<p><img loading="lazy" decoding="async" width="566" height="529" src="/wp-content/uploads/2018/05/word-image-4737.png" class="wp-image-5235" srcset="/wp-content/uploads/2018/05/word-image-4737.png 566w, /wp-content/uploads/2018/05/word-image-4737-300x280.png 300w" sizes="(max-width: 566px) 100vw, 566px" /></p>
<h1>总结</h1>
<p>
  【字符串（string）类型】
</p>
<p>
  设置1个键：set  键 值
</p>
<p>
  设置n个键：mset 键1 值1 .. 键n 值n
</p>
<p>
  获取1个键：get  键
</p>
<p>
  获取n个键：mget 键1 .. 键n
</p>
<p>
  递增递减： incr 键  或  decr 键
</p>
<p>
  增加减少： incrby 键 数字 或者 decrby 键 数字
</p>
<p>
  拼接：	  append  键  内容
</p>
<p>
  截取:     substr 键 起始位置  结束位置 （注：含前含后，从0开始下标）
</p>
<p>
  【哈希（hash）类型】
</p>
<p>
  设置1个值：hset  键 字段  值
</p>
<p>
  设置n个值：hmset 键 字段1 值1 &#8230;字段n 值n
</p>
<p>
  获取1个值：hget  键 字段
</p>
<p>
  获取n个值：hmget 键 字段1 &#8230; 字段n
</p>
<p>
  检测字段： hexists 键 字段
</p>
<p>
  删除字段： hdel  键 字段
</p>
<p>
  字段个数： hlen 键
</p>
<p>
  所有键：	   hkeys
</p>
<p>
  所有值：   hvals
</p>
<p>
  所有键值： hgetall
</p>
<p>
  【列表（list）类型】
</p>
<p>
  左进：lpush 键 值   （返回压入后数据长度）
</p>
<p>
  右进：rpush 键值
</p>
<p>
  左弹：lpop 键	    （返回弹出的值）
</p>
<p>
  右弹：rpop 键
</p>
<p>
  查询：lrange 键 起始位置 结束位置（下标从0开始，-1表示倒数第一个  -2 表示第二个）
</p>
<p>
  【集合（set）类型】
</p>
<p>
  添加数据： sadd 集合名 值
</p>
<p>
  查看集合： smembers 集合名
</p>
<p>
  差集： sdiff  集合名1 .. 集合名n   （我有你没有）
</p>
<p>
  并集： sunion 集合名1 .. 集合名n   （合并去重）
</p>
<p>
  交集： sinter 集合名1 .. 集合名n    （共有的）
</p>
<p>
  【键（Key）类型】
</p>
<p>
  键是否存在： exists 键
</p>
<p>
  键类型：type 键
</p>
<p>
  键查询：keys *
</p>
<p>
  键随机：randomkey
</p>
<p>
  键更名：rename 旧键 新键
</p>
<p>
  键统计：dbsize
</p>
<p>
  键设置过期：  expire 键 时间/s
</p>
<p>
  查看过期时间：ttl 键 （-1表示不存在或者已经过期）
</p>
<p>
  选择数据库 ： select 索引
</p>
<p>
  键移库： move 键 索引
</p>
<p>
  删除当前库：flushdb
</p>
<p>
  删除所有库：flushall
</p>
<h1>Redis的持久化方式</h1>
<h2>概念</h2>
<p>
  说明：Redis持久化就是指数据当重启电脑后数据不会丢失
</p>
<p>
  原因：Redis开发者将数据在磁盘文件中保存了一份，当重启电脑时将数据加载到内存中。
</p>
<h2>Snapshotting快照持久化（默认）</h2>
<ul>
<li>
    快照模式将内存中的数据以快照的方式写入二进制文件中（dump.rbd）
  </li>
<li>
    通过修改配置文件（redis.conf）可以更改快照备份规则
  </li>
</ul>
<p>
  快照模式相对而言不够安全
</p>
<p><img loading="lazy" decoding="async" width="372" height="50" src="/wp-content/uploads/2018/05/word-image-4738.png" class="wp-image-5236" srcset="/wp-content/uploads/2018/05/word-image-4738.png 372w, /wp-content/uploads/2018/05/word-image-4738-300x40.png 300w" sizes="(max-width: 372px) 100vw, 372px" /><br />
<img loading="lazy" decoding="async" width="895" height="510" src="/wp-content/uploads/2018/05/word-image-4739.png" class="wp-image-5237" srcset="/wp-content/uploads/2018/05/word-image-4739.png 895w, /wp-content/uploads/2018/05/word-image-4739-300x171.png 300w, /wp-content/uploads/2018/05/word-image-4739-768x438.png 768w" sizes="(max-width: 895px) 100vw, 895px" /></p>
<h2>3、AOF持久化（Append only file）</h2>
<h3>1）概念</h3>
<p>
  AOF方式是只保存我们的写、修改、删除动作到文件中（appendonly.aof）当系
</p>
<p>
  统重启的时候会讲该文件中的数据重新加载到内存中。
</p>
<h3>︴如何开启AOF方式？</h3>
<ul>
<li>
    关闭快照备份
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="360" height="56" src="/wp-content/uploads/2018/05/word-image-4740.png" class="wp-image-5238" srcset="/wp-content/uploads/2018/05/word-image-4740.png 360w, /wp-content/uploads/2018/05/word-image-4740-300x47.png 300w" sizes="(max-width: 360px) 100vw, 360px" /><br />
<img loading="lazy" decoding="async" width="289" height="99" src="/wp-content/uploads/2018/05/word-image-4741.png" class="wp-image-5239" /></p>
<ul>
<li>
    开启AOF备份
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="310" height="59" src="/wp-content/uploads/2018/05/word-image-4742.png" class="wp-image-5240" srcset="/wp-content/uploads/2018/05/word-image-4742.png 310w, /wp-content/uploads/2018/05/word-image-4742-300x57.png 300w" sizes="(max-width: 310px) 100vw, 310px" /><br />
<img loading="lazy" decoding="async" width="487" height="46" src="/wp-content/uploads/2018/05/word-image-4743.png" class="wp-image-5241" srcset="/wp-content/uploads/2018/05/word-image-4743.png 487w, /wp-content/uploads/2018/05/word-image-4743-300x28.png 300w" sizes="(max-width: 487px) 100vw, 487px" /><br />
<img loading="lazy" decoding="async" width="656" height="119" src="/wp-content/uploads/2018/05/word-image-4744.png" class="wp-image-5242" srcset="/wp-content/uploads/2018/05/word-image-4744.png 656w, /wp-content/uploads/2018/05/word-image-4744-300x54.png 300w" sizes="(max-width: 656px) 100vw, 656px" /><br />
<img loading="lazy" decoding="async" width="864" height="326" src="/wp-content/uploads/2018/05/word-image-4745.png" class="wp-image-5243" srcset="/wp-content/uploads/2018/05/word-image-4745.png 864w, /wp-content/uploads/2018/05/word-image-4745-300x113.png 300w, /wp-content/uploads/2018/05/word-image-4745-768x290.png 768w" sizes="(max-width: 864px) 100vw, 864px" /></p>
<h1>八、安全性</h1>
<ul>
<li>
    问题：不需要密码就可以登录
  </li>
<li>
    解决：修改配置设置密码
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="480" height="123" src="/wp-content/uploads/2018/05/word-image-4746.png" class="wp-image-5244" srcset="/wp-content/uploads/2018/05/word-image-4746.png 480w, /wp-content/uploads/2018/05/word-image-4746-300x77.png 300w" sizes="(max-width: 480px) 100vw, 480px" /></p>
<p>
  脚下留心：记得重启服务
</p>
<ul>
<li>
    登录1：./redis-cli  -a  密码
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="609" height="297" src="/wp-content/uploads/2018/05/word-image-4747.png" class="wp-image-5245" srcset="/wp-content/uploads/2018/05/word-image-4747.png 609w, /wp-content/uploads/2018/05/word-image-4747-300x146.png 300w" sizes="(max-width: 609px) 100vw, 609px" /></p>
<ul>
<li>
    登录2：登录后，语法： auth 密码
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="698" height="226" src="/wp-content/uploads/2018/05/word-image-4748.png" class="wp-image-5246" srcset="/wp-content/uploads/2018/05/word-image-4748.png 698w, /wp-content/uploads/2018/05/word-image-4748-300x97.png 300w" sizes="(max-width: 698px) 100vw, 698px" /></p>
<h1>九、主从复制（配置）</h1>
<h2>1、概念</h2>
<p>
  主从复制：当主服务器有写入/删除/修改数据动作，从服务器会自动同步
</p>
<p>
  读写分离：通过PHP控制器将增/改/删到主服务器，从服务器负责读取数据
</p>
<p><img loading="lazy" decoding="async" width="816" height="438" src="/wp-content/uploads/2018/05/word-image-4749.png" class="wp-image-5247" srcset="/wp-content/uploads/2018/05/word-image-4749.png 816w, /wp-content/uploads/2018/05/word-image-4749-300x161.png 300w, /wp-content/uploads/2018/05/word-image-4749-768x412.png 768w" sizes="(max-width: 816px) 100vw, 816px" /></p>
<h2>2、配置</h2>
<p><img loading="lazy" decoding="async" width="596" height="273" src="/wp-content/uploads/2018/05/word-image-4750.png" class="wp-image-5248" srcset="/wp-content/uploads/2018/05/word-image-4750.png 596w, /wp-content/uploads/2018/05/word-image-4750-300x137.png 300w" sizes="(max-width: 596px) 100vw, 596px" /></p>
<p>
  从服务器端口和主服务器端口不能一直
</p>
<p>
  主服务器必须关闭防火墙
</p>
<p><img loading="lazy" decoding="async" width="364" height="338" src="/wp-content/uploads/2018/05/word-image-4751.png" class="wp-image-5249" srcset="/wp-content/uploads/2018/05/word-image-4751.png 364w, /wp-content/uploads/2018/05/word-image-4751-300x279.png 300w" sizes="(max-width: 364px) 100vw, 364px" /></p>
<h1>十、PHP与Redis结合</h1>
<h2>1、安装php的redis扩展</h2>
<h3>1）安装autoconf-2.62.tar.gz（依赖）</h3>
<p>
  /php/tools/
</p>
<p>
  tar  -zxvf  autoconf-2.62.tar.gz
</p>
<p>
  cd autoconf-2.62
</p>
<p>
  ./configure &amp;&amp; make &amp;&amp; make install
</p>
<p><img loading="lazy" decoding="async" width="861" height="219" src="/wp-content/uploads/2018/05/word-image-4752.png" class="wp-image-5250" srcset="/wp-content/uploads/2018/05/word-image-4752.png 861w, /wp-content/uploads/2018/05/word-image-4752-300x76.png 300w, /wp-content/uploads/2018/05/word-image-4752-768x195.png 768w" sizes="(max-width: 861px) 100vw, 861px" /></p>
<h3>安装phpredis</h3>
<p>
  #步骤1：安装扩展
</p>
<p>
  /php/tools
</p>
<p>
  tar -zxvf phpredis.tar.gz
</p>
<p>
  cd phpredis
</p>
<p>
  ./configure &#8211;with-php-config=/php/server/php/bin/php-config  #路径不同需要自己修改
</p>
<p>
  make &amp;&amp; make install
</p>
<p>
  #步骤2：让PHP加载redis.so扩展
</p>
<p>
  vi /php/server/php/lib/php.ini
</p>
<p><img loading="lazy" decoding="async" width="548" height="116" src="/wp-content/uploads/2018/05/word-image-4753.png" class="wp-image-5251" srcset="/wp-content/uploads/2018/05/word-image-4753.png 548w, /wp-content/uploads/2018/05/word-image-4753-300x64.png 300w" sizes="(max-width: 548px) 100vw, 548px" /></p>
<p>
  #步骤3：最后重启Apache即可
</p>
<p>
  /php/server/apache/bin/apachectl stop
</p>
<p>
  /php/server/apache/bin/apachectl start
</p>
<p>
  #步骤4：同步phpinfo检测是否安装成功
</p>
<p><img loading="lazy" decoding="async" width="1006" height="408" src="/wp-content/uploads/2018/05/word-image-4754.png" class="wp-image-5252" srcset="/wp-content/uploads/2018/05/word-image-4754.png 1006w, /wp-content/uploads/2018/05/word-image-4754-300x122.png 300w, /wp-content/uploads/2018/05/word-image-4754-768x311.png 768w" sizes="(max-width: 1006px) 100vw, 1006px" /></p>
<h2>通过php操作redis</h2>
<p>
  phpredis中文手册——《redis中文手册》 php版
</p>
<p><a href="http://www.cnblogs.com/ikodota/archive/2012/03/05/php_redis_cn.html">http://www.cnblogs.com/ikodota/archive/2012/03/05/php_redis_cn.html</a>
</p>
<p>
  &lt;?php
</p>
<p>
  #phpinfo();
</p>
<p>
  //1.创建redis对象
</p>
<p>
  $redis = new Redis;
</p>
<p>
  //2.连接Reids
</p>
<p>
  $redis-&gt;connect(&#8216;127.0.0.1&#8217;, 6379);
</p>
<p>
  //3.身份认证
</p>
<p>
  $redis-&gt;auth(1234);
</p>
<p>
  //4.添加数据
</p>
<p>
  $redis-&gt;set(&#8216;yaoyiyao&#8217;, &#8216;girl&#8217;);
</p>
<p>
  //5.获取数据
</p>
<p>
  echo $redis-&gt;get(&#8216;yaoyiyao&#8217;);
</p>
<h1>十一、TP中使用Redis</h1>
<p><img loading="lazy" decoding="async" width="1033" height="474" src="/wp-content/uploads/2018/05/word-image-4755.png" class="wp-image-5253" srcset="/wp-content/uploads/2018/05/word-image-4755.png 1033w, /wp-content/uploads/2018/05/word-image-4755-300x138.png 300w, /wp-content/uploads/2018/05/word-image-4755-768x352.png 768w, /wp-content/uploads/2018/05/word-image-4755-1024x470.png 1024w" sizes="(max-width: 1033px) 100vw, 1033px" /><br />
<img loading="lazy" decoding="async" width="525" height="548" src="/wp-content/uploads/2018/05/word-image-4756.png" class="wp-image-5254" srcset="/wp-content/uploads/2018/05/word-image-4756.png 525w, /wp-content/uploads/2018/05/word-image-4756-287x300.png 287w" sizes="(max-width: 525px) 100vw, 525px" /></p>
<p>
  脚下留心:tp只支持简单的设置获取删除
</p>
<h1>秒杀功能的实现（★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★）</h1>
<h2>架构示意图</h2>
<p><img loading="lazy" decoding="async" width="1252" height="515" src="/wp-content/uploads/2018/05/word-image-4757.png" class="wp-image-5255" srcset="/wp-content/uploads/2018/05/word-image-4757.png 1252w, /wp-content/uploads/2018/05/word-image-4757-300x123.png 300w, /wp-content/uploads/2018/05/word-image-4757-768x316.png 768w, /wp-content/uploads/2018/05/word-image-4757-1024x421.png 1024w" sizes="(max-width: 1252px) 100vw, 1252px" /></p>
<h2>代码</h2>
<h3>︴MySQL（问题：负库存）</h3>
<p>
  create database shop charset=utf8;
</p>
<p>
  use shop
</p>
<p>
  create table goods (id int primary key auto_increment,num int ) engine=innodb;
</p>
<p>
  insert into goods values (null, 100);
</p>
<p>
  &lt;?php
</p>
<p>
  // 语法：ab -n 1000 -c 100 http://localhost/test/test.php
</p>
<p>
  // 说明：n &#8211; 请求总数 ,  c  &#8211; 并且
</p>
<p>
  $conn = @mysql_connect(&#8216;192.168.21.134&#8242;,&#8217;test&#8217;,&#8217;admin888&#8242;);
</p>
<p>
  mysql_query(&#8216;set names utf8&#8217;);
</p>
<p>
  mysql_query(&#8216;use shop&#8217;);
</p>
<p>
  $sql = &#8220;select num from goods where id = 1&#8221;;
</p>
<p>
  $res = mysql_query($sql);
</p>
<p>
  $tmp = mysql_fetch_assoc($res);
</p>
<p>
  $num = $tmp[&#8216;num&#8217;];
</p>
<p>
  if (<strong>$num</strong>) {
</p>
<p>
  //减库存
</p>
<p>
  $sql=&#8221;update goods set num=num-1 where id = 1&#8243;;
</p>
<p>
  mysql_query($sql);
</p>
<p>
  }
</p>
<p>
  echo &#8216;ok&#8217;;
</p>
<h3>实现步骤1：将商品放到队列中</h3>
<p>
  &lt;?php
</p>
<p>
  //1.创建redis对象
</p>
<p>
  $redis = new Redis();
</p>
<p>
  //2.连接服务器
</p>
<p>
  $redis-&gt;connect(&#8216;127.0.0.1&#8217;, &#8216;6379&#8217;);
</p>
<p>
  //3.登录（开启密码就写）
</p>
<p>
  $redis-&gt;auth(&#8216;1234&#8217;);
</p>
<p>
  //4.选择数据库
</p>
<p>
  $redis-&gt;select(0);
</p>
<p>
  //将商品ID=1的数据压入到redis队列中
</p>
<p>
  for($i=0; $i&lt;100; $i++){
</p>
<p>
      $redis-&gt;lpush(&#8216;goods1&#8217;, 1);
</p>
<p>
  }
</p>
<p>
  echo $redis-&gt;llen(&#8216;goods1&#8217;);
</p>
<h3>实现步骤3：Redis（队列处理）</h3>
<p>
  &lt;?php
</p>
<p>
  // 语法：ab -n 1000 -c 100 http://localhost/test/test.php
</p>
<p>
  // 说明：n &#8211; 请求总数 ,  c  &#8211; 并且
</p>
<p><strong>$redis=new Redis();</strong>
</p>
<p><strong>$redis-&gt;connect(&#8216;127.0.0.1&#8217;,6379);</strong>
</p>
<p><strong>$redis-&gt;auth(&#8216;123456&#8217;);</strong>
</p>
<p><strong>// 从头部弹出商品</strong>
</p>
<p><strong>$count=$redis-&gt;lpop(&#8216;goods1&#8217;);</strong>
</p>
<p>
  if($count){
</p>
<p>
      //连接数据库
</p>
<p>
      $conn = @mysql_connect(&#8216;127.0.0.1&#8242;,&#8217;root&#8217;,&#8217;admin888&#8242;);
</p>
<p>
      mysql_query(&#8216;set names utf8&#8217;);
</p>
<p>
      mysql_query(&#8216;use shop&#8217;);
</p>
<p>
      //减库存
</p>
<p>
      $sql=&#8221;update goods set num=num-1 where id = 1&#8243;;
</p>
<p>
      $data= mysql_query($sql);
</p>
<p>
      echo &#8216;ok&#8217;;
</p>
<p>
  }else{
</p>
<p>
      echo &#8216;error&#8217;;
</p>
<p>
  }
</p>
<h1>︴扩展：session入库（redis）</h1>
<h2>修改配置文件</h2>
<p><img loading="lazy" decoding="async" width="519" height="317" src="/wp-content/uploads/2018/05/word-image-4758.png" class="wp-image-5256" srcset="/wp-content/uploads/2018/05/word-image-4758.png 519w, /wp-content/uploads/2018/05/word-image-4758-300x183.png 300w" sizes="(max-width: 519px) 100vw, 519px" /><br />
<img loading="lazy" decoding="async" width="570" height="265" src="/wp-content/uploads/2018/05/word-image-4759.png" class="wp-image-5257" srcset="/wp-content/uploads/2018/05/word-image-4759.png 570w, /wp-content/uploads/2018/05/word-image-4759-300x139.png 300w" sizes="(max-width: 570px) 100vw, 570px" /></p>
<p>
  &lt;?php
</p>
<p>
  ini_set(&#8220;session.save_handler&#8221;, &#8220;redis&#8221;);
</p>
<p>
  ini_set(&#8220;session.save_path&#8221;, &#8220;tcp://127.0.0.1:6379?auth=1234&#8221;);
</p>
<p>
  session_start();
</p>
</p>
<p>
  $_SESSION[&#8216;test_huangyihuang&#8217;] = 123;
</p>
<p>
  print_r($_SESSION);
</p>
<p>
  die;
</p>
<h2>通过设置用户自定义会话存储函数（session_set_save_handler）</h2>
<p>
  语法：session_set_save_handler（开启session机制函数，关闭session机制函数，
</p>
<p>
  读取session数据函数，写入session函数，销毁session函数，后手过期session函数）
</p>
<p>
  自 PHP 5.4 开始，可以使用SessionHandlerInterface接口实现（注：接口里面都是抽象方法）
</p>
<p>
  抽象类：有抽象方法的类就是抽象类
</p>
<p>
  抽象方法：用关键词abstract并且没有函数体的方法
</p>
<p>
  接口：特殊的抽象类（注：因为里面的方法都是抽象方法）
</p>
<p>
  redis.php
</p>
<p>
  &lt;?php
</p>
<p>
  	class RedisSessionHandler implements \SessionHandlerInterface
</p>
<p>
  	{
</p>
<p>
  		private $redis;
</p>
</p>
<p>
  		public static function start()
</p>
<p>
  		{
</p>
<p>
  			session_set_save_handler(new self, true);
</p>
<p>
  			session_start();
</p>
<p>
  		}
</p>
<p>
  		public function open($savePath, $sessionName) {
</p>
<p>
  			$this-&gt;redis = new Redis;
</p>
<p>
  			$this-&gt;redis-&gt;connect(&#8216;127.0.0.1&#8217;, 6379);
</p>
<p>
  			$this-&gt;redis-&gt;auth(&#8216;123&#8217;);
</p>
<p>
  			$this-&gt;redis-&gt;select(0);
</p>
<p>
  			return true;
</p>
<p>
  		}
</p>
<p>
  		public function close() {
</p>
<p>
  			return true;
</p>
<p>
  		}
</p>
<p>
  		public function read($sessionId) {
</p>
<p>
  			return $this-&gt;redis-&gt;get( $sessionId ) ? : &#8221;;
</p>
<p>
  		}
</p>
<p>
  		public function write($sessionId, $data) {
</p>
<p>
  			return $this-&gt;redis-&gt;set($sessionId, $data);
</p>
<p>
  		}
</p>
<p>
  		public function destroy( $sessionId ) {
</p>
<p>
  			//$this-&gt;memcache-&gt;delete($sessionId)
</p>
<p>
  			return true;
</p>
<p>
  		}
</p>
<p>
  		public function gc( $lifetime ) {
</p>
<p>
  			return true;
</p>
<p>
  		}
</p>
<p>
  	}
</p>
</p>
<p>
      RedisSessionHandler::start();
</p>
<p>
  	$_SESSION[&#8216;aa&#8217;] = 123;
</p>
<p>
  	$_SESSION[&#8216;bb&#8217;] = 456;
</p>
<p>
  	echo session_id();
</p>
<p>
  ?&gt;
</p>
<p>
  memcache.php
</p>
<p>
  &lt;?php
</p>
<p>
  	class MemcacheSessionHandler implements \SessionHandlerInterface
</p>
<p>
  	{
</p>
<p>
  		private $memcache;
</p>
<p>
  		public static function start()
</p>
<p>
  		{
</p>
<p>
  			session_set_save_handler(new self, true);
</p>
<p>
  			session_start();
</p>
<p>
  		}
</p>
<p>
  		public function open($savePath, $sessionName) {
</p>
<p>
  			$this-&gt;memcache = new Memcache();
</p>
<p>
  			$this-&gt;memcache-&gt;addServer(&#8216;127.0.0.1&#8217;, 11211);
</p>
<p>
  			return true;
</p>
<p>
  		}
</p>
<p>
  		public function close() {
</p>
<p>
  			return true;
</p>
<p>
  		}
</p>
<p>
  		public function read($sessionId) {
</p>
<p>
  			return $this-&gt;memcache-&gt;get( $sessionId ) ? : &#8221;;
</p>
<p>
  		}
</p>
<p>
  		public function write($sessionId, $data) {
</p>
<p>
  			return $this-&gt;memcache-&gt;set($sessionId, $data, 0, 0);
</p>
<p>
  		}
</p>
<p>
  		public function destroy( $sessionId ) {
</p>
<p>
  			//$this-&gt;memcache-&gt;delete($sessionId)
</p>
<p>
  			return true;
</p>
<p>
  		}
</p>
<p>
  		public function gc( $lifetime ) {
</p>
<p>
  			return true;
</p>
<p>
  		}
</p>
<p>
  	}
</p>
</p>
<p>
      MemcacheSessionHandler::start();
</p>
<p>
  	$_SESSION[&#8216;aa&#8217;] = 123;
</p>
<p>
  	$_SESSION[&#8216;bb&#8217;] = 456;
</p>
<p>
  	echo session_id();
</p>
<p>
  ?&gt;</p>
]]></content:encoded>
					
					<wfw:commentRss>/%e6%95%b0%e6%8d%ae%e5%ba%93/5175.html/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>MongoDB 存储方式、命令、增删改查、索引</title>
		<link>/%e6%95%b0%e6%8d%ae%e5%ba%93/5082.html</link>
					<comments>/%e6%95%b0%e6%8d%ae%e5%ba%93/5082.html#respond</comments>
		
		<dc:creator><![CDATA[Mr.Lee]]></dc:creator>
		<pubDate>Sat, 19 May 2018 14:24:26 +0000</pubDate>
				<category><![CDATA[MongoDB]]></category>
		<category><![CDATA[数据库]]></category>
		<category><![CDATA[命令]]></category>
		<category><![CDATA[增删改查]]></category>
		<category><![CDATA[存储方式]]></category>
		<category><![CDATA[索引]]></category>
		<guid isPermaLink="false">/?p=5082</guid>

					<description><![CDATA[NoSQL（MongoDB） 一、了解MongoDB 1、什么是MongoDB？ 概念 MongoDB是NoS [&#8230;]]]></description>
										<content:encoded><![CDATA[<h1>NoSQL（MongoDB）</h1>
<h1><a id="post-5082-_Toc427248665"></a>一、了解MongoDB</h1>
<h2>1、什么是MongoDB？</h2>
<h3>概念 </h3>
<p>
  MongoDB是NoSQL类型的文档型数据库。
</p>
<h3>2）什么是NoSQL？</h3>
<p>
  NoSQL是非关系型数据存储的广义定义，通常以key-value形式存储数据，没
</p>
<p>
  有表结构（注：memcache和redis也市nosql产品）。
</p>
<h3>NoSQL优点</h3>
<p>
  易扩展
</p>
<p>
  快速的读写
</p>
<p>
  低廉的成本
</p>
<p>
  架构的灵活性，没有复杂的关系
</p>
<h3>4）NoSQL缺点</h3>
<p>
  没有标准化
</p>
<p>
  没有正式的官方支持
</p>
<h2>、MongoDB存储方式</h2>
<p>
  mongodb是文档型数据库，文件以BJSON格式存储在硬盘中。
</p>
<p>
  BSON是JSON的一种二进制形式的存储格式.
</p>
<p>
  mongodb内部执行引擎为JS解释器, 把文档存储成bson结构,在查询时,转换为JS对象,并可以通过熟悉的JS语法来操作.
</p>
<p><strong>简单总结：</strong>
</p>
<p><strong>mongodb是文档型数据库</strong>
</p>
<p><strong>mongodb、redis、memcache都属于nosql产品</strong>
</p>
<p><strong>什么是nosql：非关系型数据库的广泛定义、一般数据以键值对形式存储，没有表结构</strong>
</p>
<p>
  redis和memcache存在内存中
</p>
<p>
  mongodb存储在磁盘文件中
</p>
<h1>二、MongoDB的安装与配置</h1>
<h2>1、下载</h2>
<p><a href="http://www.mongodb.org/downloads">http://www.mongodb.org/downloads</a>
</p>
<p><img loading="lazy" decoding="async" width="250" height="185" src="/wp-content/uploads/2018/05/word-image-4592.png" class="wp-image-5085" /></p>
<p>
  在32位系统上，数据库文件总共不能超过2G，否无法再插入数据。推荐使用64位操作系统。
</p>
<p>
  安装成功后需要自己创建服务
</p>
<h2>2、安装</h2>
<p><img loading="lazy" decoding="async" width="484" height="386" src="/wp-content/uploads/2018/05/word-image-4593.png" class="wp-image-5086" srcset="/wp-content/uploads/2018/05/word-image-4593.png 484w, /wp-content/uploads/2018/05/word-image-4593-300x239.png 300w" sizes="(max-width: 484px) 100vw, 484px" /><br />
<img loading="lazy" decoding="async" width="482" height="381" src="/wp-content/uploads/2018/05/word-image-4594.png" class="wp-image-5087" srcset="/wp-content/uploads/2018/05/word-image-4594.png 482w, /wp-content/uploads/2018/05/word-image-4594-300x237.png 300w" sizes="(max-width: 482px) 100vw, 482px" /><br />
<img loading="lazy" decoding="async" width="476" height="384" src="/wp-content/uploads/2018/05/word-image-4595.png" class="wp-image-5088" srcset="/wp-content/uploads/2018/05/word-image-4595.png 476w, /wp-content/uploads/2018/05/word-image-4595-300x242.png 300w" sizes="(max-width: 476px) 100vw, 476px" /><br />
<img loading="lazy" decoding="async" width="482" height="380" src="/wp-content/uploads/2018/05/word-image-4596.png" class="wp-image-5089" srcset="/wp-content/uploads/2018/05/word-image-4596.png 482w, /wp-content/uploads/2018/05/word-image-4596-300x237.png 300w" sizes="(max-width: 482px) 100vw, 482px" /><br />
<img loading="lazy" decoding="async" width="487" height="381" src="/wp-content/uploads/2018/05/word-image-4597.png" class="wp-image-5090" srcset="/wp-content/uploads/2018/05/word-image-4597.png 487w, /wp-content/uploads/2018/05/word-image-4597-300x235.png 300w" sizes="(max-width: 487px) 100vw, 487px" /><br />
<img loading="lazy" decoding="async" width="490" height="384" src="/wp-content/uploads/2018/05/word-image-4598.png" class="wp-image-5091" srcset="/wp-content/uploads/2018/05/word-image-4598.png 490w, /wp-content/uploads/2018/05/word-image-4598-300x235.png 300w" sizes="(max-width: 490px) 100vw, 490px" /><br />
<img loading="lazy" decoding="async" width="481" height="379" src="/wp-content/uploads/2018/05/word-image-4599.png" class="wp-image-5092" srcset="/wp-content/uploads/2018/05/word-image-4599.png 481w, /wp-content/uploads/2018/05/word-image-4599-300x236.png 300w" sizes="(max-width: 481px) 100vw, 481px" /><br />
<img loading="lazy" decoding="async" width="479" height="217" src="/wp-content/uploads/2018/05/word-image-4600.png" class="wp-image-5093" srcset="/wp-content/uploads/2018/05/word-image-4600.png 479w, /wp-content/uploads/2018/05/word-image-4600-300x136.png 300w" sizes="(max-width: 479px) 100vw, 479px" /></p>
<h2>3、创建MongoDB 服务</h2>
<ul>
<li>
    前    提：在mongodb安装目录下创建data目录用于存放后期数据
  </li>
<li>
    创建服务：mongod &#8211;install &#8211;dbpath 数据目录 &#8211;logpath 日志文件
  </li>
<li>
    删除服务：mongod &#8211;remove
  </li>
<li>
    启动服务：net start MongoDB
  </li>
<li>
    关闭服务：net stop MongoDB
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="1012" height="670" src="/wp-content/uploads/2018/05/word-image-4601.png" class="wp-image-5094" srcset="/wp-content/uploads/2018/05/word-image-4601.png 1012w, /wp-content/uploads/2018/05/word-image-4601-300x199.png 300w, /wp-content/uploads/2018/05/word-image-4601-768x508.png 768w" sizes="(max-width: 1012px) 100vw, 1012px" /></p>
<h2>4、连接MongoDB服务器</h2>
<p>
  语法：mongo 服务ip地址:端口/数据库名
</p>
<p>
  简写：mongo
</p>
<p>
  默认端口27017
</p>
<p><img loading="lazy" decoding="async" width="281" height="117" src="/wp-content/uploads/2018/05/word-image-4602.png" class="wp-image-5095" /></p>
<p>
  或者
</p>
<p><img loading="lazy" decoding="async" width="404" height="120" src="/wp-content/uploads/2018/05/word-image-4603.png" class="wp-image-5096" srcset="/wp-content/uploads/2018/05/word-image-4603.png 404w, /wp-content/uploads/2018/05/word-image-4603-300x89.png 300w" sizes="(max-width: 404px) 100vw, 404px" /></p>
<h1>三、Mongodb基本概念</h1>
<ul>
<li>
    MySQL数据库中有：数据库（Database）、表（table）、记录（Record）
  </li>
<li>
    mongodb数据库中有：数据库（database）、集合（collection）、文档（document）
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="459" height="251" src="/wp-content/uploads/2018/05/word-image-4604.png" class="wp-image-5097" srcset="/wp-content/uploads/2018/05/word-image-4604.png 459w, /wp-content/uploads/2018/05/word-image-4604-300x164.png 300w" sizes="(max-width: 459px) 100vw, 459px" /></p>
<p>
  MongoDB集合对应关系型数据库里的表，但是集合中没有列、行和关系概念，这体现了模式自由的特点。
</p>
<h1>四、入门命令</h1>
<h2>1、库和集合操作</h2>
<h3># 查看已有数据库</h3>
<p>
  语法：show databases; 或者 show dbs;
</p>
<p>
  举例：
</p>
<p><img loading="lazy" decoding="async" width="272" height="169" src="/wp-content/uploads/2018/05/word-image-4605.png" class="wp-image-5098" /></p>
<h3># 选择数据库</h3>
<p>
  语法：use 数据库
</p>
<p>
  举例：
</p>
<p><img loading="lazy" decoding="async" width="463" height="335" src="/wp-content/uploads/2018/05/word-image-4606.png" class="wp-image-5099" srcset="/wp-content/uploads/2018/05/word-image-4606.png 463w, /wp-content/uploads/2018/05/word-image-4606-300x217.png 300w" sizes="(max-width: 463px) 100vw, 463px" /></p>
<h3># 查看已有的集合/表</h3>
<p>
  语法：show collections 或者 show table
</p>
<p>
  举例：
</p>
<p><img loading="lazy" decoding="async" width="256" height="114" src="/wp-content/uploads/2018/05/word-image-4607.png" class="wp-image-5100" /></p>
<h3># 创建集合（表）</h3>
<p>
  语法：db.createCollection（集合名）
</p>
<p>
  举例：
</p>
<p><img loading="lazy" decoding="async" width="430" height="195" src="/wp-content/uploads/2018/05/word-image-4608.png" class="wp-image-5101" srcset="/wp-content/uploads/2018/05/word-image-4608.png 430w, /wp-content/uploads/2018/05/word-image-4608-300x136.png 300w" sizes="(max-width: 430px) 100vw, 430px" /></p>
<p>
  ︴是否可以验证数据库是否自动创建
</p>
<p><img loading="lazy" decoding="async" width="449" height="334" src="/wp-content/uploads/2018/05/word-image-4609.png" class="wp-image-5102" srcset="/wp-content/uploads/2018/05/word-image-4609.png 449w, /wp-content/uploads/2018/05/word-image-4609-300x223.png 300w" sizes="(max-width: 449px) 100vw, 449px" /></p>
<h3># 删除集合表</h3>
<p>
  语法：db.集合名.drop()
</p>
<p>
  举例：
</p>
<p><img loading="lazy" decoding="async" width="307" height="236" src="/wp-content/uploads/2018/05/word-image-4610.png" class="wp-image-5103" srcset="/wp-content/uploads/2018/05/word-image-4610.png 307w, /wp-content/uploads/2018/05/word-image-4610-300x231.png 300w" sizes="(max-width: 307px) 100vw, 307px" /></p>
<p>
  删除库：db.dropDatabase();
</p>
<p><img loading="lazy" decoding="async" width="391" height="202" src="/wp-content/uploads/2018/05/word-image-4611.png" class="wp-image-5104" srcset="/wp-content/uploads/2018/05/word-image-4611.png 391w, /wp-content/uploads/2018/05/word-image-4611-300x155.png 300w" sizes="(max-width: 391px) 100vw, 391px" /></p>
<h2>2、增删修查（CURD）</h2>
<h3># C 增</h3>
<ul>
<li>
    语法：db.集合名.insert（json数据）
  </li>
<li>
    说明：集合存在-则直接插入数据，集合不存在-则插入数据时自动创建
  </li>
<li>
    举例：插入到test集合中，姓名叫zs年龄18岁
  </li>
</ul>
<p>
  db.test.insert({name:&#8217;zs&#8217;,age:18});
</p>
<p><img loading="lazy" decoding="async" width="769" height="502" src="/wp-content/uploads/2018/05/word-image-4612.png" class="wp-image-5105" srcset="/wp-content/uploads/2018/05/word-image-4612.png 769w, /wp-content/uploads/2018/05/word-image-4612-300x196.png 300w, /wp-content/uploads/2018/05/word-image-4612-768x501.png 768w" sizes="(max-width: 769px) 100vw, 769px" /></p>
<p>
  插入成功自动创建一个唯一的ID
</p>
<p><img loading="lazy" decoding="async" width="503" height="88" src="/wp-content/uploads/2018/05/word-image.jpeg" class="wp-image-5106" srcset="/wp-content/uploads/2018/05/word-image.jpeg 503w, /wp-content/uploads/2018/05/word-image-300x52.jpeg 300w" sizes="(max-width: 503px) 100vw, 503px" /></p>
<p><strong>︴思考1：是否可以自定义_id值？</strong>
</p>
<p>
  答：可以，插入的时候增加_id键即可替换
</p>
<p><img loading="lazy" decoding="async" width="750" height="508" src="/wp-content/uploads/2018/05/word-image-4613.png" class="wp-image-5107" srcset="/wp-content/uploads/2018/05/word-image-4613.png 750w, /wp-content/uploads/2018/05/word-image-4613-300x203.png 300w, /wp-content/uploads/2018/05/word-image-4613-220x150.png 220w" sizes="(max-width: 750px) 100vw, 750px" /></p>
<p><strong>︴思考2：如何插入多条记录？</strong>
</p>
<p>
  答：可以
</p>
<p>
  语法：db.集合名.insert([
</p>
<p>
  {},
</p>
<p>
  {},
</p>
<p>
  {}
</p>
<p>
  ]);
</p>
<p><img loading="lazy" decoding="async" width="757" height="573" src="/wp-content/uploads/2018/05/word-image-4614.png" class="wp-image-5108" srcset="/wp-content/uploads/2018/05/word-image-4614.png 757w, /wp-content/uploads/2018/05/word-image-4614-300x227.png 300w" sizes="(max-width: 757px) 100vw, 757px" /></p>
<p><strong>︴扩展练习：结合js循环插入多条记录？</strong>
</p>
<p>
  循环：for
</p>
<p>
  打印：print(变量名);
</p>
<p>
  案例：循环显示1-10
</p>
<p><img loading="lazy" decoding="async" width="531" height="288" src="/wp-content/uploads/2018/05/word-image-4615.png" class="wp-image-5110" srcset="/wp-content/uploads/2018/05/word-image-4615.png 531w, /wp-content/uploads/2018/05/word-image-4615-300x163.png 300w" sizes="(max-width: 531px) 100vw, 531px" /></p>
<p>
  需求：在test集合中循环插入8条数据：格式 name:heng自增  age:自增
</p>
<p>
  for (var i =1; i&lt;=8; i++) {
</p>
<p>
  db.test.insert({name:&#8221;heng&#8221;+i, age:i});
</p>
<p>
  }
</p>
<p><img loading="lazy" decoding="async" width="768" height="525" src="/wp-content/uploads/2018/05/word-image-4616.png" class="wp-image-5111" srcset="/wp-content/uploads/2018/05/word-image-4616.png 768w, /wp-content/uploads/2018/05/word-image-4616-300x205.png 300w, /wp-content/uploads/2018/05/word-image-4616-220x150.png 220w" sizes="(max-width: 768px) 100vw, 768px" /></p>
<h3># D 删</h3>
<ul>
<li>
    语法：db.集合名.remove（条件，是否删除一条）
  </li>
<li>
    说明：
  </li>
<li>
    条件，就是写json格式数据
  </li>
<li>
    是否删除一条：true-是，false-否（默认）
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="777" height="378" src="/wp-content/uploads/2018/05/word-image-4617.png" class="wp-image-5112" srcset="/wp-content/uploads/2018/05/word-image-4617.png 777w, /wp-content/uploads/2018/05/word-image-4617-300x146.png 300w, /wp-content/uploads/2018/05/word-image-4617-768x374.png 768w" sizes="(max-width: 777px) 100vw, 777px" /><br />
<img loading="lazy" decoding="async" width="730" height="376" src="/wp-content/uploads/2018/05/word-image-4618.png" class="wp-image-5113" srcset="/wp-content/uploads/2018/05/word-image-4618.png 730w, /wp-content/uploads/2018/05/word-image-4618-300x155.png 300w" sizes="(max-width: 730px) 100vw, 730px" /><br />
<img loading="lazy" decoding="async" width="359" height="105" src="/wp-content/uploads/2018/05/word-image-4619.png" class="wp-image-5114" srcset="/wp-content/uploads/2018/05/word-image-4619.png 359w, /wp-content/uploads/2018/05/word-image-4619-300x88.png 300w" sizes="(max-width: 359px) 100vw, 359px" /></p>
<h3># U 改</h3>
<p>
  # 创建测试数据
</p>
<p>
  use test1;
</p>
<p>
  db.createCollection(&#8220;c1&#8221;);
</p>
<p>
  for(var i = 1; i&lt;= 10; i++){
</p>
<p>
      db.c1.insert( {&#8220;name&#8221;:&#8221;zs&#8221;+i,&#8221;age&#8221;:i} );
</p>
<p>
  }
</p>
<ul>
<li>
    语法：db.集合名.update（条件，新数据，是否新增，是否只修改多条）
  </li>
<li>
    说明：
  </li>
<li>
    参数3：是否新增（true-找不到则插入，false-找不到就不管，默认）
  </li>
<li>
    参数4：是否修改多条（true-全部修改，false-只修改一条，默认）
  </li>
</ul>
<p><strong>︴练习1：将{name:</strong>&#8220;<strong>zs1</strong>&#8220;<strong>}改为{name:</strong>&#8220;<strong>zs2</strong>&#8220;<strong>}</strong>
</p>
<p>
  db.c1.update({name:&#8221;zs1&#8243;}, {name:&#8221;zs2&#8243;});
</p>
<p><img loading="lazy" decoding="async" width="725" height="505" src="/wp-content/uploads/2018/05/word-image-4620.png" class="wp-image-5115" srcset="/wp-content/uploads/2018/05/word-image-4620.png 725w, /wp-content/uploads/2018/05/word-image-4620-300x209.png 300w" sizes="(max-width: 725px) 100vw, 725px" /></p>
<p><strong>︴思考1：如何解决练习1的（替换）问题？</strong>
</p>
<p>
  发现：上述代码不是修改，而是替换新数据
</p>
<p>
  解决：通过（修改器）
</p>
<p>
  语法：db.集合名.update（条件，<strong>{修改器:</strong>{键:值}<strong>}</strong>）
</p>
<p>
  需求：将age=2的数据name改成zs22
</p>
<p>
  &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-
</p>
<p><strong>原本操作：db.c1.update({age:2}, {name:&#8221;zs22&#8243;});</strong>
</p>
<p><strong>瑕疵：替换数据</strong>
</p>
<p><strong>解决：使用修改器（$set）</strong>
</p>
<p><strong>套用语法：db.c1.update（{age:2}，{$set:{name:&#8221;zs22&#8243;}}）</strong>
</p>
<p><img loading="lazy" decoding="async" width="709" height="315" src="/wp-content/uploads/2018/05/word-image-4621.png" class="wp-image-5116" srcset="/wp-content/uploads/2018/05/word-image-4621.png 709w, /wp-content/uploads/2018/05/word-image-4621-300x133.png 300w" sizes="(max-width: 709px) 100vw, 709px" /></p>
<p><strong>︴练习2：给{name:</strong>&#8220;<strong>zs10</strong>&#8220;<strong>}的年龄加2岁</strong>
</p>
<p>
  db.c1.update({name:&#8221;zs10&#8243;},{$inc: {age:2}});
</p>
<p><img loading="lazy" decoding="async" width="733" height="482" src="/wp-content/uploads/2018/05/word-image-4622.png" class="wp-image-5117" srcset="/wp-content/uploads/2018/05/word-image-4622.png 733w, /wp-content/uploads/2018/05/word-image-4622-300x197.png 300w" sizes="(max-width: 733px) 100vw, 733px" /></p>
<p>
  多学一招：思考如何减年龄
</p>
<p>
  回答：负数
</p>
<p>
  db.c1.update({name:&#8221;zs10&#8243;},{$inc: {age:-2}});
</p>
<p><img loading="lazy" decoding="async" width="787" height="481" src="/wp-content/uploads/2018/05/word-image-4623.png" class="wp-image-5118" srcset="/wp-content/uploads/2018/05/word-image-4623.png 787w, /wp-content/uploads/2018/05/word-image-4623-300x183.png 300w, /wp-content/uploads/2018/05/word-image-4623-768x469.png 768w" sizes="(max-width: 787px) 100vw, 787px" /></p>
<p><strong>︴练习3（修改器综合练习）：</strong>
</p>
<ul>
<li>
    数据：
  </li>
</ul>
<p>
  db.test3.insert( {name:&#8221;猪八戒&#8221;,age:888,who:&#8221;男&#8221;,other:&#8221;非国人&#8221;});
</p>
<ul>
<li>
    需求：
  </li>
</ul>
<p>
  name  改成  孙悟空      ( 修改器：$set)
</p>
<p>
  age    增加  111	      ( 修改器：$inc)
</p>
<p>
  who   改字段   sex	   ( 修改器：$rename)
</p>
<p>
  other 删除			 	   (修改器：$unset)
</p>
<p>
  db.test3.update(条件，                );
</p>
<p>
                            {修改器:{键:值}}
</p>
<p>
                            {$set:{name:&#8221;猴子&#8221;}}
</p>
<p>
                            {$inc:{age:111}}
</p>
<p>
                            {$rename:{who:&#8221;sex&#8221;}}
</p>
<p>
                            {$unset:{other:&#8221;非国人&#8221;}}
</p>
<p>
  组合一起使用修改器
</p>
<p>
  db.test3.update({name:&#8221;猪八戒&#8221;}, {
</p>
<p>
  $set:{name:&#8221;猴子&#8221;},
</p>
<p>
  $inc:{age:111},
</p>
<p>
  $rename:{who:&#8221;sex&#8221;},
</p>
<p>
  $unset:{other:&#8221;非国人&#8221;}
</p>
<p>
  });
</p>
<p><img loading="lazy" decoding="async" width="1081" height="292" src="/wp-content/uploads/2018/05/word-image-4624.png" class="wp-image-5119" srcset="/wp-content/uploads/2018/05/word-image-4624.png 1081w, /wp-content/uploads/2018/05/word-image-4624-300x81.png 300w, /wp-content/uploads/2018/05/word-image-4624-768x207.png 768w, /wp-content/uploads/2018/05/word-image-4624-1024x277.png 1024w" sizes="(max-width: 1081px) 100vw, 1081px" /></p>
<p><strong>︴练习4：验证语法最后两个参数：</strong>是否新增[默认false], 是否修改多条[默认false]
</p>
<ul>
<li>
    验证是否新增：修改name 等于 zs30的年龄 30岁
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="835" height="597" src="/wp-content/uploads/2018/05/word-image-4625.png" class="wp-image-5120" srcset="/wp-content/uploads/2018/05/word-image-4625.png 835w, /wp-content/uploads/2018/05/word-image-4625-300x214.png 300w, /wp-content/uploads/2018/05/word-image-4625-768x549.png 768w" sizes="(max-width: 835px) 100vw, 835px" /></p>
<ul>
<li>
    验证是否修改多条：修改name 等于 zs2的年龄 22岁
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="775" height="335" src="/wp-content/uploads/2018/05/word-image-4626.png" class="wp-image-5121" srcset="/wp-content/uploads/2018/05/word-image-4626.png 775w, /wp-content/uploads/2018/05/word-image-4626-300x130.png 300w, /wp-content/uploads/2018/05/word-image-4626-768x332.png 768w" sizes="(max-width: 775px) 100vw, 775px" /></p>
<h3># R 查</h3>
<ul>
<li>
    语法：db.集合名.find（条件[，查询的列]）
  </li>
<li>
    查询条件说明：
  </li>
<li>
    {name:&#8221;zs&#8221;}   		   查询name等于zs的数据
  </li>
<li>
    {age:18}      			查询age等于18的数据
  </li>
<li>
    {name:&#8221;zs&#8221;, age:18}     查询name等于zs并且age等于18的数据
  </li>
<li>
    查询的列说明
  </li>
<li>
    {name:1}   		   查询的数据只显示name字段
  </li>
<li>
    {name:0}      		查询的数据显示所有字段，除name意外
  </li>
<li>
    {name:1, age:0}     只查询name字段
  </li>
</ul>
<p><strong>︴练习：查询所有数据</strong>
</p>
<p><img loading="lazy" decoding="async" width="749" height="199" src="/wp-content/uploads/2018/05/word-image-4627.png" class="wp-image-5122" srcset="/wp-content/uploads/2018/05/word-image-4627.png 749w, /wp-content/uploads/2018/05/word-image-4627-300x80.png 300w" sizes="(max-width: 749px) 100vw, 749px" /></p>
<p><strong>︴思考1：查询年龄大于5岁的数据？</strong>
</p>
<p><img loading="lazy" decoding="async" width="749" height="397" src="/wp-content/uploads/2018/05/word-image-4628.png" class="wp-image-5123" srcset="/wp-content/uploads/2018/05/word-image-4628.png 749w, /wp-content/uploads/2018/05/word-image-4628-300x159.png 300w" sizes="(max-width: 749px) 100vw, 749px" /></p>
<p>
  语法：db.test.find({键:{修改器:值}});
</p>
<p>
  案例：db.test.find({age:{$gt:5}});
</p>
<p><img loading="lazy" decoding="async" width="739" height="121" src="/wp-content/uploads/2018/05/word-image-4629.png" class="wp-image-5124" srcset="/wp-content/uploads/2018/05/word-image-4629.png 739w, /wp-content/uploads/2018/05/word-image-4629-300x49.png 300w" sizes="(max-width: 739px) 100vw, 739px" /></p>
<p><strong>︴思考2：查询年龄是5岁、8岁、10岁的数据？</strong>
</p>
<p>
  案例：db.test.find({age:{$in:[5,8,10]}});
</p>
<p><img loading="lazy" decoding="async" width="714" height="90" src="/wp-content/uploads/2018/05/word-image-4630.png" class="wp-image-5125" srcset="/wp-content/uploads/2018/05/word-image-4630.png 714w, /wp-content/uploads/2018/05/word-image-4630-300x38.png 300w" sizes="(max-width: 714px) 100vw, 714px" /></p>
<h1>总结</h1>
<p>
  什么是Mongodb：nosql类型的文档型数据库
</p>
<p>
  什么是nosql：非关系型数据库的广泛定义，一般以键值对象形式存储，不需要设计表结构的数据库可以称之为
</p>
<p>
  &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;
</p>
<p>
  【安装】
</p>
<p>
  安装服务：mongod &#8211;install &#8211;dbpath=数据目录 &#8211;logpath=日志文件
</p>
<p>
  卸载服务：mongod &#8211;remove
</p>
<p>
  启动服务：net start MongoDB
</p>
<p>
  停止服务：net stop  MongoDB
</p>
<p>
  &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;
</p>
<p>
  【入门命令】
</p>
<p>
  查看数据库： show databases; 或 show dbs;
</p>
<p>
  查看集合/表：show tables;  或  show collections;
</p>
<p>
  选择数据库： use 数据库名（注：不存在不会报错，后期插入数据会自动创建）
</p>
<p>
  创建集合：   db.createCollection（集合名）
</p>
<p>
  删除集合：   db.集合名.drop();
</p>
<p>
  删除数据库： db.dropDatabase();
</p>
<p>
  &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;
</p>
<p>
  【增】
</p>
<p>
  语法：db.集合名.insert（json数据）
</p>
<p>
  说明：集合存在-则直接插入数据，不存在-则创建
</p>
<p>
  &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;
</p>
<p>
  【删】
</p>
<p>
  语法：db.集合名.remove（条件，是否删除一条）
</p>
<p>
  说明：是否删除一条（true-是，false-否，默认）
</p>
<p>
  &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;
</p>
<p>
  【改】
</p>
<p>
  语法：db.集合名.update（条件，新数据，是否新增，是否删除多条）
</p>
<p>
  说明：
</p>
<p>
  参数3：是否新增（true-未匹配数据则新增，false匹配到数据则修改，默认）
</p>
<p>
  参数4：是否删除多条（true-删除多条，false-只删一条，默认）
</p>
<p>
  单修改器语法：db.集合名.update（条件，{修改器:{键:值}}）
</p>
<p>
  多修改器语法：db.集合名.update（条件，{
</p>
<p>
  修改器:{键:值},
</p>
<p>
  修改器:{键:值},
</p>
<p>
  修改器:{键:值}
</p>
<p>
  }）
</p>
<p>
  &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-
</p>
<p>
  【查】
</p>
<p>
  语法1：db.集合名.find(条件，查询的列)
</p>
<p>
  语法2：db.集合名.findOne();
</p>
<p><img loading="lazy" decoding="async" width="492" height="165" src="/wp-content/uploads/2018/05/word-image-4631.png" class="wp-image-5126" srcset="/wp-content/uploads/2018/05/word-image-4631.png 492w, /wp-content/uploads/2018/05/word-image-4631-300x101.png 300w" sizes="(max-width: 492px) 100vw, 492px" /></p>
<p>
  格式化打印：find().pretty()
</p>
<h1>五、MongoDB的权限机制</h1>
<h2><a id="post-5082-_Toc451356829"></a>1、权限机制概述</h2>
<p>
  在mongodb里面的用户是属于数据库的，每个数据库有自己的管理员，管理员登录后，只能操作所属的数据库。
</p>
<p><img loading="lazy" decoding="async" width="845" height="362" src="/wp-content/uploads/2018/05/word-image-4632.png" class="wp-image-5127" srcset="/wp-content/uploads/2018/05/word-image-4632.png 845w, /wp-content/uploads/2018/05/word-image-4632-300x129.png 300w, /wp-content/uploads/2018/05/word-image-4632-768x329.png 768w" sizes="(max-width: 845px) 100vw, 845px" /></p>
<p>
  3.x.x版本默认看不到admin数据库，但是可以选择并查看对应的表；
</p>
<p>
  2.x.x版本 通过show dbs 可以直接查看admin数据库
</p>
<h2>开启验证模式</h2>
<h3>1）概念</h3>
<p>
  开启验证模式：就是登陆需要输入账号密码
</p>
<p>
  先登陆创建超级管理员
</p>
<p>
  然后卸载服务
</p>
<p>
  再通过验证模式开启服务（说白了，增加参数让后期输入账号密码才可以登陆）
</p>
<h3>2）添加超级管理员</h3>
<ul>
<li>
    步骤1：登录
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="275" height="135" src="/wp-content/uploads/2018/05/word-image-4633.png" class="wp-image-5128" /></p>
<ul>
<li>
    步骤2：选择admin数据库
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="218" height="104" src="/wp-content/uploads/2018/05/word-image-4634.png" class="wp-image-5129" /></p>
<ul>
<li>
    步骤3：在admin数据库中添加用户（超级管理员）
  </li>
</ul>
<p>
  db.createUser({
</p>
<p>
  &#8220;user&#8221; : &#8220;admin&#8221;,
</p>
<p>
  &#8220;pwd&#8221;: &#8220;admin888&#8221;,
</p>
<p>
  &#8220;customData&#8221; : {employeeId:&#8221;提示密码admin888&#8243;},
</p>
<p>
  &#8220;roles&#8221; : [{
</p>
<p>
  role: &#8220;root&#8221;,
</p>
<p>
  db: &#8220;admin&#8221;
</p>
<p>
  }]
</p>
<p>
  })
</p>
<p><img loading="lazy" decoding="async" width="488" height="397" src="/wp-content/uploads/2018/05/word-image-4635.png" class="wp-image-5130" srcset="/wp-content/uploads/2018/05/word-image-4635.png 488w, /wp-content/uploads/2018/05/word-image-4635-300x244.png 300w" sizes="(max-width: 488px) 100vw, 488px" /></p>
<p>
  user 			代表登录的用户名
</p>
<p>
  pwd  				代表登录的密码
</p>
<p>
  customData	备注
</p>
<p>
  role				角色
</p>
<p>
  db					所属数据库
</p>
<p>
  角色信息介绍
</p>
<p><img loading="lazy" decoding="async" width="662" height="334" src="/wp-content/uploads/2018/05/word-image-4636.png" class="wp-image-5131" srcset="/wp-content/uploads/2018/05/word-image-4636.png 662w, /wp-content/uploads/2018/05/word-image-4636-300x151.png 300w" sizes="(max-width: 662px) 100vw, 662px" /></p>
<p>
  角色作用
</p>
<p><img loading="lazy" decoding="async" width="869" height="336" src="/wp-content/uploads/2018/05/word-image-4637.png" class="wp-image-5132" srcset="/wp-content/uploads/2018/05/word-image-4637.png 869w, /wp-content/uploads/2018/05/word-image-4637-300x116.png 300w, /wp-content/uploads/2018/05/word-image-4637-768x297.png 768w" sizes="(max-width: 869px) 100vw, 869px" /></p>
<h3>3）重新以验证模式启动mongod服务</h3>
<ul>
<li>
    步骤1：卸载服务
  </li>
</ul>
<p>
  net stop MongoDB
</p>
<p>
  mongod &#8211;remove
</p>
<ul>
<li>
    步骤2：开启验证模式服务（参数&#8211;auth）
  </li>
</ul>
<p>
  mongod &#8211;install &#8211;dbpath=E:\mongodb\data &#8211;logpath=E:\mongodb\log1.txt <strong>&#8211;auth</strong>
</p>
<p><img loading="lazy" decoding="async" width="884" height="82" src="/wp-content/uploads/2018/05/word-image-4638.png" class="wp-image-5133" srcset="/wp-content/uploads/2018/05/word-image-4638.png 884w, /wp-content/uploads/2018/05/word-image-4638-300x28.png 300w, /wp-content/uploads/2018/05/word-image-4638-768x71.png 768w" sizes="(max-width: 884px) 100vw, 884px" /></p>
<ul>
<li>
    步骤3：启动服务
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="770" height="407" src="/wp-content/uploads/2018/05/word-image-4639.png" class="wp-image-5134" srcset="/wp-content/uploads/2018/05/word-image-4639.png 770w, /wp-content/uploads/2018/05/word-image-4639-300x159.png 300w, /wp-content/uploads/2018/05/word-image-4639-768x406.png 768w" sizes="(max-width: 770px) 100vw, 770px" /></p>
<h2>通过超级管理员账号登陆</h2>
<ul>
<li>
    mongo 服务器IP地址:端口/数据库 -u 用户名 -p 密码
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="633" height="210" src="/wp-content/uploads/2018/05/word-image-4640.png" class="wp-image-5135" srcset="/wp-content/uploads/2018/05/word-image-4640.png 633w, /wp-content/uploads/2018/05/word-image-4640-300x100.png 300w" sizes="(max-width: 633px) 100vw, 633px" /></p>
<ul>
<li>
    登录之后输入，db.auth（用户名，密码）
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="621" height="539" src="/wp-content/uploads/2018/05/word-image-4641.png" class="wp-image-5136" srcset="/wp-content/uploads/2018/05/word-image-4641.png 621w, /wp-content/uploads/2018/05/word-image-4641-300x260.png 300w" sizes="(max-width: 621px) 100vw, 621px" /></p>
<h2>︴课堂案例：</h2>
<h3>■ 需求</h3>
<p>
  添加用户shop1可以读shop数据库
</p>
<p>
  添加用户shop2可以读写shop数据库
</p>
<p>
  脚下留心：必须在对应数据库创建用户
</p>
<h3>1）创建测试数据和测试用户（注：选择shop仓库创建用户）</h3>
<p>
  use shop;
</p>
<p>
  for(var i=1; i&lt;=10; i++) {
</p>
<p>
      db.goods.insert({&#8220;name&#8221;:&#8221;goodsName&#8221;+i,&#8221;price&#8221;:i});
</p>
<p>
  }
</p>
<h3>2）添加用户并设置权限</h3>
<p>
  【shop1】
</p>
<p>
  db.createUser({
</p>
<p>
  &#8220;user&#8221; : &#8220;shop1&#8221;,
</p>
<p>
  &#8220;pwd&#8221;: &#8220;admin888&#8221;,
</p>
<p>
  &#8220;customData&#8221; : {employeeId:&#8221;提示密码admin888&#8243;},
</p>
<p>
  &#8220;roles&#8221; : [{
</p>
<p>
  role: &#8220;read&#8221;,
</p>
<p>
  db: &#8220;shop&#8221;
</p>
<p>
  }]
</p>
<p>
  })
</p>
<p>
  【shop2】
</p>
<p>
  db.createUser({
</p>
<p>
  &#8220;user&#8221; : &#8220;shop2&#8221;,
</p>
<p>
  &#8220;pwd&#8221;: &#8220;admin888&#8221;,
</p>
<p>
  &#8220;customData&#8221; : {employeeId:&#8221;提示密码admin888&#8243;},
</p>
<p>
  &#8220;roles&#8221; : [{
</p>
<p>
  role: &#8220;readWrite&#8221;,
</p>
<p>
  db: &#8220;shop&#8221;
</p>
<p>
  }]
</p>
<p>
  })
</p>
<h3>验证：shop1可读</h3>
<p><img loading="lazy" decoding="async" width="597" height="420" src="/wp-content/uploads/2018/05/word-image-4642.png" class="wp-image-5137" srcset="/wp-content/uploads/2018/05/word-image-4642.png 597w, /wp-content/uploads/2018/05/word-image-4642-300x211.png 300w" sizes="(max-width: 597px) 100vw, 597px" /></p>
<h3>3）验证：shop2验证可读可写</h3>
<p><img loading="lazy" decoding="async" width="821" height="573" src="/wp-content/uploads/2018/05/word-image-4643.png" class="wp-image-5138" srcset="/wp-content/uploads/2018/05/word-image-4643.png 821w, /wp-content/uploads/2018/05/word-image-4643-300x209.png 300w, /wp-content/uploads/2018/05/word-image-4643-768x536.png 768w" sizes="(max-width: 821px) 100vw, 821px" /></p>
<h1>六、MongoDB的索引</h1>
<h2>1、情景设置</h2>
<p>
  向数据库中新增十万条数据
</p>
<p>
  //选择数据库
</p>
<p>
  use test;
</p>
<p>
  //向数据库中添加数据
</p>
<p>
  for(var i=0;i&lt;100000;i++){
</p>
<p>
  db.data1.insert({&#8216;name&#8217;:&#8221;aaa&#8221;+i,&#8221;age&#8221;:i});
</p>
<p>
  }
</p>
<p><img loading="lazy" decoding="async" width="661" height="168" src="/wp-content/uploads/2018/05/word-image-4644.png" class="wp-image-5139" srcset="/wp-content/uploads/2018/05/word-image-4644.png 661w, /wp-content/uploads/2018/05/word-image-4644-300x76.png 300w" sizes="(max-width: 661px) 100vw, 661px" /></p>
<h2>2、索引的建立</h2>
<h3>1）语法</h3>
<ul>
<li>
    创建索引语法：db.集合名.createIndex（待创建索引字段，额外选项）
  </li>
<li>
    参数：
  </li>
<li>
    待创建索引字段，语法：{键:1，键:-1}（说明：1表示升序，-1表示降序） ，如：
  </li>
</ul>
<p>
  {age:1}表示给age创建索引并且按照升序的方式存储
</p>
<ul>
<li>
    额外选项，可以设置索引名称，设置唯一索引等
  </li>
<li>
    删除索引语法：
  </li>
<li>
    db.集合名.dropIndexes（）  		删除全部索引
  </li>
<li>
    db.集合名.dropIndex（索引名）	删除指定索引
  </li>
<li>
    查看索引语法：db.集合名.getIndexes（）
  </li>
</ul>
<h3>创建普通索引</h3>
<p>
  需求：给name添加普通索引
</p>
<p>
  语法：
</p>
<p><img loading="lazy" decoding="async" width="557" height="495" src="/wp-content/uploads/2018/05/word-image-4645.png" class="wp-image-5140" srcset="/wp-content/uploads/2018/05/word-image-4645.png 557w, /wp-content/uploads/2018/05/word-image-4645-300x267.png 300w" sizes="(max-width: 557px) 100vw, 557px" /></p>
<p>
  删除索引
</p>
<p><img loading="lazy" decoding="async" width="430" height="327" src="/wp-content/uploads/2018/05/word-image-4646.png" class="wp-image-5141" srcset="/wp-content/uploads/2018/05/word-image-4646.png 430w, /wp-content/uploads/2018/05/word-image-4646-300x228.png 300w" sizes="(max-width: 430px) 100vw, 430px" /></p>
<p>
  给name创建索引并起名chenheng
</p>
<p><img loading="lazy" decoding="async" width="610" height="520" src="/wp-content/uploads/2018/05/word-image-4647.png" class="wp-image-5142" srcset="/wp-content/uploads/2018/05/word-image-4647.png 610w, /wp-content/uploads/2018/05/word-image-4647-300x256.png 300w" sizes="(max-width: 610px) 100vw, 610px" /></p>
<h3>创建复合/组合索引</h3>
<p>
  需求：给name和age添加组合索引
</p>
<p>
  说明：组合/符合索引就是给两个字段同时加索引（复习：mysql中index(字段1，字段2)）
</p>
<p>
  语法：db.集合名.createIndex({键:值,键:值});
</p>
<p><img loading="lazy" decoding="async" width="621" height="702" src="/wp-content/uploads/2018/05/word-image-4648.png" class="wp-image-5143" srcset="/wp-content/uploads/2018/05/word-image-4648.png 621w, /wp-content/uploads/2018/05/word-image-4648-265x300.png 265w" sizes="(max-width: 621px) 100vw, 621px" /></p>
<h3>创建唯一索引</h3>
<p>
  需求：给name添加普通索引
</p>
<p>
  语法：db.集合名.createIndex(待添加索引的字段，{unique:true})
</p>
<p>
  【设置索引特性】
</p>
<p>
  【测试唯一索引特性】
</p>
<p><img loading="lazy" decoding="async" width="936" height="431" src="/wp-content/uploads/2018/05/word-image-4649.png" class="wp-image-5144" srcset="/wp-content/uploads/2018/05/word-image-4649.png 936w, /wp-content/uploads/2018/05/word-image-4649-300x138.png 300w, /wp-content/uploads/2018/05/word-image-4649-768x354.png 768w" sizes="(max-width: 936px) 100vw, 936px" /></p>
<h2>3、分析索引（explain） executionStats</h2>
<ul>
<li>
    语法：db.集合名.find().explain(&#8216;executionStats&#8217;)
  </li>
<li>
    说明：
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="675" height="672" src="/wp-content/uploads/2018/05/word-image-4650.png" class="wp-image-5145" srcset="/wp-content/uploads/2018/05/word-image-4650.png 675w, /wp-content/uploads/2018/05/word-image-4650-150x150.png 150w, /wp-content/uploads/2018/05/word-image-4650-300x300.png 300w" sizes="(max-width: 675px) 100vw, 675px" /></p>
<p>
  COLLSCAN 全表扫描
</p>
<p>
  IXSCAN  索引扫描
</p>
<p>
  FETCH   根据索引去检索指定document
</p>
<ul>
<li>
    练习：
  </li>
</ul>
<p>
  age未添加索引情况
</p>
<p><img loading="lazy" decoding="async" width="498" height="62" src="/wp-content/uploads/2018/05/word-image-4651.png" class="wp-image-5146" srcset="/wp-content/uploads/2018/05/word-image-4651.png 498w, /wp-content/uploads/2018/05/word-image-4651-300x37.png 300w" sizes="(max-width: 498px) 100vw, 498px" /><br />
<img loading="lazy" decoding="async" width="639" height="370" src="/wp-content/uploads/2018/05/word-image-4652.png" class="wp-image-5147" srcset="/wp-content/uploads/2018/05/word-image-4652.png 639w, /wp-content/uploads/2018/05/word-image-4652-300x174.png 300w" sizes="(max-width: 639px) 100vw, 639px" /></p>
<p>
  age添加索引情况
</p>
<p><img loading="lazy" decoding="async" width="511" height="508" src="/wp-content/uploads/2018/05/word-image-4653.png" class="wp-image-5148" srcset="/wp-content/uploads/2018/05/word-image-4653.png 511w, /wp-content/uploads/2018/05/word-image-4653-150x150.png 150w, /wp-content/uploads/2018/05/word-image-4653-300x298.png 300w" sizes="(max-width: 511px) 100vw, 511px" /><br />
<img loading="lazy" decoding="async" width="473" height="65" src="/wp-content/uploads/2018/05/word-image-4654.png" class="wp-image-5149" srcset="/wp-content/uploads/2018/05/word-image-4654.png 473w, /wp-content/uploads/2018/05/word-image-4654-300x41.png 300w" sizes="(max-width: 473px) 100vw, 473px" /><br />
<img loading="lazy" decoding="async" width="391" height="234" src="/wp-content/uploads/2018/05/word-image-4655.png" class="wp-image-5150" srcset="/wp-content/uploads/2018/05/word-image-4655.png 391w, /wp-content/uploads/2018/05/word-image-4655-300x180.png 300w" sizes="(max-width: 391px) 100vw, 391px" /><br />
<img loading="lazy" decoding="async" width="1021" height="547" src="/wp-content/uploads/2018/05/word-image-4656.png" class="wp-image-5151" srcset="/wp-content/uploads/2018/05/word-image-4656.png 1021w, /wp-content/uploads/2018/05/word-image-4656-300x161.png 300w, /wp-content/uploads/2018/05/word-image-4656-768x411.png 768w" sizes="(max-width: 1021px) 100vw, 1021px" /></p>
<h1>七、数据库的备份和还原</h1>
<h2>1、备份数据库（mongodump）</h2>
<h3>1）语法</h3>
<ul>
<li>
    导出数据语法：mongodump -h __ -port __ -u __ -p __ -d __ -o __
  </li>
<li>
    说明
  </li>
<li>
    -h  	服务器ip地址（默认：127.0.0.1）
  </li>
<li>
    -port  端口号（默认：27017）
  </li>
<li>
    -u     用户名（开启认证模式则必须）
  </li>
<li>
    -p     密码（开启认证模式则必须）
  </li>
<li>
    -d     备份数据库（注：不写则代表全部）
  </li>
<li>
    -o     备份目录
  </li>
</ul>
<h3>练习</h3>
<ul>
<li>
    备份所有数据：mongodump -u admin -p admin888 -o E:\mongodb\bak
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="1288" height="391" src="/wp-content/uploads/2018/05/word-image-4657.png" class="wp-image-5152" srcset="/wp-content/uploads/2018/05/word-image-4657.png 1288w, /wp-content/uploads/2018/05/word-image-4657-300x91.png 300w, /wp-content/uploads/2018/05/word-image-4657-768x233.png 768w, /wp-content/uploads/2018/05/word-image-4657-1024x311.png 1024w" sizes="(max-width: 1288px) 100vw, 1288px" /></p>
<ul>
<li>
    备份指定数据：mongodump -u shop1 -p admin888 -d shop -o E:\mongodb\bak2
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="1232" height="165" src="/wp-content/uploads/2018/05/word-image-4658.png" class="wp-image-5153" srcset="/wp-content/uploads/2018/05/word-image-4658.png 1232w, /wp-content/uploads/2018/05/word-image-4658-300x40.png 300w, /wp-content/uploads/2018/05/word-image-4658-768x103.png 768w, /wp-content/uploads/2018/05/word-image-4658-1024x137.png 1024w" sizes="(max-width: 1232px) 100vw, 1232px" /></p>
<h2>2、还原数据库（mongorestore）</h2>
<h3>1）语法</h3>
<ul>
<li>
    还原数据语法：mongorestore -h __ -port __ -u __ -p __ -d__ &#8211;drop 原备份数据目录
  </li>
<li>
    说明
  </li>
<li>
    -h  	服务器ip地址（默认：127.0.0.1）
  </li>
<li>
    -port  端口号（默认：27017）
  </li>
<li>
    -u     用户名（开启认证模式则必须）
  </li>
<li>
    -p     密码（开启认证模式则必须）
  </li>
<li>
    -d  database  数据库（不写则还原全部数据库）
  </li>
<li>
    &#8211;drop  先删除所有的记录，然后恢复
  </li>
</ul>
<h3>2）练习</h3>
<ul>
<li>
    还原所有数据：mongorestore -u admin -p admin888 &#8211;drop E:\mongodb\bak
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="409" height="236" src="/wp-content/uploads/2018/05/word-image-4659.png" class="wp-image-5154" srcset="/wp-content/uploads/2018/05/word-image-4659.png 409w, /wp-content/uploads/2018/05/word-image-4659-300x173.png 300w" sizes="(max-width: 409px) 100vw, 409px" /><br />
<img loading="lazy" decoding="async" width="748" height="75" src="/wp-content/uploads/2018/05/word-image-4660.png" class="wp-image-5155" srcset="/wp-content/uploads/2018/05/word-image-4660.png 748w, /wp-content/uploads/2018/05/word-image-4660-300x30.png 300w" sizes="(max-width: 748px) 100vw, 748px" /><br />
<img loading="lazy" decoding="async" width="712" height="262" src="/wp-content/uploads/2018/05/word-image-4661.png" class="wp-image-5156" srcset="/wp-content/uploads/2018/05/word-image-4661.png 712w, /wp-content/uploads/2018/05/word-image-4661-300x110.png 300w" sizes="(max-width: 712px) 100vw, 712px" /></p>
<p>
  切记不要删除admin数据库
</p>
<ul>
<li>
    还原指定数据：mongorestore -u admin -p admin888 -d shop &#8211;drop E:\mongodb\bak2
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="788" height="454" src="/wp-content/uploads/2018/05/word-image-4662.png" class="wp-image-5157" srcset="/wp-content/uploads/2018/05/word-image-4662.png 788w, /wp-content/uploads/2018/05/word-image-4662-300x173.png 300w, /wp-content/uploads/2018/05/word-image-4662-768x442.png 768w" sizes="(max-width: 788px) 100vw, 788px" /><br />
<img loading="lazy" decoding="async" width="1328" height="258" src="/wp-content/uploads/2018/05/word-image-4663.png" class="wp-image-5158" srcset="/wp-content/uploads/2018/05/word-image-4663.png 1328w, /wp-content/uploads/2018/05/word-image-4663-300x58.png 300w, /wp-content/uploads/2018/05/word-image-4663-768x149.png 768w, /wp-content/uploads/2018/05/word-image-4663-1024x199.png 1024w" sizes="(max-width: 1328px) 100vw, 1328px" /><br />
<img loading="lazy" decoding="async" width="676" height="272" src="/wp-content/uploads/2018/05/word-image-4664.png" class="wp-image-5159" srcset="/wp-content/uploads/2018/05/word-image-4664.png 676w, /wp-content/uploads/2018/05/word-image-4664-300x121.png 300w" sizes="(max-width: 676px) 100vw, 676px" /></p>
<h1>八、PHP 操作MongoDB</h1>
<h2>1、开启mongodb扩展</h2>
<h3>1）查看PHP版本信息，选择对应mongodb扩展</h3>
<p><img loading="lazy" decoding="async" width="991" height="686" src="/wp-content/uploads/2018/05/word-image-4665.png" class="wp-image-5160" srcset="/wp-content/uploads/2018/05/word-image-4665.png 991w, /wp-content/uploads/2018/05/word-image-4665-300x208.png 300w, /wp-content/uploads/2018/05/word-image-4665-768x532.png 768w" sizes="(max-width: 991px) 100vw, 991px" /></p>
<h3>2）让PHP支持操作mongo扩展</h3>
<p>
  步骤1：将mongo.dll扩展文件移动到PHP的ext目录中
</p>
<p><img loading="lazy" decoding="async" width="944" height="481" src="/wp-content/uploads/2018/05/word-image-4666.png" class="wp-image-5161" srcset="/wp-content/uploads/2018/05/word-image-4666.png 944w, /wp-content/uploads/2018/05/word-image-4666-300x153.png 300w, /wp-content/uploads/2018/05/word-image-4666-768x391.png 768w" sizes="(max-width: 944px) 100vw, 944px" /></p>
<p>
  步骤2：修改php配置文件（php.ini）
</p>
<p><img loading="lazy" decoding="async" width="691" height="306" src="/wp-content/uploads/2018/05/word-image-4667.png" class="wp-image-5162" srcset="/wp-content/uploads/2018/05/word-image-4667.png 691w, /wp-content/uploads/2018/05/word-image-4667-300x133.png 300w" sizes="(max-width: 691px) 100vw, 691px" /></p>
<p>
  步骤3：重启服务
</p>
<h3>3）运行 phpinfo() 查询是否设置成功。</h3>
<p><img loading="lazy" decoding="async" width="1146" height="577" src="/wp-content/uploads/2018/05/word-image-4668.png" class="wp-image-5163" srcset="/wp-content/uploads/2018/05/word-image-4668.png 1146w, /wp-content/uploads/2018/05/word-image-4668-300x151.png 300w, /wp-content/uploads/2018/05/word-image-4668-768x387.png 768w, /wp-content/uploads/2018/05/word-image-4668-1024x516.png 1024w" sizes="(max-width: 1146px) 100vw, 1146px" /></p>
<h2>2、PHP代码</h2>
<h3>1、php添加数据</h3>
<p><img loading="lazy" decoding="async" width="801" height="490" src="/wp-content/uploads/2018/05/word-image-4669.png" class="wp-image-5164" srcset="/wp-content/uploads/2018/05/word-image-4669.png 801w, /wp-content/uploads/2018/05/word-image-4669-300x184.png 300w, /wp-content/uploads/2018/05/word-image-4669-768x470.png 768w" sizes="(max-width: 801px) 100vw, 801px" /></p>
<p>
  &lt;?php
</p>
<p>
  //1.创建对象
</p>
<p>
  $username = &#8216;admin&#8217;;
</p>
<p>
  $password = &#8216;admin888&#8217;;
</p>
<p>
  $host = &#8216;127.0.0.1&#8217;;
</p>
<p>
  $mongodb = new Mongo(&#8220;mongodb://{$username}:{$password}@{$host}&#8221;);
</p>
<p>
  // var_dump($mongodb);
</p>
<p>
  //MongoDB语法：$对象-&gt;数据库名-&gt;集合名-&gt;增查改删指令();
</p>
<p>
  //多学一招：之前在mongodb窗口输入json数据，先通过php统一改成数据
</p>
<p>
  //增：给php12数据库的test2集合中插入一条数据（name:l4，age:18）
</p>
<p>
  $rs = $mongodb-&gt;php12-&gt;test2-&gt;insert(array(
</p>
<p>
  	&#8216;name&#8217; =&gt; &#8216;l4&#8217;,
</p>
<p>
  	&#8216;age&#8217; =&gt; 18
</p>
<p>
  ));
</p>
<p>
  var_dump($rs);
</p>
<p>
  //&#8212;&#8212;&#8212;&#8212;
</p>
<p>
  echo &#8216;&lt;hr /&gt;&#8217;;
</p>
<p>
  发现：开启验证模式后通过PHP操作失败
</p>
<p>
  解决：mongodb3版本存在一个bug，需要将currentVersion改成3，从新添加用户即可
</p>
<p>
  步骤1：关闭并卸载服务
</p>
<p><img loading="lazy" decoding="async" width="834" height="260" src="/wp-content/uploads/2018/05/word-image-4670.png" class="wp-image-5165" srcset="/wp-content/uploads/2018/05/word-image-4670.png 834w, /wp-content/uploads/2018/05/word-image-4670-300x94.png 300w, /wp-content/uploads/2018/05/word-image-4670-768x239.png 768w" sizes="(max-width: 834px) 100vw, 834px" /></p>
<p>
  步骤2：创建服务（注：非验证模式）
</p>
<p>
  mongod &#8211;install &#8211;dbpath=e:\mongodb\data &#8211;logpath=e:\mongodb\log1.txt
</p>
<p><img loading="lazy" decoding="async" width="797" height="178" src="/wp-content/uploads/2018/05/word-image-4671.png" class="wp-image-5166" srcset="/wp-content/uploads/2018/05/word-image-4671.png 797w, /wp-content/uploads/2018/05/word-image-4671-300x67.png 300w, /wp-content/uploads/2018/05/word-image-4671-768x172.png 768w" sizes="(max-width: 797px) 100vw, 797px" /></p>
<p>
  步骤3：登录将currentVersion的数字改成3即可
</p>
<p><img loading="lazy" decoding="async" width="729" height="341" src="/wp-content/uploads/2018/05/word-image-4672.png" class="wp-image-5167" srcset="/wp-content/uploads/2018/05/word-image-4672.png 729w, /wp-content/uploads/2018/05/word-image-4672-300x140.png 300w" sizes="(max-width: 729px) 100vw, 729px" /></p>
<p>
  步骤4：删除admin用户，创新创建
</p>
<p><img loading="lazy" decoding="async" width="760" height="315" src="/wp-content/uploads/2018/05/word-image-4673.png" class="wp-image-5168" srcset="/wp-content/uploads/2018/05/word-image-4673.png 760w, /wp-content/uploads/2018/05/word-image-4673-300x124.png 300w" sizes="(max-width: 760px) 100vw, 760px" /><br />
<img loading="lazy" decoding="async" width="538" height="408" src="/wp-content/uploads/2018/05/word-image-4674.png" class="wp-image-5169" srcset="/wp-content/uploads/2018/05/word-image-4674.png 538w, /wp-content/uploads/2018/05/word-image-4674-300x228.png 300w" sizes="(max-width: 538px) 100vw, 538px" /></p>
<p>
  步骤5：退出、停止服务、并卸载服务
</p>
<p><img loading="lazy" decoding="async" width="885" height="308" src="/wp-content/uploads/2018/05/word-image-4675.png" class="wp-image-5170" srcset="/wp-content/uploads/2018/05/word-image-4675.png 885w, /wp-content/uploads/2018/05/word-image-4675-300x104.png 300w, /wp-content/uploads/2018/05/word-image-4675-768x267.png 768w" sizes="(max-width: 885px) 100vw, 885px" /></p>
<p>
  步骤6：重新创建验证模式即可
</p>
<p>
  mongod &#8211;install &#8211;dbpath=e:\mongodb\data &#8211;logpath=e:\mongodb\log3.txt &#8211;auth
</p>
<p><img loading="lazy" decoding="async" width="893" height="224" src="/wp-content/uploads/2018/05/word-image-4676.png" class="wp-image-5171" srcset="/wp-content/uploads/2018/05/word-image-4676.png 893w, /wp-content/uploads/2018/05/word-image-4676-300x75.png 300w, /wp-content/uploads/2018/05/word-image-4676-768x193.png 768w" sizes="(max-width: 893px) 100vw, 893px" /></p>
<h3>2、php修改数据</h3>
<p><img loading="lazy" decoding="async" width="863" height="477" src="/wp-content/uploads/2018/05/word-image-4677.png" class="wp-image-5172" srcset="/wp-content/uploads/2018/05/word-image-4677.png 863w, /wp-content/uploads/2018/05/word-image-4677-300x166.png 300w, /wp-content/uploads/2018/05/word-image-4677-768x424.png 768w" sizes="(max-width: 863px) 100vw, 863px" /></p>
<p>
  &lt;?php
</p>
<p>
  //1.创建对象
</p>
<p>
  $username = &#8216;admin&#8217;;
</p>
<p>
  $password = &#8216;admin888&#8217;;
</p>
<p>
  $host = &#8216;127.0.0.1&#8217;;
</p>
<p>
  $mongodb = new Mongo(&#8220;mongodb://{$username}:{$password}@{$host}&#8221;);
</p>
<p>
  // var_dump($mongodb);
</p>
<p>
  //MongoDB语法：db.集合名.update（条件， {修改器:{键:值}}）；
</p>
<p>
  //PHP中语法：$对象-&gt;数据库名-&gt;集合名-&gt;改(就是将花括号改成数组即可);
</p>
<p>
  //需求：将php12数据库中的test2集合中的数据name改成 z3即可
</p>
<p>
  $rs = $mongodb-&gt;php12-&gt;test2-&gt;update(
</p>
<p>
  	array(),
</p>
<p>
  	array(&#8216;$set&#8217;=&gt;array(&#8216;name&#8217;=&gt;&#8217;z3&#8217;)),
</p>
<p>
  	<strong>array(&#8216;multiple&#8217; =&gt; true)</strong>
</p>
<p>
  );
</p>
<p>
  var_dump($rs);
</p>
<h3>3、PHP遍历数据</h3>
<p><img loading="lazy" decoding="async" width="890" height="443" src="/wp-content/uploads/2018/05/word-image-4678.png" class="wp-image-5173" srcset="/wp-content/uploads/2018/05/word-image-4678.png 890w, /wp-content/uploads/2018/05/word-image-4678-300x149.png 300w, /wp-content/uploads/2018/05/word-image-4678-768x382.png 768w" sizes="(max-width: 890px) 100vw, 890px" /></p>
<p>
  &lt;?php
</p>
<p>
  //1.创建对象
</p>
<p>
  $username = &#8216;admin&#8217;;
</p>
<p>
  $password = &#8216;admin888&#8217;;
</p>
<p>
  $host = &#8216;127.0.0.1&#8217;;
</p>
<p>
  $mongodb = new Mongo(&#8220;mongodb://{$username}:{$password}@{$host}&#8221;);
</p>
<p>
  // $rs = $mongodb-&gt;php12-&gt;test2-&gt;findOne();
</p>
<p>
  // echo &#8216;&lt;pre&gt;&#8217;;
</p>
<p>
  // print_r($rs);
</p>
<p>
  echo &#8216;&lt;pre&gt;&#8217;;
</p>
<p>
  $rs = $mongodb-&gt;php12-&gt;test2-&gt;find();
</p>
<p>
  foreach ($rs as $data) {
</p>
<p>
  	print_r($data);
</p>
<p>
  }</p>
]]></content:encoded>
					
					<wfw:commentRss>/%e6%95%b0%e6%8d%ae%e5%ba%93/5082.html/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Mysql（一）关系型、 层次型、 数据库、 数据库引擎、 数据表、 网状型、 表属性</title>
		<link>/%e6%95%b0%e6%8d%ae%e5%ba%93/mysql/944.html</link>
					<comments>/%e6%95%b0%e6%8d%ae%e5%ba%93/mysql/944.html#respond</comments>
		
		<dc:creator><![CDATA[Mr.Lee]]></dc:creator>
		<pubDate>Thu, 17 May 2018 17:14:51 +0000</pubDate>
				<category><![CDATA[Mysql]]></category>
		<category><![CDATA[关系型]]></category>
		<category><![CDATA[层次型]]></category>
		<category><![CDATA[数据库]]></category>
		<category><![CDATA[数据库引擎]]></category>
		<category><![CDATA[数据表]]></category>
		<category><![CDATA[网状型]]></category>
		<category><![CDATA[表属性]]></category>
		<guid isPermaLink="false">/?p=944</guid>

					<description><![CDATA[基本概念 数据库 database 什么是数据库：存放数据的仓库，用途就是存放，（永久存放） Word也是永久 [&#8230;]]]></description>
										<content:encoded><![CDATA[<h1>基本概念</h1>
<h2>数据库</h2>
<p>
  database
</p>
<p>
  什么是数据库：存放数据的仓库，用途就是存放，（永久存放）
</p>
<p>
  Word也是永久存放数据的地方，那么word是数据库吗？
</p>
<p>
  Word 文档文件&#8212;-从定义上说，word就是数据库，为什么？
</p>
<p>
  其实数据库的本质就是文件
</p>
<p>
  <img loading="lazy" decoding="async" width="1033" height="327" src="/wp-content/uploads/2018/05/word-image-838.png" class="wp-image-945" srcset="/wp-content/uploads/2018/05/word-image-838.png 1033w, /wp-content/uploads/2018/05/word-image-838-300x95.png 300w, /wp-content/uploads/2018/05/word-image-838-768x243.png 768w, /wp-content/uploads/2018/05/word-image-838-1024x324.png 1024w" sizes="(max-width: 1033px) 100vw, 1033px" />
</p>
<h2>数据库发展史</h2>
<h3>层次型</h3>
<p>
  什么是层次型数据库？
</p>
<p>
  把数据分层，分类来存储好处，把数据归类了，层次分明
</p>
<p>
  像一个倒立的树
</p>
<p>
  现在你要找一个学生，那么必须从学校开始找  学校&#8212;-班级&#8212;-学生或学校&#8212;-教师&#8212;学生
</p>
<p>
  出现了一个导航问题找C必须通过A再B
</p>
<p>
  出现了重复数据
</p>
<p>
  <img loading="lazy" decoding="async" width="603" height="515" src="/wp-content/uploads/2018/05/word-image-839.png" class="wp-image-946" srcset="/wp-content/uploads/2018/05/word-image-839.png 603w, /wp-content/uploads/2018/05/word-image-839-300x256.png 300w" sizes="(max-width: 603px) 100vw, 603px" />
</p>
<h3>网状型</h3>
<p>
  好处：解决了数据的重复
</p>
<p>
  坏处：但是导航问题没有根本的解决
</p>
<p>
  <img loading="lazy" decoding="async" width="522" height="523" src="/wp-content/uploads/2018/05/word-image-840.png" class="wp-image-947" srcset="/wp-content/uploads/2018/05/word-image-840.png 522w, /wp-content/uploads/2018/05/word-image-840-150x150.png 150w, /wp-content/uploads/2018/05/word-image-840-300x300.png 300w" sizes="(max-width: 522px) 100vw, 522px" />
</p>
<h3>关系型</h3>
<p>
  什么是关系型数据库
</p>
<p>
  其实就是有关系的二维表
</p>
<p>
  <img loading="lazy" decoding="async" width="946" height="145" src="/wp-content/uploads/2018/05/word-image-841.png" class="wp-image-948" srcset="/wp-content/uploads/2018/05/word-image-841.png 946w, /wp-content/uploads/2018/05/word-image-841-300x46.png 300w, /wp-content/uploads/2018/05/word-image-841-768x118.png 768w" sizes="(max-width: 946px) 100vw, 946px" />
</p>
<h2>数据表</h2>
<p>
  关系型数据库中的二维表就是数据表，是二维的另外一个名字
</p>
<h3>记录</h3>
<p>
  数据表中一行就是一条记录
</p>
<h3>字段</h3>
<p>
  数据表中一列就是一个字段
</p>
<h3>数据</h3>
<p>
  一行和一列交差的地方就是数据
</p>
<p>
  <img loading="lazy" decoding="async" width="463" height="168" src="/wp-content/uploads/2018/05/word-image-842.png" class="wp-image-949" srcset="/wp-content/uploads/2018/05/word-image-842.png 463w, /wp-content/uploads/2018/05/word-image-842-300x109.png 300w" sizes="(max-width: 463px) 100vw, 463px" />
</p>
<h2>数据库管理系统（软件）</h2>
<p>
  Managerment  database  system
</p>
<p>
  平时说的MySQL数据库这个定义不对  其实MySQL是管理数据库的，是一个数据库管理系统
</p>
<p>
  常见的一些数据库管理系统有如下几个;
</p>
<p>
  Oracle  mysql   sqlserver  sqllite   db2  access
</p>
<p>
  如上的一些数据库管理系统都有一个特点&#8212;&#8211;都是管理关系型数据库的
</p>
<p>
  用途：数据库管理系统就是用来管理数据库的
</p>
<h2>SQL</h2>
<p>
  Sql就是数据库管理系统管理数据库的一种命令
</p>
<p>
  这里数据库管理系统可以不同但是sql命令确是可以共用的，说白了，SQL就是一种专门管理数据库的一种语言
</p>
<h2>数据库服务器（硬件）</h2>
<p>
  数据库服务器：就是提供数据库服务的一个计算机，安装了数据库管理系统
</p>
<h2>数据库系统</h2>
<p>
  数据库系统=数据库管理员+数据库管理系统+数据库
</p>
<p>
  <img loading="lazy" decoding="async" width="1555" height="497" src="/wp-content/uploads/2018/05/word-image-843.png" class="wp-image-950" srcset="/wp-content/uploads/2018/05/word-image-843.png 1555w, /wp-content/uploads/2018/05/word-image-843-300x96.png 300w, /wp-content/uploads/2018/05/word-image-843-768x245.png 768w, /wp-content/uploads/2018/05/word-image-843-1024x327.png 1024w" sizes="(max-width: 1555px) 100vw, 1555px" />
</p>
<h2>今日数据库操作步骤</h2>
<ul>
<li>
    数据库操作顺序
  </li>
<li>
    第一步：打开数据库服务
  </li>
<li>
    第二步：连接数据库
  </li>
<li>
    第三步：数据库的‘库操作’</p>
<ul>
<li>
<ul>
<li>
            对数据库的增删改查
          </li>
</ul>
</li>
</ul>
</li>
<li>
    第四步：进入数据库
  </li>
<li>
    第五步：表操作（增加，删除，修改）
  </li>
</ul>
<h1>数据库服务</h1>
<h2>启动数据库服务</h2>
<p>
  第一种
</p>
<p>
  右键计算机&#8212;管理&#8212;服务&#8212;MySQL数据库
</p>
<p>
  <img loading="lazy" decoding="async" width="759" height="285" src="/wp-content/uploads/2018/05/word-image-844.png" class="wp-image-951" srcset="/wp-content/uploads/2018/05/word-image-844.png 759w, /wp-content/uploads/2018/05/word-image-844-300x113.png 300w" sizes="(max-width: 759px) 100vw, 759px" />
</p>
<p>
  第二种
</p>
<p>
  Cmd 命令行方式启动
</p>
<p>
  <img loading="lazy" decoding="async" width="484" height="72" src="/wp-content/uploads/2018/05/word-image-845.png" class="wp-image-952" srcset="/wp-content/uploads/2018/05/word-image-845.png 484w, /wp-content/uploads/2018/05/word-image-845-300x45.png 300w" sizes="(max-width: 484px) 100vw, 484px" />
</p>
<p>
  注意：配置path，net start mysql后没有分号；
</p>
<h2>关闭数据库服务</h2>
<p>
  语法： net stop mysql
</p>
<p>
  <img loading="lazy" decoding="async" width="563" height="132" src="/wp-content/uploads/2018/05/word-image-846.png" class="wp-image-953" srcset="/wp-content/uploads/2018/05/word-image-846.png 563w, /wp-content/uploads/2018/05/word-image-846-300x70.png 300w" sizes="(max-width: 563px) 100vw, 563px" />
</p>
<h1>MySQL客户端</h1>
<h2>Windows命令窗口cmd</h2>
<h3>连接数据库</h3>
<p>
  语法:  mysql -h主机名 -P端口号 -u用户名 -p密码
</p>
<ul>
<li>
    -h主机名，默认是localhost(127.0.0.1) ,如果是默认可以不填写
  </li>
<li>
    -P端口号，默认是3306，如果是默认的可以不填写
  </li>
<li>
    -u用户名
  </li>
<li>
    -p密码
  </li>
</ul>
<p>
  <img loading="lazy" decoding="async" width="856" height="283" src="/wp-content/uploads/2018/05/word-image-847.png" class="wp-image-954" srcset="/wp-content/uploads/2018/05/word-image-847.png 856w, /wp-content/uploads/2018/05/word-image-847-300x99.png 300w, /wp-content/uploads/2018/05/word-image-847-768x254.png 768w" sizes="(max-width: 856px) 100vw, 856px" />
</p>
<p>
  优化
</p>
<p>
  <img loading="lazy" decoding="async" width="895" height="306" src="/wp-content/uploads/2018/05/word-image-848.png" class="wp-image-955" srcset="/wp-content/uploads/2018/05/word-image-848.png 895w, /wp-content/uploads/2018/05/word-image-848-300x103.png 300w, /wp-content/uploads/2018/05/word-image-848-768x263.png 768w" sizes="(max-width: 895px) 100vw, 895px" />
</p>
<h3>退出数据库</h3>
<p>
  \q
</p>
<p>
  <img loading="lazy" decoding="async" width="706" height="63" src="/wp-content/uploads/2018/05/word-image-849.png" class="wp-image-956" srcset="/wp-content/uploads/2018/05/word-image-849.png 706w, /wp-content/uploads/2018/05/word-image-849-300x27.png 300w" sizes="(max-width: 706px) 100vw, 706px" />
</p>
<p>
  Exit
</p>
<p>
  <img loading="lazy" decoding="async" width="535" height="84" src="/wp-content/uploads/2018/05/word-image-850.png" class="wp-image-957" srcset="/wp-content/uploads/2018/05/word-image-850.png 535w, /wp-content/uploads/2018/05/word-image-850-300x47.png 300w" sizes="(max-width: 535px) 100vw, 535px" />
</p>
<p>
  Quit
</p>
<p>
  <img loading="lazy" decoding="async" width="611" height="86" src="/wp-content/uploads/2018/05/word-image-851.png" class="wp-image-958" srcset="/wp-content/uploads/2018/05/word-image-851.png 611w, /wp-content/uploads/2018/05/word-image-851-300x42.png 300w" sizes="(max-width: 611px) 100vw, 611px" />
</p>
<h2>Windows界面客户端</h2>
<p>
  Navicate (强烈不推荐使用)
</p>
<p>
  <img loading="lazy" decoding="async" width="579" height="275" src="/wp-content/uploads/2018/05/word-image-852.png" class="wp-image-960" srcset="/wp-content/uploads/2018/05/word-image-852.png 579w, /wp-content/uploads/2018/05/word-image-852-300x142.png 300w" sizes="(max-width: 579px) 100vw, 579px" />
</p>
<h2>Web界面（PHPadmin）</h2>
<h3>配置web站</h3>
<p>
  解压放置到你的虚拟站点位置
</p>
<p>
  <img loading="lazy" decoding="async" width="1016" height="353" src="/wp-content/uploads/2018/05/word-image-853.png" class="wp-image-961" srcset="/wp-content/uploads/2018/05/word-image-853.png 1016w, /wp-content/uploads/2018/05/word-image-853-300x104.png 300w, /wp-content/uploads/2018/05/word-image-853-768x267.png 768w" sizes="(max-width: 1016px) 100vw, 1016px" />
</p>
<p>
  配置虚拟主机
</p>
<p>
  <img loading="lazy" decoding="async" width="1091" height="321" src="/wp-content/uploads/2018/05/word-image-854.png" class="wp-image-962" srcset="/wp-content/uploads/2018/05/word-image-854.png 1091w, /wp-content/uploads/2018/05/word-image-854-300x88.png 300w, /wp-content/uploads/2018/05/word-image-854-768x226.png 768w, /wp-content/uploads/2018/05/word-image-854-1024x301.png 1024w" sizes="(max-width: 1091px) 100vw, 1091px" />
</p>
<p>
  修改host
</p>
<p>
  <img loading="lazy" decoding="async" width="659" height="235" src="/wp-content/uploads/2018/05/word-image-855.png" class="wp-image-963" srcset="/wp-content/uploads/2018/05/word-image-855.png 659w, /wp-content/uploads/2018/05/word-image-855-300x107.png 300w" sizes="(max-width: 659px) 100vw, 659px" />
</p>
<p>
  重启Apache访问站点
</p>
<p>
  <img loading="lazy" decoding="async" width="1322" height="725" src="/wp-content/uploads/2018/05/word-image-856.png" class="wp-image-964" srcset="/wp-content/uploads/2018/05/word-image-856.png 1322w, /wp-content/uploads/2018/05/word-image-856-300x165.png 300w, /wp-content/uploads/2018/05/word-image-856-768x421.png 768w, /wp-content/uploads/2018/05/word-image-856-1024x562.png 1024w" sizes="(max-width: 1322px) 100vw, 1322px" />
</p>
<p>
  我的错误：配置路径的时候多了一个s
</p>
<h3>连接数据库</h3>
<p>
  登录完成后的效果：
</p>
<p>
  <img loading="lazy" decoding="async" width="1355" height="506" src="/wp-content/uploads/2018/05/word-image-857.png" class="wp-image-965" srcset="/wp-content/uploads/2018/05/word-image-857.png 1355w, /wp-content/uploads/2018/05/word-image-857-300x112.png 300w, /wp-content/uploads/2018/05/word-image-857-768x287.png 768w, /wp-content/uploads/2018/05/word-image-857-1024x382.png 1024w" sizes="(max-width: 1355px) 100vw, 1355px" />
</p>
<h1>数据库操作</h1>
<h2>创建数据库</h2>
<p>
  语法：create  database 数据库名字;
</p>
<p>
  <img loading="lazy" decoding="async" width="520" height="89" src="/wp-content/uploads/2018/05/word-image-858.png" class="wp-image-966" srcset="/wp-content/uploads/2018/05/word-image-858.png 520w, /wp-content/uploads/2018/05/word-image-858-300x51.png 300w" sizes="(max-width: 520px) 100vw, 520px" />
</p>
<p>
  注意;数据库命名有如下的规则
</p>
<p>
  数据库名字是由字母，数字，下划线组成
</p>
<p>
  数据库名字不能是纯数字
</p>
<p>
  <img loading="lazy" decoding="async" width="783" height="67" src="/wp-content/uploads/2018/05/word-image-859.png" class="wp-image-967" srcset="/wp-content/uploads/2018/05/word-image-859.png 783w, /wp-content/uploads/2018/05/word-image-859-300x26.png 300w, /wp-content/uploads/2018/05/word-image-859-768x66.png 768w" sizes="(max-width: 783px) 100vw, 783px" />
</p>
<p>
  数据库名字不能是数据库的关键字
</p>
<p>
  <img loading="lazy" decoding="async" width="841" height="42" src="/wp-content/uploads/2018/05/word-image-860.png" class="wp-image-968" srcset="/wp-content/uploads/2018/05/word-image-860.png 841w, /wp-content/uploads/2018/05/word-image-860-300x15.png 300w, /wp-content/uploads/2018/05/word-image-860-768x38.png 768w" sizes="(max-width: 841px) 100vw, 841px" />
</p>
<p>
  如果数据库名字是一个数据库关键字，那么用&#8220;（反引号）引起来
</p>
<p>
  <img loading="lazy" decoding="async" width="479" height="50" src="/wp-content/uploads/2018/05/word-image-861.png" class="wp-image-969" srcset="/wp-content/uploads/2018/05/word-image-861.png 479w, /wp-content/uploads/2018/05/word-image-861-300x31.png 300w" sizes="(max-width: 479px) 100vw, 479px" />
</p>
<p>
  扩展;创建数据库的时候指定字符集
</p>
<p>
  语法：create  database  数据库名字  charset  字符集;
</p>
<p>
  <img loading="lazy" decoding="async" width="514" height="48" src="/wp-content/uploads/2018/05/word-image-862.png" class="wp-image-970" srcset="/wp-content/uploads/2018/05/word-image-862.png 514w, /wp-content/uploads/2018/05/word-image-862-300x28.png 300w" sizes="(max-width: 514px) 100vw, 514px" />
</p>
<h2>删除数据库</h2>
<p>
  语法: drop database 数据库名字;
</p>
<p>
  <img loading="lazy" decoding="async" width="459" height="56" src="/wp-content/uploads/2018/05/word-image-863.png" class="wp-image-971" srcset="/wp-content/uploads/2018/05/word-image-863.png 459w, /wp-content/uploads/2018/05/word-image-863-300x37.png 300w" sizes="(max-width: 459px) 100vw, 459px" />
</p>
<h2>修改数据库</h2>
<p>
  修改数据库的名字
</p>
<p>
  	这里没有直接修改数据库名字的语法，只能先删除数据库，再重建
</p>
<p>
  修改数据库的字符集
</p>
<ul>
<li>
    alter database 数据库名字 charset 新字符集
  </li>
</ul>
<p>
  <img loading="lazy" decoding="async" width="482" height="53" src="/wp-content/uploads/2018/05/word-image-864.png" class="wp-image-972" srcset="/wp-content/uploads/2018/05/word-image-864.png 482w, /wp-content/uploads/2018/05/word-image-864-300x33.png 300w" sizes="(max-width: 482px) 100vw, 482px" />
</p>
<ul>
<li>
    alter database 数据库名字 charset = 新字符集
  </li>
</ul>
<p>
  <img loading="lazy" decoding="async" width="478" height="43" src="/wp-content/uploads/2018/05/word-image-865.png" class="wp-image-973" srcset="/wp-content/uploads/2018/05/word-image-865.png 478w, /wp-content/uploads/2018/05/word-image-865-300x27.png 300w" sizes="(max-width: 478px) 100vw, 478px" />
</p>
<ul>
<li>
    alter  database  数据库名字  default  character set 新字符集名字
  </li>
</ul>
<p>
  <img loading="lazy" decoding="async" width="553" height="45" src="/wp-content/uploads/2018/05/word-image-866.png" class="wp-image-974" srcset="/wp-content/uploads/2018/05/word-image-866.png 553w, /wp-content/uploads/2018/05/word-image-866-300x24.png 300w" sizes="(max-width: 553px) 100vw, 553px" />
</p>
<h2>查看数据库</h2>
<p>
  语法:show databases;
</p>
<p>
  注意：系统数据库不要随意操作
</p>
<p>
  <img loading="lazy" decoding="async" width="920" height="556" src="/wp-content/uploads/2018/05/word-image-867.png" class="wp-image-975" srcset="/wp-content/uploads/2018/05/word-image-867.png 920w, /wp-content/uploads/2018/05/word-image-867-300x181.png 300w, /wp-content/uploads/2018/05/word-image-867-768x464.png 768w" sizes="(max-width: 920px) 100vw, 920px" />
</p>
<h2>查看数据库创建语句</h2>
<p>
  语法:show create database 数据库名;
</p>
<p>
  <img loading="lazy" decoding="async" width="784" height="144" src="/wp-content/uploads/2018/05/word-image-868.png" class="wp-image-976" srcset="/wp-content/uploads/2018/05/word-image-868.png 784w, /wp-content/uploads/2018/05/word-image-868-300x55.png 300w, /wp-content/uploads/2018/05/word-image-868-768x141.png 768w" sizes="(max-width: 784px) 100vw, 784px" />
</p>
<h2>数据库保存目录</h2>
<p>
  <img loading="lazy" decoding="async" width="1409" height="245" src="/wp-content/uploads/2018/05/word-image-869.png" class="wp-image-977" srcset="/wp-content/uploads/2018/05/word-image-869.png 1409w, /wp-content/uploads/2018/05/word-image-869-300x52.png 300w, /wp-content/uploads/2018/05/word-image-869-768x134.png 768w, /wp-content/uploads/2018/05/word-image-869-1024x178.png 1024w" sizes="(max-width: 1409px) 100vw, 1409px" />
</p>
<p>
  默认保存路径可以在my.ini中修改
</p>
<p>
  <img loading="lazy" decoding="async" width="872" height="190" src="/wp-content/uploads/2018/05/word-image-870.png" class="wp-image-978" srcset="/wp-content/uploads/2018/05/word-image-870.png 872w, /wp-content/uploads/2018/05/word-image-870-300x65.png 300w, /wp-content/uploads/2018/05/word-image-870-768x167.png 768w" sizes="(max-width: 872px) 100vw, 872px" />
</p>
<h1>表操作</h1>
<h2>创建数据表</h2>
<p>
  Create table 表名
</p>
<p>
  (
</p>
<p>
  	字段名 类型  [字段属性],
</p>
<p>
  字段名 类型  [字段属性],
</p>
<p>
  字段名 类型  [字段属性]   &#8212;  最后一个字段后边不加逗号,
</p>
<p>
  )[表属性]
</p>
<p>
  创建表：只是创建了一个表的结构，而没有数据；
</p>
<h3>字段类型（介绍）</h3>
<ul>
<li>
    整形  tinyint  smallint  mediumint  int   bigint
  </li>
<li>
    小数 float  double  decimal
  </li>
<li>
    字符串 char   varchar  text  set  enum  blob
  </li>
<li>
    时间 time  date  datetime  timestamp
  </li>
</ul>
<h3>字段属性（介绍）</h3>
<p>
  什么是字段属性：字段属性就是对字段的一种约束
</p>
<ul>
<li>
    Not null/null  允许为不为空/空
  </li>
<li>
    Primary key  主键
  </li>
<li>
    Unque key   唯一建
  </li>
<li>
    Comment    说明
  </li>
<li>
    Atuo_increment  自动增长
  </li>
</ul>
<h3>表属性（介绍）</h3>
<ul>
<li>
    Charset  表字符集
  </li>
<li>
    Auto_increment   自动增长
  </li>
<li>
    Collate   校对集
  </li>
<li>
    Comment  说明
  </li>
<li>
    Engine   数据表引擎
  </li>
</ul>
<p>
  案例：创建一个简单表
</p>
<p>
  第一步：数据表创建，是创建到数据库中的，所以呢创建数据表之前应该选定创建到哪个数据库
</p>
<p>
  选择数据库语法: use 数据库名字;
</p>
<p>
  <img loading="lazy" decoding="async" width="403" height="47" src="/wp-content/uploads/2018/05/word-image-871.png" class="wp-image-979" srcset="/wp-content/uploads/2018/05/word-image-871.png 403w, /wp-content/uploads/2018/05/word-image-871-300x35.png 300w" sizes="(max-width: 403px) 100vw, 403px" />
</p>
<p><strong>第二步：创建表</strong>
</p>
<p>
  <img loading="lazy" decoding="async" width="679" height="190" src="/wp-content/uploads/2018/05/word-image-872.png" class="wp-image-980" srcset="/wp-content/uploads/2018/05/word-image-872.png 679w, /wp-content/uploads/2018/05/word-image-872-300x84.png 300w" sizes="(max-width: 679px) 100vw, 679px" />
</p>
<p><strong>英雄技能表案例：</strong>
</p>
<p>
  <img loading="lazy" decoding="async" width="806" height="203" src="/wp-content/uploads/2018/05/word-image-873.png" class="wp-image-981" srcset="/wp-content/uploads/2018/05/word-image-873.png 806w, /wp-content/uploads/2018/05/word-image-873-300x76.png 300w, /wp-content/uploads/2018/05/word-image-873-768x193.png 768w" sizes="(max-width: 806px) 100vw, 806px" />
</p>
<h2>查看数据表</h2>
<p>
  查看当前数据库有哪些数据表（所有的表查看）
</p>
<p>
  语法：show tables；
</p>
<p>
  <img loading="lazy" decoding="async" width="715" height="143" src="/wp-content/uploads/2018/05/word-image-874.png" class="wp-image-982" srcset="/wp-content/uploads/2018/05/word-image-874.png 715w, /wp-content/uploads/2018/05/word-image-874-300x60.png 300w" sizes="(max-width: 715px) 100vw, 715px" />
</p>
<h2>删除数据表</h2>
<p>
  语法:  drop table 表名;
</p>
<p>
  <img loading="lazy" decoding="async" width="493" height="45" src="/wp-content/uploads/2018/05/word-image-875.png" class="wp-image-983" srcset="/wp-content/uploads/2018/05/word-image-875.png 493w, /wp-content/uploads/2018/05/word-image-875-300x27.png 300w" sizes="(max-width: 493px) 100vw, 493px" />
</p>
<p>
  扩展，一次删除多张数据表 drop  table 表1,表2…..;
</p>
<p>
  <img loading="lazy" decoding="async" width="507" height="54" src="/wp-content/uploads/2018/05/word-image-876.png" class="wp-image-984" srcset="/wp-content/uploads/2018/05/word-image-876.png 507w, /wp-content/uploads/2018/05/word-image-876-300x32.png 300w" sizes="(max-width: 507px) 100vw, 507px" />
</p>
<h2>查看表结构</h2>
<p>
  查看表的结构:  desc 表名;
</p>
<p>
  <img loading="lazy" decoding="async" width="714" height="224" src="/wp-content/uploads/2018/05/word-image-877.png" class="wp-image-985" srcset="/wp-content/uploads/2018/05/word-image-877.png 714w, /wp-content/uploads/2018/05/word-image-877-300x94.png 300w" sizes="(max-width: 714px) 100vw, 714px" />
</p>
<h2>查看表创建语法</h2>
<p>
  查看数据表的创建语句
</p>
<p>
  语法; show create table 表名;、
</p>
<p>
  <img loading="lazy" decoding="async" width="777" height="234" src="/wp-content/uploads/2018/05/word-image-878.png" class="wp-image-986" srcset="/wp-content/uploads/2018/05/word-image-878.png 777w, /wp-content/uploads/2018/05/word-image-878-300x90.png 300w, /wp-content/uploads/2018/05/word-image-878-768x231.png 768w" sizes="(max-width: 777px) 100vw, 777px" />
</p>
<h1>数据简单操作</h1>
<h2>增加</h2>
<p>
  提前准备：
</p>
<p>
  删除老的hero表，创建新的hero表
</p>
<p>
  <img loading="lazy" decoding="async" width="792" height="204" src="/wp-content/uploads/2018/05/word-image-879.png" class="wp-image-987" srcset="/wp-content/uploads/2018/05/word-image-879.png 792w, /wp-content/uploads/2018/05/word-image-879-300x77.png 300w, /wp-content/uploads/2018/05/word-image-879-768x198.png 768w" sizes="(max-width: 792px) 100vw, 792px" />
</p>
<p>
  执行命令 set names gbk 避免乱码错误
</p>
<p>
  语法： insert    [into] 表名   [(插入的字段列表)]  values  (字段值1,字段值2,字段值3……)
</p>
<p>
  注意：后边的值和前边的字段列表的顺序一定要对应
</p>
<ul>
<li>
    错误案例：
  </li>
</ul>
<p>
  <img loading="lazy" decoding="async" width="881" height="127" src="/wp-content/uploads/2018/05/word-image-880.png" class="wp-image-988" srcset="/wp-content/uploads/2018/05/word-image-880.png 881w, /wp-content/uploads/2018/05/word-image-880-300x43.png 300w, /wp-content/uploads/2018/05/word-image-880-768x111.png 768w" sizes="(max-width: 881px) 100vw, 881px" />
</p>
<ul>
<li>
    正确案例：
  </li>
</ul>
<p>
  <img loading="lazy" decoding="async" width="743" height="103" src="/wp-content/uploads/2018/05/word-image-881.png" class="wp-image-989" srcset="/wp-content/uploads/2018/05/word-image-881.png 743w, /wp-content/uploads/2018/05/word-image-881-300x42.png 300w" sizes="(max-width: 743px) 100vw, 743px" />
</p>
<ul>
<li>
    扩展：省略字段列表插入表数据
  </li>
</ul>
<p>
  <img loading="lazy" decoding="async" width="1100" height="87" src="/wp-content/uploads/2018/05/word-image-882.png" class="wp-image-990" srcset="/wp-content/uploads/2018/05/word-image-882.png 1100w, /wp-content/uploads/2018/05/word-image-882-300x24.png 300w, /wp-content/uploads/2018/05/word-image-882-768x61.png 768w, /wp-content/uploads/2018/05/word-image-882-1024x81.png 1024w" sizes="(max-width: 1100px) 100vw, 1100px" />
</p>
<p>
  表创建的顺序如下
</p>
<p>
  <img loading="lazy" decoding="async" width="697" height="195" src="/wp-content/uploads/2018/05/word-image-883.png" class="wp-image-991" srcset="/wp-content/uploads/2018/05/word-image-883.png 697w, /wp-content/uploads/2018/05/word-image-883-300x84.png 300w" sizes="(max-width: 697px) 100vw, 697px" />
</p>
<p>
  扩展：Select 语句复制表
</p>
<h2>修改</h2>
<p>
  语法形式如下：
</p>
<p>
  	Update 表名 set 字段名 =字段值 where修改条件
</p>
<ul>
<li>
    修改大头的英雄伤害
  </li>
</ul>
<p>
  <img loading="lazy" decoding="async" width="681" height="71" src="/wp-content/uploads/2018/05/word-image-884.png" class="wp-image-992" srcset="/wp-content/uploads/2018/05/word-image-884.png 681w, /wp-content/uploads/2018/05/word-image-884-300x31.png 300w" sizes="(max-width: 681px) 100vw, 681px" />
</p>
<p>
  结果
</p>
<p>
  <img loading="lazy" decoding="async" width="857" height="128" src="/wp-content/uploads/2018/05/word-image-885.png" class="wp-image-993" srcset="/wp-content/uploads/2018/05/word-image-885.png 857w, /wp-content/uploads/2018/05/word-image-885-300x45.png 300w, /wp-content/uploads/2018/05/word-image-885-768x115.png 768w" sizes="(max-width: 857px) 100vw, 857px" />
</p>
<p>
  注意：修改表数据的时候一般都要指定修改的条件，如果修改不指定条件的话会把整张表的数据都修改
</p>
<p>
  <img loading="lazy" decoding="async" width="953" height="184" src="/wp-content/uploads/2018/05/word-image-886.png" class="wp-image-994" srcset="/wp-content/uploads/2018/05/word-image-886.png 953w, /wp-content/uploads/2018/05/word-image-886-300x58.png 300w, /wp-content/uploads/2018/05/word-image-886-768x148.png 768w" sizes="(max-width: 953px) 100vw, 953px" />
</p>
<ul>
<li>
    数据多字段的修改
  </li>
</ul>
<p>
  语法：update  表名 set 字段名=值1 ,字段名=字段值…. Where 修改条件
</p>
<p>
  <img loading="lazy" decoding="async" width="843" height="214" src="/wp-content/uploads/2018/05/word-image-887.png" class="wp-image-995" srcset="/wp-content/uploads/2018/05/word-image-887.png 843w, /wp-content/uploads/2018/05/word-image-887-300x76.png 300w, /wp-content/uploads/2018/05/word-image-887-768x195.png 768w" sizes="(max-width: 843px) 100vw, 843px" />
</p>
<h2>查找</h2>
<ul>
<li>
    语法：select  *  from 表名
  </li>
</ul>
<p>
  说明：*代表所有的字段
</p>
<p>
  <img loading="lazy" decoding="async" width="940" height="176" src="/wp-content/uploads/2018/05/word-image-888.png" class="wp-image-996" srcset="/wp-content/uploads/2018/05/word-image-888.png 940w, /wp-content/uploads/2018/05/word-image-888-300x56.png 300w, /wp-content/uploads/2018/05/word-image-888-768x144.png 768w" sizes="(max-width: 940px) 100vw, 940px" />
</p>
<ul>
<li>
    我们还可已选择查看哪些字段的信息
  </li>
</ul>
<p>
  语法: select   字段1,字段2,字段3,字段4……  from  表名；
</p>
<p>
  <img loading="lazy" decoding="async" width="809" height="190" src="/wp-content/uploads/2018/05/word-image-889.png" class="wp-image-997" srcset="/wp-content/uploads/2018/05/word-image-889.png 809w, /wp-content/uploads/2018/05/word-image-889-300x70.png 300w, /wp-content/uploads/2018/05/word-image-889-768x180.png 768w" sizes="(max-width: 809px) 100vw, 809px" />
</p>
<ul>
<li>
    查看技能伤害大于50的英雄信息
  </li>
</ul>
<p>
  语法如下：select 字段列表 from 表名 where  条件
</p>
<p>
  <img loading="lazy" decoding="async" width="962" height="152" src="/wp-content/uploads/2018/05/word-image-890.png" class="wp-image-998" srcset="/wp-content/uploads/2018/05/word-image-890.png 962w, /wp-content/uploads/2018/05/word-image-890-300x47.png 300w, /wp-content/uploads/2018/05/word-image-890-768x121.png 768w" sizes="(max-width: 962px) 100vw, 962px" />
</p>
<h2>删除</h2>
<p>
  语法：delete  from 表名 where 删除的条件；
</p>
<p>
  删除前数据
</p>
<p>
  <img loading="lazy" decoding="async" width="932" height="180" src="/wp-content/uploads/2018/05/word-image-891.png" class="wp-image-999" srcset="/wp-content/uploads/2018/05/word-image-891.png 932w, /wp-content/uploads/2018/05/word-image-891-300x58.png 300w, /wp-content/uploads/2018/05/word-image-891-768x148.png 768w" sizes="(max-width: 932px) 100vw, 932px" />
</p>
<p>
  删除成功
</p>
<p>
  <img loading="lazy" decoding="async" width="750" height="75" src="/wp-content/uploads/2018/05/word-image-892.png" class="wp-image-1000" srcset="/wp-content/uploads/2018/05/word-image-892.png 750w, /wp-content/uploads/2018/05/word-image-892-300x30.png 300w" sizes="(max-width: 750px) 100vw, 750px" />
</p>
<p>
  删除后数据
</p>
<p>
  <img loading="lazy" decoding="async" width="931" height="161" src="/wp-content/uploads/2018/05/word-image-893.png" class="wp-image-1001" srcset="/wp-content/uploads/2018/05/word-image-893.png 931w, /wp-content/uploads/2018/05/word-image-893-300x52.png 300w, /wp-content/uploads/2018/05/word-image-893-768x133.png 768w" sizes="(max-width: 931px) 100vw, 931px" />
</p>
<p>
  注意;这里删除一般都需要制定删除的条件，如果不指定删除的条件那么整张表的数据都会被删除
</p>
<ul>
<li>
    没有条件的删除
  </li>
</ul>
<p>
  删除前
</p>
<p>
  <img loading="lazy" decoding="async" width="941" height="163" src="/wp-content/uploads/2018/05/word-image-894.png" class="wp-image-1002" srcset="/wp-content/uploads/2018/05/word-image-894.png 941w, /wp-content/uploads/2018/05/word-image-894-300x52.png 300w, /wp-content/uploads/2018/05/word-image-894-768x133.png 768w" sizes="(max-width: 941px) 100vw, 941px" />
</p>
<p>
  <img loading="lazy" decoding="async" width="868" height="122" src="/wp-content/uploads/2018/05/word-image-895.png" class="wp-image-1003" srcset="/wp-content/uploads/2018/05/word-image-895.png 868w, /wp-content/uploads/2018/05/word-image-895-300x42.png 300w, /wp-content/uploads/2018/05/word-image-895-768x108.png 768w" sizes="(max-width: 868px) 100vw, 868px" />
</p>
<h1>表属性</h1>
<p>
  表属性就是用来约束表的，限定一些东西
</p>
<h2>字符集（乱码的解决）</h2>
<p>
  常见的字符集有：utf8  gbk  latin1  gb2312
</p>
<p>
  什么是字符集？
</p>
<p>
  	字符集就是字符和字符编码的对应关系
</p>
<p>
  什么是字符？
</p>
<p>
  	像 a,b,A,V,1中文 等都是字符
</p>
<p>
  	什么是字符编码？
</p>
<p>
  		比如 ‘a’这个字符在计算机中是以什么形式存的
</p>
<p>
  		‘a’在计算机中是以二进制存储的，那么这个二进制的码值就是‘a’的字符编码
</p>
<p>
  		 ‘a’&#8212;&#8212;-10110101   10110101就是a的字符编码
</p>
<p>
  		‘b’&#8212;&#8212;-10110110   10110110就是b的字符编码
</p>
<p>
  插入中文数据，插入失败
</p>
<p>
  <img loading="lazy" decoding="async" width="982" height="52" src="/wp-content/uploads/2018/05/word-image-896.png" class="wp-image-1004" srcset="/wp-content/uploads/2018/05/word-image-896.png 982w, /wp-content/uploads/2018/05/word-image-896-300x16.png 300w, /wp-content/uploads/2018/05/word-image-896-768x41.png 768w" sizes="(max-width: 982px) 100vw, 982px" />
</p>
<p>
  错误原因
</p>
<p>
  <img loading="lazy" decoding="async" width="1179" height="311" src="/wp-content/uploads/2018/05/word-image-897.png" class="wp-image-1005" srcset="/wp-content/uploads/2018/05/word-image-897.png 1179w, /wp-content/uploads/2018/05/word-image-897-300x79.png 300w, /wp-content/uploads/2018/05/word-image-897-768x203.png 768w, /wp-content/uploads/2018/05/word-image-897-1024x270.png 1024w" sizes="(max-width: 1179px) 100vw, 1179px" />
</p>
<p>
  错误解决
</p>
<p>
  <img loading="lazy" decoding="async" width="839" height="366" src="/wp-content/uploads/2018/05/word-image-898.png" class="wp-image-1006" srcset="/wp-content/uploads/2018/05/word-image-898.png 839w, /wp-content/uploads/2018/05/word-image-898-300x131.png 300w, /wp-content/uploads/2018/05/word-image-898-768x335.png 768w" sizes="(max-width: 839px) 100vw, 839px" />
</p>
<p>
  插入数据插入成功
</p>
<p>
  <img loading="lazy" decoding="async" width="706" height="64" src="/wp-content/uploads/2018/05/word-image-899.png" class="wp-image-1007" srcset="/wp-content/uploads/2018/05/word-image-899.png 706w, /wp-content/uploads/2018/05/word-image-899-300x27.png 300w" sizes="(max-width: 706px) 100vw, 706px" />
</p>
<p>
  查看数据
</p>
<p>
  <img loading="lazy" decoding="async" width="912" height="147" src="/wp-content/uploads/2018/05/word-image-900.png" class="wp-image-1008" srcset="/wp-content/uploads/2018/05/word-image-900.png 912w, /wp-content/uploads/2018/05/word-image-900-300x48.png 300w, /wp-content/uploads/2018/05/word-image-900-768x124.png 768w" sizes="(max-width: 912px) 100vw, 912px" />
</p>
<p>
  错误原因
</p>
<p>
  <img loading="lazy" decoding="async" width="1191" height="343" src="/wp-content/uploads/2018/05/word-image-901.png" class="wp-image-1009" srcset="/wp-content/uploads/2018/05/word-image-901.png 1191w, /wp-content/uploads/2018/05/word-image-901-300x86.png 300w, /wp-content/uploads/2018/05/word-image-901-768x221.png 768w, /wp-content/uploads/2018/05/word-image-901-1024x295.png 1024w" sizes="(max-width: 1191px) 100vw, 1191px" />
</p>
<p>
  错误解决
</p>
<p>
  <img loading="lazy" decoding="async" width="970" height="346" src="/wp-content/uploads/2018/05/word-image-902.png" class="wp-image-1010" srcset="/wp-content/uploads/2018/05/word-image-902.png 970w, /wp-content/uploads/2018/05/word-image-902-300x107.png 300w, /wp-content/uploads/2018/05/word-image-902-768x274.png 768w" sizes="(max-width: 970px) 100vw, 970px" />
</p>
<p>
  再次查看数据
</p>
<p>
  <img loading="lazy" decoding="async" width="989" height="142" src="/wp-content/uploads/2018/05/word-image-903.png" class="wp-image-1011" srcset="/wp-content/uploads/2018/05/word-image-903.png 989w, /wp-content/uploads/2018/05/word-image-903-300x43.png 300w, /wp-content/uploads/2018/05/word-image-903-768x110.png 768w" sizes="(max-width: 989px) 100vw, 989px" />
</p>
<h2>校对集</h2>
<p>
  什么是校对集：校对集就是字符集中的一种比较规则，主要用于排序
</p>
<p>
  Show  collation;查看所有的校对集
</p>
<p>
  show collation like &#8216;utf8_%&#8217;;查看utf8的校对集
</p>
<p>
   	utf8的两种校对集使用
</p>
<p>
  utf8_general_ci  不区分大小写  (a  B  c)
</p>
<p>
  utf8_bin   二进制排序 （B a c）
</p>
<p>
  	B&#8212;-66
</p>
<p>
  a&#8212;-97
</p>
<p>
  c&#8212;-99
</p>
<p>
  案例：
</p>
<p>
  	创建两张表
</p>
<p>
  <img loading="lazy" decoding="async" width="674" height="247" src="/wp-content/uploads/2018/05/word-image-904.png" class="wp-image-1012" srcset="/wp-content/uploads/2018/05/word-image-904.png 674w, /wp-content/uploads/2018/05/word-image-904-300x110.png 300w" sizes="(max-width: 674px) 100vw, 674px" />
</p>
<p>
  插入数据
</p>
<p>
  insert into test1 values(&#8216;a&#8217;);
</p>
<p>
  insert into test1 values(&#8216;B&#8217;);
</p>
<p>
  insert into test1 values(&#8216;c&#8217;);
</p>
<p>
  insert into test2 values(&#8216;a&#8217;);
</p>
<p>
  insert into test2 values(&#8216;B&#8217;);
</p>
<p>
  insert into test2 values(&#8216;c&#8217;);
</p>
<p>
  排序查看
</p>
<p>
  <img loading="lazy" decoding="async" width="834" height="365" src="/wp-content/uploads/2018/05/word-image-905.png" class="wp-image-1013" srcset="/wp-content/uploads/2018/05/word-image-905.png 834w, /wp-content/uploads/2018/05/word-image-905-300x131.png 300w, /wp-content/uploads/2018/05/word-image-905-768x336.png 768w" sizes="(max-width: 834px) 100vw, 834px" />
</p>
<h2>数据库引擎</h2>
<p>
  什么是数据库引擎：就是数据库保存表数据的一种方式
</p>
<p>
  常用的数据库引擎有 innodb myisam
</p>
<p>
  默认的数据库引擎是innodb
</p>
<p>
  <img loading="lazy" decoding="async" width="1224" height="195" src="/wp-content/uploads/2018/05/word-image-906.png" class="wp-image-1014" srcset="/wp-content/uploads/2018/05/word-image-906.png 1224w, /wp-content/uploads/2018/05/word-image-906-300x48.png 300w, /wp-content/uploads/2018/05/word-image-906-768x122.png 768w, /wp-content/uploads/2018/05/word-image-906-1024x163.png 1024w" sizes="(max-width: 1224px) 100vw, 1224px" />
</p>
<p>
  默认的数据库引擎可以在配置文件中配置
</p>
<p>
  <img loading="lazy" decoding="async" width="874" height="197" src="/wp-content/uploads/2018/05/word-image-907.png" class="wp-image-1015" srcset="/wp-content/uploads/2018/05/word-image-907.png 874w, /wp-content/uploads/2018/05/word-image-907-300x68.png 300w, /wp-content/uploads/2018/05/word-image-907-768x173.png 768w" sizes="(max-width: 874px) 100vw, 874px" />
</p>
<p>
  数据库引擎的支持
</p>
<p>
  <img loading="lazy" decoding="async" width="858" height="534" src="/wp-content/uploads/2018/05/word-image-908.png" class="wp-image-1016" srcset="/wp-content/uploads/2018/05/word-image-908.png 858w, /wp-content/uploads/2018/05/word-image-908-300x187.png 300w, /wp-content/uploads/2018/05/word-image-908-768x478.png 768w" sizes="(max-width: 858px) 100vw, 858px" /></p>
]]></content:encoded>
					
					<wfw:commentRss>/%e6%95%b0%e6%8d%ae%e5%ba%93/mysql/944.html/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Mysql（二）修改表结构、 复制表、 字段类型、 数据类型、 重命名表</title>
		<link>/%e6%95%b0%e6%8d%ae%e5%ba%93/mysql/1018.html</link>
					<comments>/%e6%95%b0%e6%8d%ae%e5%ba%93/mysql/1018.html#respond</comments>
		
		<dc:creator><![CDATA[Mr.Lee]]></dc:creator>
		<pubDate>Thu, 17 May 2018 17:13:09 +0000</pubDate>
				<category><![CDATA[Mysql]]></category>
		<category><![CDATA[修改表结构]]></category>
		<category><![CDATA[复制表]]></category>
		<category><![CDATA[字段类型]]></category>
		<category><![CDATA[数据类型]]></category>
		<category><![CDATA[重命名表]]></category>
		<guid isPermaLink="false">/?p=1018</guid>

					<description><![CDATA[字段类型 扩充： 复制表就是在原有表基础上，把原有的表的东西拿过来创建一个新的数据表 语法：create ta [&#8230;]]]></description>
										<content:encoded><![CDATA[<h1>字段类型</h1>
<p>
  扩充：
</p>
<p>
  复制表就是在原有表基础上，把原有的表的东西拿过来创建一个新的数据表
</p>
<ul>
<li>
    语法：create table 表名 select * from 表名;
  </li>
<li>
    作用:复制表的结构和表内容信息
  </li>
</ul>
<p>
  复制前：
</p>
<p>
  <img loading="lazy" decoding="async" width="955" height="317" src="/wp-content/uploads/2018/05/word-image-909.png" class="wp-image-1019" srcset="/wp-content/uploads/2018/05/word-image-909.png 955w, /wp-content/uploads/2018/05/word-image-909-300x100.png 300w, /wp-content/uploads/2018/05/word-image-909-768x255.png 768w" sizes="(max-width: 955px) 100vw, 955px" />
</p>
<p>
  复制
</p>
<p>
  <img loading="lazy" decoding="async" width="579" height="82" src="/wp-content/uploads/2018/05/word-image-910.png" class="wp-image-1020" srcset="/wp-content/uploads/2018/05/word-image-910.png 579w, /wp-content/uploads/2018/05/word-image-910-300x42.png 300w" sizes="(max-width: 579px) 100vw, 579px" />
</p>
<p>
  复制后
</p>
<p>
  <img loading="lazy" decoding="async" width="866" height="323" src="/wp-content/uploads/2018/05/word-image-911.png" class="wp-image-1021" srcset="/wp-content/uploads/2018/05/word-image-911.png 866w, /wp-content/uploads/2018/05/word-image-911-300x112.png 300w, /wp-content/uploads/2018/05/word-image-911-768x286.png 768w" sizes="(max-width: 866px) 100vw, 866px" />
</p>
<p>
  第二种复制表
</p>
<p>
  语法：create table 表名 like 表名;
</p>
<p>
  作用：只复制表结构，不复制表信息
</p>
<p>
  复制前
</p>
<p>
  <img loading="lazy" decoding="async" width="914" height="320" src="/wp-content/uploads/2018/05/word-image-912.png" class="wp-image-1022" srcset="/wp-content/uploads/2018/05/word-image-912.png 914w, /wp-content/uploads/2018/05/word-image-912-300x105.png 300w, /wp-content/uploads/2018/05/word-image-912-768x269.png 768w" sizes="(max-width: 914px) 100vw, 914px" />
</p>
<p>
  复制
</p>
<p>
  <img loading="lazy" decoding="async" width="525" height="46" src="/wp-content/uploads/2018/05/word-image-913.png" class="wp-image-1023" srcset="/wp-content/uploads/2018/05/word-image-913.png 525w, /wp-content/uploads/2018/05/word-image-913-300x26.png 300w" sizes="(max-width: 525px) 100vw, 525px" />
</p>
<p>
  复制后
</p>
<p>
  <img loading="lazy" decoding="async" width="814" height="244" src="/wp-content/uploads/2018/05/word-image-914.png" class="wp-image-1024" srcset="/wp-content/uploads/2018/05/word-image-914.png 814w, /wp-content/uploads/2018/05/word-image-914-300x90.png 300w, /wp-content/uploads/2018/05/word-image-914-768x230.png 768w" sizes="(max-width: 814px) 100vw, 814px" />
</p>
<h2>数值型</h2>
<h3>整数</h3>
<p>
  <img loading="lazy" decoding="async" width="578" height="350" src="/wp-content/uploads/2018/05/word-image-915.png" class="wp-image-1025" srcset="/wp-content/uploads/2018/05/word-image-915.png 578w, /wp-content/uploads/2018/05/word-image-915-300x182.png 300w" sizes="(max-width: 578px) 100vw, 578px" />
</p>
<p>
  思考？&#8212;一个字节占多少位？&#8212;8位&#8212;&#8211;整形存储占8位&#8212;2*2*2*2*2*2*2*2=256
</p>
<p>
  		Tinyint的范围就是256个这里   -128&#8212;-127 刚好256个数
</p>
<p>
  整形存储的范围和，存储的空间有关系
</p>
<h4>数值范围</h4>
<p>
  <img loading="lazy" decoding="async" width="562" height="106" src="/wp-content/uploads/2018/05/word-image-916.png" class="wp-image-1026" srcset="/wp-content/uploads/2018/05/word-image-916.png 562w, /wp-content/uploads/2018/05/word-image-916-300x57.png 300w" sizes="(max-width: 562px) 100vw, 562px" />
</p>
<p>
  <img loading="lazy" decoding="async" width="759" height="234" src="/wp-content/uploads/2018/05/word-image-917.png" class="wp-image-1027" srcset="/wp-content/uploads/2018/05/word-image-917.png 759w, /wp-content/uploads/2018/05/word-image-917-300x92.png 300w" sizes="(max-width: 759px) 100vw, 759px" />
</p>
<h4>无符号</h4>
<p>
  	Unsigned 只能存储正数，不能存储负数
</p>
<p>
  <img loading="lazy" decoding="async" width="721" height="174" src="/wp-content/uploads/2018/05/word-image-918.png" class="wp-image-1028" srcset="/wp-content/uploads/2018/05/word-image-918.png 721w, /wp-content/uploads/2018/05/word-image-918-300x72.png 300w" sizes="(max-width: 721px) 100vw, 721px" />
</p>
<p>
  注意：无符号没有负数，正数方向范围加倍
</p>
<p>
  <img loading="lazy" decoding="async" width="681" height="274" src="/wp-content/uploads/2018/05/word-image-919.png" class="wp-image-1029" srcset="/wp-content/uploads/2018/05/word-image-919.png 681w, /wp-content/uploads/2018/05/word-image-919-300x121.png 300w" sizes="(max-width: 681px) 100vw, 681px" />
</p>
<h4>显示宽度&amp;零填充</h4>
<p>
  <img loading="lazy" decoding="async" width="919" height="118" src="/wp-content/uploads/2018/05/word-image-920.png" class="wp-image-1030" srcset="/wp-content/uploads/2018/05/word-image-920.png 919w, /wp-content/uploads/2018/05/word-image-920-300x39.png 300w, /wp-content/uploads/2018/05/word-image-920-768x99.png 768w" sizes="(max-width: 919px) 100vw, 919px" />
</p>
<p>
  插入数据：
</p>
<p>
  <img loading="lazy" decoding="async" width="730" height="116" src="/wp-content/uploads/2018/05/word-image-921.png" class="wp-image-1031" srcset="/wp-content/uploads/2018/05/word-image-921.png 730w, /wp-content/uploads/2018/05/word-image-921-300x48.png 300w" sizes="(max-width: 730px) 100vw, 730px" />
</p>
<p>
  显示效果
</p>
<p>
  <img loading="lazy" decoding="async" width="747" height="141" src="/wp-content/uploads/2018/05/word-image-922.png" class="wp-image-1032" srcset="/wp-content/uploads/2018/05/word-image-922.png 747w, /wp-content/uploads/2018/05/word-image-922-300x57.png 300w" sizes="(max-width: 747px) 100vw, 747px" />
</p>
<p>
  注意：
</p>
<ul>
<li>
    显示长度和零填充一块使用才有效果；
  </li>
<li>
    当插入数据的长度大于显示长度的话
  </li>
</ul>
<p>
  <img loading="lazy" decoding="async" width="724" height="250" src="/wp-content/uploads/2018/05/word-image-923.png" class="wp-image-1033" srcset="/wp-content/uploads/2018/05/word-image-923.png 724w, /wp-content/uploads/2018/05/word-image-923-300x104.png 300w" sizes="(max-width: 724px) 100vw, 724px" />
</p>
<h3>小数</h3>
<p>
  浮点型
</p>
<p>
  <img loading="lazy" decoding="async" width="1010" height="246" src="/wp-content/uploads/2018/05/word-image-924.png" class="wp-image-1034" srcset="/wp-content/uploads/2018/05/word-image-924.png 1010w, /wp-content/uploads/2018/05/word-image-924-300x73.png 300w, /wp-content/uploads/2018/05/word-image-924-768x187.png 768w" sizes="(max-width: 1010px) 100vw, 1010px" />
</p>
<h4>Float</h4>
<p>
  	单精度浮点型
</p>
<p>
  这个float一般在数据类型中不使用，因为有误差；
</p>
<ul>
<li>
    误差问题测试案例
  </li>
</ul>
<p>
  <img loading="lazy" decoding="async" width="664" height="121" src="/wp-content/uploads/2018/05/word-image-925.png" class="wp-image-1035" srcset="/wp-content/uploads/2018/05/word-image-925.png 664w, /wp-content/uploads/2018/05/word-image-925-300x55.png 300w" sizes="(max-width: 664px) 100vw, 664px" />
</p>
<p>
  <img loading="lazy" decoding="async" width="683" height="199" src="/wp-content/uploads/2018/05/word-image-926.png" class="wp-image-1036" srcset="/wp-content/uploads/2018/05/word-image-926.png 683w, /wp-content/uploads/2018/05/word-image-926-300x87.png 300w" sizes="(max-width: 683px) 100vw, 683px" />
</p>
<p>
  <img loading="lazy" decoding="async" width="604" height="227" src="/wp-content/uploads/2018/05/word-image-927.png" class="wp-image-1037" srcset="/wp-content/uploads/2018/05/word-image-927.png 604w, /wp-content/uploads/2018/05/word-image-927-300x113.png 300w" sizes="(max-width: 604px) 100vw, 604px" />
</p>
<p>
  误差的原因&#8212;-MySQL内部存储计算使用的都是double类型
</p>
<h4>Double</h4>
<p>
  <img loading="lazy" decoding="async" width="666" height="113" src="/wp-content/uploads/2018/05/word-image-928.png" class="wp-image-1038" srcset="/wp-content/uploads/2018/05/word-image-928.png 666w, /wp-content/uploads/2018/05/word-image-928-300x51.png 300w" sizes="(max-width: 666px) 100vw, 666px" />
</p>
<p>
  <img loading="lazy" decoding="async" width="807" height="163" src="/wp-content/uploads/2018/05/word-image-929.png" class="wp-image-1039" srcset="/wp-content/uploads/2018/05/word-image-929.png 807w, /wp-content/uploads/2018/05/word-image-929-300x61.png 300w, /wp-content/uploads/2018/05/word-image-929-768x155.png 768w" sizes="(max-width: 807px) 100vw, 807px" />
</p>
<p>
  <img loading="lazy" decoding="async" width="855" height="191" src="/wp-content/uploads/2018/05/word-image-930.png" class="wp-image-1040" srcset="/wp-content/uploads/2018/05/word-image-930.png 855w, /wp-content/uploads/2018/05/word-image-930-300x67.png 300w, /wp-content/uploads/2018/05/word-image-930-768x172.png 768w" sizes="(max-width: 855px) 100vw, 855px" />
</p>
<ul>
<li>
    无符号问题测试案例
  </li>
</ul>
<p>
  Unsigned 无符号，也就是不能插入负数
</p>
<p>
  <img loading="lazy" decoding="async" width="831" height="187" src="/wp-content/uploads/2018/05/word-image-931.png" class="wp-image-1041" srcset="/wp-content/uploads/2018/05/word-image-931.png 831w, /wp-content/uploads/2018/05/word-image-931-300x68.png 300w, /wp-content/uploads/2018/05/word-image-931-768x173.png 768w" sizes="(max-width: 831px) 100vw, 831px" />
</p>
<ul>
<li>
    设置显示宽度
  </li>
</ul>
<p>
  			create table 表名
</p>
<p>
  			(
</p>
<p>
  				num double(m,d)
</p>
<p>
  				&#8212; m是可以显示的总字符长度，d显示的是可以显示几个小数字符
</p>
<p>
  			)charset=utf8;
</p>
<p>
  <img loading="lazy" decoding="async" width="829" height="108" src="/wp-content/uploads/2018/05/word-image-932.png" class="wp-image-1042" srcset="/wp-content/uploads/2018/05/word-image-932.png 829w, /wp-content/uploads/2018/05/word-image-932-300x39.png 300w, /wp-content/uploads/2018/05/word-image-932-768x100.png 768w" sizes="(max-width: 829px) 100vw, 829px" />
</p>
<ul>
<li>
    如果插入的数据的小数长度唱过了设置的d小数的显示长度1位，那么把超出的部分直接去掉
  </li>
</ul>
<p>
  <img loading="lazy" decoding="async" width="841" height="182" src="/wp-content/uploads/2018/05/word-image-933.png" class="wp-image-1043" srcset="/wp-content/uploads/2018/05/word-image-933.png 841w, /wp-content/uploads/2018/05/word-image-933-300x65.png 300w, /wp-content/uploads/2018/05/word-image-933-768x166.png 768w" sizes="(max-width: 841px) 100vw, 841px" />
</p>
<ul>
<li>
    果插入的数据的小数长度唱过了设置的d小数的显示长度1位以上，会四舍五入
  </li>
</ul>
<p>
  <img loading="lazy" decoding="async" width="764" height="221" src="/wp-content/uploads/2018/05/word-image-934.png" class="wp-image-1044" srcset="/wp-content/uploads/2018/05/word-image-934.png 764w, /wp-content/uploads/2018/05/word-image-934-300x87.png 300w" sizes="(max-width: 764px) 100vw, 764px" />
</p>
<ul>
<li>
    如果整数的显示长度超过了m – d(减号)，那么会直接报错，范围超出的错误
  </li>
</ul>
<p>
  <img loading="lazy" decoding="async" width="874" height="48" src="/wp-content/uploads/2018/05/word-image-935.png" class="wp-image-1045" srcset="/wp-content/uploads/2018/05/word-image-935.png 874w, /wp-content/uploads/2018/05/word-image-935-300x16.png 300w, /wp-content/uploads/2018/05/word-image-935-768x42.png 768w" sizes="(max-width: 874px) 100vw, 874px" />
</p>
<p>
  零填充
</p>
<p>
  	Zerofill—当显示的长度不够设置的长度的时候在左侧补0占位显示；
</p>
<p>
  创建表
</p>
<p>
  <img loading="lazy" decoding="async" width="926" height="111" src="/wp-content/uploads/2018/05/word-image-936.png" class="wp-image-1046" srcset="/wp-content/uploads/2018/05/word-image-936.png 926w, /wp-content/uploads/2018/05/word-image-936-300x36.png 300w, /wp-content/uploads/2018/05/word-image-936-768x92.png 768w" sizes="(max-width: 926px) 100vw, 926px" />
</p>
<p>
  <img loading="lazy" decoding="async" width="816" height="221" src="/wp-content/uploads/2018/05/word-image-937.png" class="wp-image-1047" srcset="/wp-content/uploads/2018/05/word-image-937.png 816w, /wp-content/uploads/2018/05/word-image-937-300x81.png 300w, /wp-content/uploads/2018/05/word-image-937-768x208.png 768w" sizes="(max-width: 816px) 100vw, 816px" />
</p>
<p>
  注意：这里如果有zerofill零填充会把小数点算一个长度
</p>
<ul>
<li>
    默认精度就是默认的显示长度
  </li>
</ul>
<p>
  Float和double是没有默认精度的
</p>
<p>
  <img loading="lazy" decoding="async" width="923" height="288" src="/wp-content/uploads/2018/05/word-image-938.png" class="wp-image-1048" srcset="/wp-content/uploads/2018/05/word-image-938.png 923w, /wp-content/uploads/2018/05/word-image-938-300x94.png 300w, /wp-content/uploads/2018/05/word-image-938-768x240.png 768w" sizes="(max-width: 923px) 100vw, 923px" /><br />
  <img loading="lazy" decoding="async" width="1085" height="278" src="/wp-content/uploads/2018/05/word-image-939.png" class="wp-image-1049" srcset="/wp-content/uploads/2018/05/word-image-939.png 1085w, /wp-content/uploads/2018/05/word-image-939-300x77.png 300w, /wp-content/uploads/2018/05/word-image-939-768x197.png 768w, /wp-content/uploads/2018/05/word-image-939-1024x262.png 1024w" sizes="(max-width: 1085px) 100vw, 1085px" />
</p>
<p>
  但是有一个类型是有默认精度的就是decimal小数类型
</p>
<p>
  <img loading="lazy" decoding="async" width="817" height="282" src="/wp-content/uploads/2018/05/word-image-940.png" class="wp-image-1050" srcset="/wp-content/uploads/2018/05/word-image-940.png 817w, /wp-content/uploads/2018/05/word-image-940-300x104.png 300w, /wp-content/uploads/2018/05/word-image-940-768x265.png 768w" sizes="(max-width: 817px) 100vw, 817px" />
</p>
<p>
  定点型
</p>
<p>
  	Decimal比较准确，一般在存储关于钱的数据的时候都使用decimal
</p>
<p>
  Decimal的默认精度是（10,0）;
</p>
<p>
  案例：
</p>
<p>
  表结构创建
</p>
<p>
  <img loading="lazy" decoding="async" width="752" height="122" src="/wp-content/uploads/2018/05/word-image-941.png" class="wp-image-1051" srcset="/wp-content/uploads/2018/05/word-image-941.png 752w, /wp-content/uploads/2018/05/word-image-941-300x49.png 300w" sizes="(max-width: 752px) 100vw, 752px" />
</p>
<p>
  数据测试
</p>
<p>
  <img loading="lazy" decoding="async" width="796" height="70" src="/wp-content/uploads/2018/05/word-image-942.png" class="wp-image-1052" srcset="/wp-content/uploads/2018/05/word-image-942.png 796w, /wp-content/uploads/2018/05/word-image-942-300x26.png 300w, /wp-content/uploads/2018/05/word-image-942-768x68.png 768w" sizes="(max-width: 796px) 100vw, 796px" />
</p>
<p>
  <img loading="lazy" decoding="async" width="725" height="208" src="/wp-content/uploads/2018/05/word-image-943.png" class="wp-image-1053" srcset="/wp-content/uploads/2018/05/word-image-943.png 725w, /wp-content/uploads/2018/05/word-image-943-300x86.png 300w" sizes="(max-width: 725px) 100vw, 725px" />
</p>
<h3>总结</h3>
<p>
  Float和double的比较
</p>
<p>
  	精度方面：float有误差，double存储没有误差，因为数据库存储计算的时候使用的就是double类型
</p>
<p>
  Decimal和float的标准
</p>
<p>
  	四舍五入方面
</p>
<p>
  		Float;如果小数长度超过了设置长度的1位&#8212;直接舍去，如果超过了一位以上四舍五入
</p>
<p>
  		Decimal: 如果小数长度超过了设置的长度直接四舍五入
</p>
<p>
  通常如果这个小数类型是用来存储钱的时候就用decimal
</p>
<h2>字符串型</h2>
<p>
  <img loading="lazy" decoding="async" width="886" height="263" src="/wp-content/uploads/2018/05/word-image-944.png" class="wp-image-1054" srcset="/wp-content/uploads/2018/05/word-image-944.png 886w, /wp-content/uploads/2018/05/word-image-944-300x89.png 300w, /wp-content/uploads/2018/05/word-image-944-768x228.png 768w" sizes="(max-width: 886px) 100vw, 886px" />
</p>
<ul>
<li>
    在utf8编码中一个字符占用3个字节
  </li>
<li>
    在gbk编码中一个字符占用2个字节
  </li>
</ul>
<h3>Char</h3>
<p>
  Char是一个定长的最多能存储255个字符
</p>
<ul>
<li>
    插入时，字符串长度问题
  </li>
</ul>
<p>
  <img loading="lazy" decoding="async" width="782" height="315" src="/wp-content/uploads/2018/05/word-image-945.png" class="wp-image-1055" srcset="/wp-content/uploads/2018/05/word-image-945.png 782w, /wp-content/uploads/2018/05/word-image-945-300x121.png 300w, /wp-content/uploads/2018/05/word-image-945-768x309.png 768w" sizes="(max-width: 782px) 100vw, 782px" />
</p>
<p>
  <img loading="lazy" decoding="async" width="741" height="113" src="/wp-content/uploads/2018/05/word-image-946.png" class="wp-image-1056" srcset="/wp-content/uploads/2018/05/word-image-946.png 741w, /wp-content/uploads/2018/05/word-image-946-300x46.png 300w" sizes="(max-width: 741px) 100vw, 741px" />
</p>
<p>
  <img loading="lazy" decoding="async" width="744" height="63" src="/wp-content/uploads/2018/05/word-image-947.png" class="wp-image-1057" srcset="/wp-content/uploads/2018/05/word-image-947.png 744w, /wp-content/uploads/2018/05/word-image-947-300x25.png 300w" sizes="(max-width: 744px) 100vw, 744px" />
</p>
<ul>
<li>
    自动填充空格的问题
  </li>
</ul>
<p>
  <img loading="lazy" decoding="async" width="767" height="115" src="/wp-content/uploads/2018/05/word-image-948.png" class="wp-image-1058" srcset="/wp-content/uploads/2018/05/word-image-948.png 767w, /wp-content/uploads/2018/05/word-image-948-300x45.png 300w" sizes="(max-width: 767px) 100vw, 767px" />
</p>
<p>
  插入数据
</p>
<p>
  	插入7个长度的字符串
</p>
<p>
  <img loading="lazy" decoding="async" width="626" height="65" src="/wp-content/uploads/2018/05/word-image-949.png" class="wp-image-1059" srcset="/wp-content/uploads/2018/05/word-image-949.png 626w, /wp-content/uploads/2018/05/word-image-949-300x31.png 300w" sizes="(max-width: 626px) 100vw, 626px" />
</p>
<p>
  	插入10个长度的字符串
</p>
<p>
  <img loading="lazy" decoding="async" width="588" height="56" src="/wp-content/uploads/2018/05/word-image-950.png" class="wp-image-1060" srcset="/wp-content/uploads/2018/05/word-image-950.png 588w, /wp-content/uploads/2018/05/word-image-950-300x29.png 300w" sizes="(max-width: 588px) 100vw, 588px" />
</p>
<p>
  查看结果
</p>
<p>
  <img loading="lazy" decoding="async" width="802" height="134" src="/wp-content/uploads/2018/05/word-image-951.png" class="wp-image-1061" srcset="/wp-content/uploads/2018/05/word-image-951.png 802w, /wp-content/uploads/2018/05/word-image-951-300x50.png 300w, /wp-content/uploads/2018/05/word-image-951-768x128.png 768w" sizes="(max-width: 802px) 100vw, 802px" />
</p>
<h3>Varchar</h3>
<p>
  Varchar:可变字符类型，这里如果插入的字符不够设置的长度，会自动回收多于的空间
</p>
<p>
  		存储时以字节存储，会受到字符编码的影响 最多存储65535个字节
</p>
<p>
  		create table num12
</p>
<p>
  		(
</p>
<p>
  			name varchar()  &#8212; 这里规定的可以显示的字符长度  一个字符占3个字节
</p>
<p>
  						   &#8212; 计算这里括号里最多可以设置多长  65535字节/3=2万多个字符
</p>
<p>
  		)charset=utf8
</p>
<p>
  	Utf8中一个字符占3个字节
</p>
<p>
  <img loading="lazy" decoding="async" width="994" height="171" src="/wp-content/uploads/2018/05/word-image-952.png" class="wp-image-1062" srcset="/wp-content/uploads/2018/05/word-image-952.png 994w, /wp-content/uploads/2018/05/word-image-952-300x52.png 300w, /wp-content/uploads/2018/05/word-image-952-768x132.png 768w" sizes="(max-width: 994px) 100vw, 994px" />
</p>
<p>
  	Gbk中一个字符占2个字节
</p>
<p>
  <img loading="lazy" decoding="async" width="1014" height="134" src="/wp-content/uploads/2018/05/word-image-953.png" class="wp-image-1063" srcset="/wp-content/uploads/2018/05/word-image-953.png 1014w, /wp-content/uploads/2018/05/word-image-953-300x40.png 300w, /wp-content/uploads/2018/05/word-image-953-768x101.png 768w" sizes="(max-width: 1014px) 100vw, 1014px" />
</p>
<p>
  案例：
</p>
<p>
  <img loading="lazy" decoding="async" width="735" height="177" src="/wp-content/uploads/2018/05/word-image-954.png" class="wp-image-1064" srcset="/wp-content/uploads/2018/05/word-image-954.png 735w, /wp-content/uploads/2018/05/word-image-954-300x72.png 300w" sizes="(max-width: 735px) 100vw, 735px" />
</p>
<p>
  Char和varchar的比较
</p>
<ul>
<li>
    Char是定长，之规定存储多少字符，也是按照字符的个数来存储的,如果存储的字符少于规定的长度，多于的空间不能自动回收
  </li>
<li>
    Varchar 是变长（不够设置的长度的话会自动的回收多于的空间），以字节来存的，但是<strong>varchar(20)规定的是最多存储20个字符</strong>
  </li>
</ul>
<p>
  什么时候使用char ,什么时候使用varchar
</p>
<p>
  问题：手机号存用什么存？
</p>
<p>
  	用char（定长）来存，手机号是固定的长度，都是11位
</p>
<p>
  问题：新闻标题用什么存？
</p>
<p>
  	新闻标题字符数不确定，用varchar来存
</p>
<p>
  Char 会浪费空间，执行效率高
</p>
<p>
  Varchar 节省空间，执行效率低
</p>
<h3>Set</h3>
<p>
  在MySQL中是一个多选类型，存储的是字符串，用途是供用户来选择，用户插入的值只能从set选项里边来插入
</p>
<p>
  <img loading="lazy" decoding="async" width="593" height="82" src="/wp-content/uploads/2018/05/word-image-955.png" class="wp-image-1065" srcset="/wp-content/uploads/2018/05/word-image-955.png 593w, /wp-content/uploads/2018/05/word-image-955-300x41.png 300w" sizes="(max-width: 593px) 100vw, 593px" />
</p>
<p>
  <img loading="lazy" decoding="async" width="679" height="169" src="/wp-content/uploads/2018/05/word-image-956.png" class="wp-image-1066" srcset="/wp-content/uploads/2018/05/word-image-956.png 679w, /wp-content/uploads/2018/05/word-image-956-300x75.png 300w" sizes="(max-width: 679px) 100vw, 679px" />
</p>
<p>
  <img loading="lazy" decoding="async" width="909" height="70" src="/wp-content/uploads/2018/05/word-image-957.png" class="wp-image-1067" srcset="/wp-content/uploads/2018/05/word-image-957.png 909w, /wp-content/uploads/2018/05/word-image-957-300x23.png 300w, /wp-content/uploads/2018/05/word-image-957-768x59.png 768w" sizes="(max-width: 909px) 100vw, 909px" />
</p>
<p>
  扩展：set 在MySQL底层计算的时候是以整数来计算的
</p>
<p>
  sex set(&#8216;男&#8217;,&#8217;女&#8217;,&#8217;保密&#8217;)
</p>
<p>
  这里第一个值是   男&#8212;-1&#8212;2的0次方
</p>
<p>
  这里第二个值是   女&#8212;-2&#8212;2的1次方
</p>
<p>
  这里第三个值是    保密&#8212;4&#8212;2的2次方
</p>
<p>
  所以在插入数据的时候我们还可以以整数的形式进行插入
</p>
<p>
  表结构
</p>
<p>
  <img loading="lazy" decoding="async" width="640" height="114" src="/wp-content/uploads/2018/05/word-image-958.png" class="wp-image-1068" srcset="/wp-content/uploads/2018/05/word-image-958.png 640w, /wp-content/uploads/2018/05/word-image-958-300x53.png 300w" sizes="(max-width: 640px) 100vw, 640px" />
</p>
<p>
  插入数据
</p>
<p>
  <img loading="lazy" decoding="async" width="701" height="180" src="/wp-content/uploads/2018/05/word-image-959.png" class="wp-image-1069" srcset="/wp-content/uploads/2018/05/word-image-959.png 701w, /wp-content/uploads/2018/05/word-image-959-300x77.png 300w" sizes="(max-width: 701px) 100vw, 701px" />
</p>
<p>
  <img loading="lazy" decoding="async" width="833" height="197" src="/wp-content/uploads/2018/05/word-image-960.png" class="wp-image-1070" srcset="/wp-content/uploads/2018/05/word-image-960.png 833w, /wp-content/uploads/2018/05/word-image-960-300x71.png 300w, /wp-content/uploads/2018/05/word-image-960-768x182.png 768w" sizes="(max-width: 833px) 100vw, 833px" />
</p>
<p>
  <img loading="lazy" decoding="async" width="718" height="230" src="/wp-content/uploads/2018/05/word-image-961.png" class="wp-image-1071" srcset="/wp-content/uploads/2018/05/word-image-961.png 718w, /wp-content/uploads/2018/05/word-image-961-300x96.png 300w" sizes="(max-width: 718px) 100vw, 718px" />
</p>
<h3>Enum</h3>
<p>
  单选，单选的值是以字符串来保存的，内计算的时候是以整形来计算，所以单选的执行效率比较高
</p>
<p>
  表结构
</p>
<p>
  <img loading="lazy" decoding="async" width="709" height="112" src="/wp-content/uploads/2018/05/word-image-962.png" class="wp-image-1072" srcset="/wp-content/uploads/2018/05/word-image-962.png 709w, /wp-content/uploads/2018/05/word-image-962-300x47.png 300w" sizes="(max-width: 709px) 100vw, 709px" />
</p>
<p>
  插入数据
</p>
<p>
  <img loading="lazy" decoding="async" width="953" height="176" src="/wp-content/uploads/2018/05/word-image-963.png" class="wp-image-1073" srcset="/wp-content/uploads/2018/05/word-image-963.png 953w, /wp-content/uploads/2018/05/word-image-963-300x55.png 300w, /wp-content/uploads/2018/05/word-image-963-768x142.png 768w" sizes="(max-width: 953px) 100vw, 953px" />
</p>
<p>
  <img loading="lazy" decoding="async" width="864" height="65" src="/wp-content/uploads/2018/05/word-image-964.png" class="wp-image-1074" srcset="/wp-content/uploads/2018/05/word-image-964.png 864w, /wp-content/uploads/2018/05/word-image-964-300x23.png 300w, /wp-content/uploads/2018/05/word-image-964-768x58.png 768w" sizes="(max-width: 864px) 100vw, 864px" />
</p>
<p>
  扩展enum也可以用数字来插入
</p>
<p>
  	enum中有三个值
</p>
<p>
  		第一个是 男&#8212;-1
</p>
<p>
  		第二个是 女&#8212;-2
</p>
<p>
  		第三个是 保密&#8212;-3
</p>
<p>
  <img loading="lazy" decoding="async" width="709" height="112" src="/wp-content/uploads/2018/05/word-image-965.png" class="wp-image-1075" srcset="/wp-content/uploads/2018/05/word-image-965.png 709w, /wp-content/uploads/2018/05/word-image-965-300x47.png 300w" sizes="(max-width: 709px) 100vw, 709px" />
</p>
<p>
  <img loading="lazy" decoding="async" width="783" height="215" src="/wp-content/uploads/2018/05/word-image-966.png" class="wp-image-1076" srcset="/wp-content/uploads/2018/05/word-image-966.png 783w, /wp-content/uploads/2018/05/word-image-966-300x82.png 300w, /wp-content/uploads/2018/05/word-image-966-768x211.png 768w" sizes="(max-width: 783px) 100vw, 783px" />
</p>
<p>
  <img loading="lazy" decoding="async" width="638" height="210" src="/wp-content/uploads/2018/05/word-image-967.png" class="wp-image-1077" srcset="/wp-content/uploads/2018/05/word-image-967.png 638w, /wp-content/uploads/2018/05/word-image-967-300x99.png 300w" sizes="(max-width: 638px) 100vw, 638px" />
</p>
<p>
  <img loading="lazy" decoding="async" width="862" height="217" src="/wp-content/uploads/2018/05/word-image-968.png" class="wp-image-1078" srcset="/wp-content/uploads/2018/05/word-image-968.png 862w, /wp-content/uploads/2018/05/word-image-968-300x76.png 300w, /wp-content/uploads/2018/05/word-image-968-768x193.png 768w" sizes="(max-width: 862px) 100vw, 862px" />
</p>
<p>
  <img loading="lazy" decoding="async" width="861" height="62" src="/wp-content/uploads/2018/05/word-image-969.png" class="wp-image-1079" srcset="/wp-content/uploads/2018/05/word-image-969.png 861w, /wp-content/uploads/2018/05/word-image-969-300x22.png 300w, /wp-content/uploads/2018/05/word-image-969-768x55.png 768w" sizes="(max-width: 861px) 100vw, 861px" />
</p>
<p>
  第一个值就是1，第二个值就是2，第三个值就是3，第四个值就是4；
</p>
<p>
  注意：单选每次只能插入一个值
</p>
<h3>比较set和enum的区别和相同点</h3>
<p>
  不同的地方
</p>
<ul>
<li>
<ul>
<li>
        Set每次可以插入多个选项的值   Enum每次只能插入一个选项的值
      </li>
<li>
        Set用整数插入的时候 第一个选项的值2的0次方 第二个值是2的1次方…   Enum用整数插入的时候，第一个选项的是是1，第二个选项的值是2，第三个选项的设置是3
      </li>
<li>
        Set 可以用整数的和代表几个选项，比如  3=2的零次方+2的一次方  = 男,女
      </li>
</ul>
</li>
</ul>
<p>
  相同的地方
</p>
<ul>
<li>
    Set和enum底层计算都是用整数来计算，插入的时候都可以使用整数来插入
  </li>
</ul>
<h2>时间型</h2>
<p>
  这个类型不常用，一般存储时间的我们用int
</p>
<p>
  <img loading="lazy" decoding="async" width="1149" height="248" src="/wp-content/uploads/2018/05/word-image-970.png" class="wp-image-1080" srcset="/wp-content/uploads/2018/05/word-image-970.png 1149w, /wp-content/uploads/2018/05/word-image-970-300x65.png 300w, /wp-content/uploads/2018/05/word-image-970-768x166.png 768w, /wp-content/uploads/2018/05/word-image-970-1024x221.png 1024w" sizes="(max-width: 1149px) 100vw, 1149px" />
</p>
<p>
  这里datetime和timestamp类型比较相似，最大的区别就是取值范围不一样
</p>
<p>
  时间类型插入的时间格式（注意插入的时候时间用引号引起来）
</p>
<p>
  <img loading="lazy" decoding="async" width="355" height="75" src="/wp-content/uploads/2018/05/word-image-971.png" class="wp-image-1081" srcset="/wp-content/uploads/2018/05/word-image-971.png 355w, /wp-content/uploads/2018/05/word-image-971-300x63.png 300w" sizes="(max-width: 355px) 100vw, 355px" />
</p>
<p>
  案例使用
</p>
<p>
  	表结构
</p>
<p>  <img loading="lazy" decoding="async" width="660" height="186" src="/wp-content/uploads/2018/05/word-image-972.png" class="wp-image-1082" srcset="/wp-content/uploads/2018/05/word-image-972.png 660w, /wp-content/uploads/2018/05/word-image-972-300x85.png 300w" sizes="(max-width: 660px) 100vw, 660px" />
</p>
<p>
  插入数据时间格式1
</p>
<p>
  <img loading="lazy" decoding="async" width="1126" height="195" src="/wp-content/uploads/2018/05/word-image-973.png" class="wp-image-1083" srcset="/wp-content/uploads/2018/05/word-image-973.png 1126w, /wp-content/uploads/2018/05/word-image-973-300x52.png 300w, /wp-content/uploads/2018/05/word-image-973-768x133.png 768w, /wp-content/uploads/2018/05/word-image-973-1024x177.png 1024w" sizes="(max-width: 1126px) 100vw, 1126px" />
</p>
<p>
  插入的时间格式2
</p>
<p>
  <img loading="lazy" decoding="async" width="1106" height="215" src="/wp-content/uploads/2018/05/word-image-974.png" class="wp-image-1084" srcset="/wp-content/uploads/2018/05/word-image-974.png 1106w, /wp-content/uploads/2018/05/word-image-974-300x58.png 300w, /wp-content/uploads/2018/05/word-image-974-768x149.png 768w, /wp-content/uploads/2018/05/word-image-974-1024x199.png 1024w" sizes="(max-width: 1106px) 100vw, 1106px" />
</p>
<p>
  插入的时间格式3
</p>
<p>
  <img loading="lazy" decoding="async" width="1142" height="258" src="/wp-content/uploads/2018/05/word-image-975.png" class="wp-image-1085" srcset="/wp-content/uploads/2018/05/word-image-975.png 1142w, /wp-content/uploads/2018/05/word-image-975-300x68.png 300w, /wp-content/uploads/2018/05/word-image-975-768x174.png 768w, /wp-content/uploads/2018/05/word-image-975-1024x231.png 1024w" sizes="(max-width: 1142px) 100vw, 1142px" />
</p>
<h1>字段属性</h1>
<h2>Not null /null</h2>
<p>
  含义:限制字段值是否是null
</p>
<p>
  	Not null&#8212;-限制字段值不能为null
</p>
<p>
  	Null&#8212;&#8212;字段值允许为 null
</p>
<p>
  这里 空字符串 等于null 吗？  0等于 null吗？ 不全等
</p>
<p>
  <img loading="lazy" decoding="async" width="593" height="122" src="/wp-content/uploads/2018/05/word-image-976.png" class="wp-image-1086" srcset="/wp-content/uploads/2018/05/word-image-976.png 593w, /wp-content/uploads/2018/05/word-image-976-300x62.png 300w" sizes="(max-width: 593px) 100vw, 593px" />
</p>
<p>
  <img loading="lazy" decoding="async" width="710" height="53" src="/wp-content/uploads/2018/05/word-image-977.png" class="wp-image-1087" srcset="/wp-content/uploads/2018/05/word-image-977.png 710w, /wp-content/uploads/2018/05/word-image-977-300x22.png 300w" sizes="(max-width: 710px) 100vw, 710px" />
</p>
<p>
  <img loading="lazy" decoding="async" width="726" height="120" src="/wp-content/uploads/2018/05/word-image-978.png" class="wp-image-1088" srcset="/wp-content/uploads/2018/05/word-image-978.png 726w, /wp-content/uploads/2018/05/word-image-978-300x50.png 300w" sizes="(max-width: 726px) 100vw, 726px" />
</p>
<p>
  <img loading="lazy" decoding="async" width="715" height="317" src="/wp-content/uploads/2018/05/word-image-979.png" class="wp-image-1089" srcset="/wp-content/uploads/2018/05/word-image-979.png 715w, /wp-content/uploads/2018/05/word-image-979-300x133.png 300w" sizes="(max-width: 715px) 100vw, 715px" />
</p>
<h2>Comment</h2>
<p>
  	一个字段的说明
</p>
<h2>Auto_increment &amp;&amp;Primary key</h2>
<p>
  <img loading="lazy" decoding="async" width="896" height="344" src="/wp-content/uploads/2018/05/word-image-980.png" class="wp-image-1090" srcset="/wp-content/uploads/2018/05/word-image-980.png 896w, /wp-content/uploads/2018/05/word-image-980-300x115.png 300w, /wp-content/uploads/2018/05/word-image-980-768x295.png 768w" sizes="(max-width: 896px) 100vw, 896px" />
</p>
<p>
  <img loading="lazy" decoding="async" width="671" height="216" src="/wp-content/uploads/2018/05/word-image-981.png" class="wp-image-1091" srcset="/wp-content/uploads/2018/05/word-image-981.png 671w, /wp-content/uploads/2018/05/word-image-981-300x97.png 300w" sizes="(max-width: 671px) 100vw, 671px" />
</p>
<p>
  <img loading="lazy" decoding="async" width="715" height="203" src="/wp-content/uploads/2018/05/word-image-982.png" class="wp-image-1092" srcset="/wp-content/uploads/2018/05/word-image-982.png 715w, /wp-content/uploads/2018/05/word-image-982-300x85.png 300w" sizes="(max-width: 715px) 100vw, 715px" />
</p>
<p>
  	Auto_increment：自动增长，用于整形，每次默认自动加1
</p>
<p>
  <img loading="lazy" decoding="async" width="1156" height="134" src="/wp-content/uploads/2018/05/word-image-983.png" class="wp-image-1093" srcset="/wp-content/uploads/2018/05/word-image-983.png 1156w, /wp-content/uploads/2018/05/word-image-983-300x35.png 300w, /wp-content/uploads/2018/05/word-image-983-768x89.png 768w, /wp-content/uploads/2018/05/word-image-983-1024x119.png 1024w" sizes="(max-width: 1156px) 100vw, 1156px" />
</p>
<p>
  	Primary key : 就是能唯一确定一行（记录）的字段，说白了就是一个‘<strong>身份证号</strong>‘
</p>
<p>
  总结：主键字段一般和auto_increment 连用，自动增长，
</p>
<p>
  		设置过主键和自动增长的字段表属性里会多增加一个属性AUTO_INCREMENT
</p>
<p>
  <img loading="lazy" decoding="async" width="784" height="193" src="/wp-content/uploads/2018/05/word-image-984.png" class="wp-image-1094" srcset="/wp-content/uploads/2018/05/word-image-984.png 784w, /wp-content/uploads/2018/05/word-image-984-300x74.png 300w, /wp-content/uploads/2018/05/word-image-984-768x189.png 768w" sizes="(max-width: 784px) 100vw, 784px" />
</p>
<p>
  用来表示下一次插入记录的时候，主键的值；如果主键的值是null那么就会使用表属性里边自动增长的值
</p>
<ul>
<li>
    表属性自动增长的值是表最大的主键值加1
  </li>
</ul>
<p>
  <img loading="lazy" decoding="async" width="666" height="237" src="/wp-content/uploads/2018/05/word-image-985.png" class="wp-image-1095" srcset="/wp-content/uploads/2018/05/word-image-985.png 666w, /wp-content/uploads/2018/05/word-image-985-300x107.png 300w" sizes="(max-width: 666px) 100vw, 666px" />
</p>
<p>
  <img loading="lazy" decoding="async" width="1117" height="179" src="/wp-content/uploads/2018/05/word-image-986.png" class="wp-image-1096" srcset="/wp-content/uploads/2018/05/word-image-986.png 1117w, /wp-content/uploads/2018/05/word-image-986-300x48.png 300w, /wp-content/uploads/2018/05/word-image-986-768x123.png 768w, /wp-content/uploads/2018/05/word-image-986-1024x164.png 1024w" sizes="(max-width: 1117px) 100vw, 1117px" />
</p>
<ul>
<li>
    主键能重复吗
  </li>
</ul>
<p>
  <img loading="lazy" decoding="async" width="863" height="270" src="/wp-content/uploads/2018/05/word-image-987.png" class="wp-image-1097" srcset="/wp-content/uploads/2018/05/word-image-987.png 863w, /wp-content/uploads/2018/05/word-image-987-300x94.png 300w, /wp-content/uploads/2018/05/word-image-987-768x240.png 768w" sizes="(max-width: 863px) 100vw, 863px" />
</p>
<h2>Unique key </h2>
<p>
  	含义：字段的值不能重复
</p>
<p>
  测试：
</p>
<p>
  <img loading="lazy" decoding="async" width="774" height="139" src="/wp-content/uploads/2018/05/word-image-988.png" class="wp-image-1098" srcset="/wp-content/uploads/2018/05/word-image-988.png 774w, /wp-content/uploads/2018/05/word-image-988-300x54.png 300w, /wp-content/uploads/2018/05/word-image-988-768x138.png 768w" sizes="(max-width: 774px) 100vw, 774px" />
</p>
<p>
  <img loading="lazy" decoding="async" width="822" height="270" src="/wp-content/uploads/2018/05/word-image-989.png" class="wp-image-1099" srcset="/wp-content/uploads/2018/05/word-image-989.png 822w, /wp-content/uploads/2018/05/word-image-989-300x99.png 300w, /wp-content/uploads/2018/05/word-image-989-768x252.png 768w" sizes="(max-width: 822px) 100vw, 822px" />
</p>
<p>
  一般unique key会自动的加一个默认值是 null
</p>
<p>
  这个null的含义就是’没有值’,多以唯一键一般都会加一个not null字段属性
</p>
<p>
  <img loading="lazy" decoding="async" width="773" height="252" src="/wp-content/uploads/2018/05/word-image-990.png" class="wp-image-1100" srcset="/wp-content/uploads/2018/05/word-image-990.png 773w, /wp-content/uploads/2018/05/word-image-990-300x98.png 300w, /wp-content/uploads/2018/05/word-image-990-768x250.png 768w" sizes="(max-width: 773px) 100vw, 773px" />
</p>
<h2>Default（一般不单独使用）</h2>
<p>
    含义：如果添加数据的时候没有给值，会自动用设置的默认值填充；一般和not null 连用
</p>
<p>
  create table test20
</p>
<p>
  (
</p>
<p>
  	id int primary key auto_increment,
</p>
<p>
  	name char(8) unique key not null default &#8216;a&#8217;
</p>
<p>
  ) charset = utf8;
</p>
<p>
  <img loading="lazy" decoding="async" width="520" height="47" src="/wp-content/uploads/2018/05/word-image-991.png" class="wp-image-1101" srcset="/wp-content/uploads/2018/05/word-image-991.png 520w, /wp-content/uploads/2018/05/word-image-991-300x27.png 300w" sizes="(max-width: 520px) 100vw, 520px" />
</p>
<p>
  <img loading="lazy" decoding="async" width="559" height="121" src="/wp-content/uploads/2018/05/word-image-992.png" class="wp-image-1102" srcset="/wp-content/uploads/2018/05/word-image-992.png 559w, /wp-content/uploads/2018/05/word-image-992-300x65.png 300w" sizes="(max-width: 559px) 100vw, 559px" />
</p>
<p>
  一般数据库表设计的时候，都会加上一个not null,
</p>
<ul>
<li>
    第一执行效率比较快
  </li>
<li>
    Null的特殊性
  </li>
</ul>
<p>
  优化第一天案例英雄表
</p>
<p>
  <img loading="lazy" decoding="async" width="1272" height="211" src="/wp-content/uploads/2018/05/word-image-993.png" class="wp-image-1103" srcset="/wp-content/uploads/2018/05/word-image-993.png 1272w, /wp-content/uploads/2018/05/word-image-993-300x50.png 300w, /wp-content/uploads/2018/05/word-image-993-768x127.png 768w, /wp-content/uploads/2018/05/word-image-993-1024x170.png 1024w" sizes="(max-width: 1272px) 100vw, 1272px" />
</p>
<p>
  设计表：
</p>
<ul>
<li>
    一般字段类型的选择够用就行，不能过大（浪费空间）
  </li>
<li>
    一个表一般都有主键这个主键一般都设置成自动增长
  </li>
<li>
    字符串类型，看情况选择定长char(执行效率高)或是varchar(节省空间)
  </li>
<li>
    表字段除了主键一般都会使用字段属性  not null 如果不设置，后期的数据处理比较麻烦（唯一键的时候，可以有多个记录是null的情况出现）
  </li>
</ul>
<h1>修改表结构</h1>
<h2>增加字段</h2>
<p>
  语法：alter table 表名 add 字段名 类型  [字段属性]  [after 字段名]||[first ]
</p>
<p>
  <img loading="lazy" decoding="async" width="1021" height="326" src="/wp-content/uploads/2018/05/word-image-994.png" class="wp-image-1104" srcset="/wp-content/uploads/2018/05/word-image-994.png 1021w, /wp-content/uploads/2018/05/word-image-994-300x96.png 300w, /wp-content/uploads/2018/05/word-image-994-768x245.png 768w" sizes="(max-width: 1021px) 100vw, 1021px" />
</p>
<p>
  扩展
</p>
<ul>
<li>
    在某个字段后增加字段
  </li>
</ul>
<p>
  <img loading="lazy" decoding="async" width="1092" height="376" src="/wp-content/uploads/2018/05/word-image-995.png" class="wp-image-1105" srcset="/wp-content/uploads/2018/05/word-image-995.png 1092w, /wp-content/uploads/2018/05/word-image-995-300x103.png 300w, /wp-content/uploads/2018/05/word-image-995-768x264.png 768w, /wp-content/uploads/2018/05/word-image-995-1024x353.png 1024w" sizes="(max-width: 1092px) 100vw, 1092px" />
</p>
<ul>
<li>
    增加的字段在表的字段顺序第一个
  </li>
</ul>
<p>
  <img loading="lazy" decoding="async" width="1111" height="362" src="/wp-content/uploads/2018/05/word-image-996.png" class="wp-image-1106" srcset="/wp-content/uploads/2018/05/word-image-996.png 1111w, /wp-content/uploads/2018/05/word-image-996-300x98.png 300w, /wp-content/uploads/2018/05/word-image-996-768x250.png 768w, /wp-content/uploads/2018/05/word-image-996-1024x334.png 1024w" sizes="(max-width: 1111px) 100vw, 1111px" />
</p>
<h2>修改字段属性</h2>
<p>
  语法：alter table 表名 modify 字段名  新的类型 新的字段属性
</p>
<p>
  <img loading="lazy" decoding="async" width="1056" height="278" src="/wp-content/uploads/2018/05/word-image-997.png" class="wp-image-1107" srcset="/wp-content/uploads/2018/05/word-image-997.png 1056w, /wp-content/uploads/2018/05/word-image-997-300x79.png 300w, /wp-content/uploads/2018/05/word-image-997-768x202.png 768w, /wp-content/uploads/2018/05/word-image-997-1024x270.png 1024w" sizes="(max-width: 1056px) 100vw, 1056px" />
</p>
<p>
  <img loading="lazy" decoding="async" width="1023" height="373" src="/wp-content/uploads/2018/05/word-image-998.png" class="wp-image-1108" srcset="/wp-content/uploads/2018/05/word-image-998.png 1023w, /wp-content/uploads/2018/05/word-image-998-300x109.png 300w, /wp-content/uploads/2018/05/word-image-998-768x280.png 768w" sizes="(max-width: 1023px) 100vw, 1023px" />
</p>
<h2>修改字段名&amp;属性</h2>
<p>
  语法：alter table表名 change 老字段名   新的字段名  新类型  新字段属性;
</p>
<p>
  <img loading="lazy" decoding="async" width="1101" height="303" src="/wp-content/uploads/2018/05/word-image-999.png" class="wp-image-1109" srcset="/wp-content/uploads/2018/05/word-image-999.png 1101w, /wp-content/uploads/2018/05/word-image-999-300x83.png 300w, /wp-content/uploads/2018/05/word-image-999-768x211.png 768w, /wp-content/uploads/2018/05/word-image-999-1024x282.png 1024w" sizes="(max-width: 1101px) 100vw, 1101px" />
</p>
<p>
  <img loading="lazy" decoding="async" width="1047" height="399" src="/wp-content/uploads/2018/05/word-image-1000.png" class="wp-image-1110" srcset="/wp-content/uploads/2018/05/word-image-1000.png 1047w, /wp-content/uploads/2018/05/word-image-1000-300x114.png 300w, /wp-content/uploads/2018/05/word-image-1000-768x293.png 768w, /wp-content/uploads/2018/05/word-image-1000-1024x390.png 1024w" sizes="(max-width: 1047px) 100vw, 1047px" />
</p>
<h2>删除字段</h2>
<p>
  语法：alter table 表名 drop 字段名；
</p>
<p>
  <img loading="lazy" decoding="async" width="1011" height="271" src="/wp-content/uploads/2018/05/word-image-1001.png" class="wp-image-1111" srcset="/wp-content/uploads/2018/05/word-image-1001.png 1011w, /wp-content/uploads/2018/05/word-image-1001-300x80.png 300w, /wp-content/uploads/2018/05/word-image-1001-768x206.png 768w" sizes="(max-width: 1011px) 100vw, 1011px" />
</p>
<p>
  <img loading="lazy" decoding="async" width="1039" height="349" src="/wp-content/uploads/2018/05/word-image-1002.png" class="wp-image-1112" srcset="/wp-content/uploads/2018/05/word-image-1002.png 1039w, /wp-content/uploads/2018/05/word-image-1002-300x101.png 300w, /wp-content/uploads/2018/05/word-image-1002-768x258.png 768w, /wp-content/uploads/2018/05/word-image-1002-1024x344.png 1024w" sizes="(max-width: 1039px) 100vw, 1039px" />
</p>
<h2>修改数据表引擎</h2>
<p>
  表属性的修改
</p>
<p>
  语法：alter table 表名 表属性=新属性
</p>
<p>
  <img loading="lazy" decoding="async" width="955" height="338" src="/wp-content/uploads/2018/05/word-image-1003.png" class="wp-image-1113" srcset="/wp-content/uploads/2018/05/word-image-1003.png 955w, /wp-content/uploads/2018/05/word-image-1003-300x106.png 300w, /wp-content/uploads/2018/05/word-image-1003-768x272.png 768w" sizes="(max-width: 955px) 100vw, 955px" />
</p>
<p>
  <img loading="lazy" decoding="async" width="840" height="425" src="/wp-content/uploads/2018/05/word-image-1004.png" class="wp-image-1114" srcset="/wp-content/uploads/2018/05/word-image-1004.png 840w, /wp-content/uploads/2018/05/word-image-1004-300x152.png 300w, /wp-content/uploads/2018/05/word-image-1004-768x389.png 768w" sizes="(max-width: 840px) 100vw, 840px" />
</p>
<p>
  扩展：修改字符集
</p>
<p>
  <img loading="lazy" decoding="async" width="692" height="84" src="/wp-content/uploads/2018/05/word-image-1005.png" class="wp-image-1115" srcset="/wp-content/uploads/2018/05/word-image-1005.png 692w, /wp-content/uploads/2018/05/word-image-1005-300x36.png 300w" sizes="(max-width: 692px) 100vw, 692px" />
</p>
<h2>重命名表</h2>
<p>
  语法: alter table 表名 rename [to] 新表名
</p>
<p>
  <img loading="lazy" decoding="async" width="677" height="212" src="/wp-content/uploads/2018/05/word-image-1006.png" class="wp-image-1116" srcset="/wp-content/uploads/2018/05/word-image-1006.png 677w, /wp-content/uploads/2018/05/word-image-1006-300x94.png 300w" sizes="(max-width: 677px) 100vw, 677px" />
</p>
<h2>重命名表移动到别的数据库</h2>
<p>
  语法 :  alter table  表名  rename  [to]  数据库名.表名；
</p>
<p>
  <img loading="lazy" decoding="async" width="1066" height="60" src="/wp-content/uploads/2018/05/word-image-1007.png" class="wp-image-1117" srcset="/wp-content/uploads/2018/05/word-image-1007.png 1066w, /wp-content/uploads/2018/05/word-image-1007-300x17.png 300w, /wp-content/uploads/2018/05/word-image-1007-768x43.png 768w, /wp-content/uploads/2018/05/word-image-1007-1024x58.png 1024w" sizes="(max-width: 1066px) 100vw, 1066px" />
</p>
<p>
  <img loading="lazy" decoding="async" width="763" height="154" src="/wp-content/uploads/2018/05/word-image-1008.png" class="wp-image-1118" srcset="/wp-content/uploads/2018/05/word-image-1008.png 763w, /wp-content/uploads/2018/05/word-image-1008-300x61.png 300w" sizes="(max-width: 763px) 100vw, 763px" />
</p>
<p>
  <img loading="lazy" decoding="async" width="750" height="274" src="/wp-content/uploads/2018/05/word-image-1009.png" class="wp-image-1119" srcset="/wp-content/uploads/2018/05/word-image-1009.png 750w, /wp-content/uploads/2018/05/word-image-1009-300x110.png 300w" sizes="(max-width: 750px) 100vw, 750px" />
</p>
<p>
  注意：移动数据表的时候同时还可以给表重新命名
</p>
<h1>思考题</h1>
<ul>
<li>
    手机号码一般使用什么数据类型存储?			Char
  </li>
<li>
    QQ号										    varchar
  </li>
<li>
    性别一般使用什么数据类型存储?				Set 或enum
  </li>
<li>
    年龄信息一般使用什么数据类型存储?			Int 或者 tinyint
  </li>
<li>
    照片信息一般使用什么数据类型存储?			varchar
  </li>
<li>
    薪水一般使用什么数据类型存储?				Num Decimal
  </li>
<li>
    学员姓名允许为空吗?							Not null
  </li>
<li>
    家庭地址允许为空吗?							Not Null
  </li>
<li>
    电子邮件信息允许为空吗?						Null
  </li>
<li>
    考试成绩允许为空吗?							Not null
  </li>
<li>
    在主键列输入的数值，允许为空吗?				Not null
  </li>
<li>
    一个表可以有多个主键吗?						不可以
  </li>
<li>
    在一个学校数据库中，如果一个学校内允许重名的学员，但是一个班级内不允许学员重名，可以组合班级和姓名两个字段一起来作为主键吗？		        可以
  </li>
<li>
    标识列允许为字符数据类型吗？			标识列主键，主键任意类型列都要每行值都唯种，要求自增标识列能用数值型
  </li>
<li>
    表中没有合适的列作为主键怎么办？	    想加主键alter table table_name add constaint pk_tablename primary key (表主键列)
  </li>
<li>
    如果标识列A的初始值为1，增量为1，则输入三行数据以后，再删除两行，下次再输入数据行的时候，标识值从多少开始？4
  </li>
</ul>
<p>
  注意注释的使用</p>
]]></content:encoded>
					
					<wfw:commentRss>/%e6%95%b0%e6%8d%ae%e5%ba%93/mysql/1018.html/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Mysql（三）联合查询、 运算符、 高级修改、 高级删除、 高级新增、 高级查询</title>
		<link>/%e6%95%b0%e6%8d%ae%e5%ba%93/mysql/1121.html</link>
					<comments>/%e6%95%b0%e6%8d%ae%e5%ba%93/mysql/1121.html#respond</comments>
		
		<dc:creator><![CDATA[Mr.Lee]]></dc:creator>
		<pubDate>Thu, 17 May 2018 17:12:34 +0000</pubDate>
				<category><![CDATA[Mysql]]></category>
		<category><![CDATA[联合查询]]></category>
		<category><![CDATA[运算符]]></category>
		<category><![CDATA[高级修改]]></category>
		<category><![CDATA[高级删除]]></category>
		<category><![CDATA[高级新增]]></category>
		<category><![CDATA[高级查询]]></category>
		<guid isPermaLink="false">/?p=1121</guid>

					<description><![CDATA[思考题 手机号码一般使用什么数据类型存储? char（11） QQ号 varchar（12） 性别一般使用什么 [&#8230;]]]></description>
										<content:encoded><![CDATA[<h1>思考题</h1>
<ul>
<li>
    手机号码一般使用什么数据类型存储?			char（11）
  </li>
<li>
    QQ号										    varchar（12）
  </li>
<li>
    性别一般使用什么数据类型存储?				tinyint(1)   1-男，2-女   char(1) 男，enum 单选女
  </li>
<li>
    年龄信息一般使用什么数据类型存储?			Unsigned tinyint(3)
  </li>
<li>
    照片信息一般使用什么数据类型存储?			varchar(60)  直接存唯一的图片名
  </li>
<li>
    薪水一般使用什么数据类型存储?				decimal(10,2) php要判断小数位不能有第三位
  </li>
<li>
    学员姓名允许为空吗?							不能（使用情况）
  </li>
<li>
    家庭地址允许为空吗?							个人中心设置可以为空，购物不能为空
  </li>
<li>
    电子邮件信息允许为空吗?						可个人中心可以，用邮箱注册账号
  </li>
<li>
    考试成绩允许为空吗?							不可以 给一个默认值0
  </li>
<li>
    在主键列输入的数值，允许为空吗?				不能
  </li>
<li>
    一个表可以有多个主键吗?						不能
  </li>
<li>
    在一个学校数据库中，如果一个学校内允许重名的学员，但是一个班级内不允许学员重名，可以组合班级和姓名两个字段一起来作为主键吗？		        primary key(id,name)
  </li>
<li>
    表中没有合适的列作为主键怎么办？	    给他添加一个编号id
  </li>
<li>
    一个表可以没有主键吗？   可以，一般使用没有主键的表都是中间表（存储两个表之间的关系）
  </li>
<li>
    如果标识列A的初始值为1，增量为1，则输入三行数据以后，再删除两行，下次再输入数据行的时候，标识值从多少开始？					4
  </li>
</ul>
<h1>运算符</h1>
<h2>算术运算符</h2>
<p>
  + 加
</p>
<p>
  &#8211; 减
</p>
<p>
  *乘
</p>
<p>
  / 除    如果除数为0怎么办？  得出的结果是null
</p>
<p>
  % 取模(求余) 如果除数为0怎么办？  得出的结果是null
</p>
<p>
  <img loading="lazy" decoding="async" width="330" height="114" src="/wp-content/uploads/2018/05/word-image-1010.png" class="wp-image-1122" srcset="/wp-content/uploads/2018/05/word-image-1010.png 330w, /wp-content/uploads/2018/05/word-image-1010-300x104.png 300w" sizes="(max-width: 330px) 100vw, 330px" /></p>
<p>  <img loading="lazy" decoding="async" width="439" height="118" src="/wp-content/uploads/2018/05/word-image-1011.png" class="wp-image-1123" srcset="/wp-content/uploads/2018/05/word-image-1011.png 439w, /wp-content/uploads/2018/05/word-image-1011-300x81.png 300w" sizes="(max-width: 439px) 100vw, 439px" />
</p>
<p>
  算术运算符一般是应用到，结果字段运算上
</p>
<p>
  Select   (字段运算)字段表达式   [from ] [where]
</p>
<p>
  <img loading="lazy" decoding="async" width="903" height="168" src="/wp-content/uploads/2018/05/word-image-1012.png" class="wp-image-1124" srcset="/wp-content/uploads/2018/05/word-image-1012.png 903w, /wp-content/uploads/2018/05/word-image-1012-300x56.png 300w, /wp-content/uploads/2018/05/word-image-1012-768x143.png 768w" sizes="(max-width: 903px) 100vw, 903px" />
</p>
<h2>关系运算符</h2>
<p>
  &lt; 小于
</p>
<p>
  &gt;大于
</p>
<p>
  &lt;= 小于等于
</p>
<p>
  &gt;=大于等于
</p>
<p>
  = 等于(比较)
</p>
<p>
  &lt;&gt;   !=  不等于
</p>
<p>
  关系运算符主要用在哪个类型上 数值类型，也可以用在字符串类型
</p>
<p>
  Select * from 表名 id&gt;5
</p>
<p>
  Select * from  表名 name=’李明’;
</p>
<p>
  Select * from  表名 name!=’李明’;
</p>
<h2>逻辑运算符</h2>
<p>
   and 条件同时满足为真
</p>
<p>
  <img loading="lazy" decoding="async" width="788" height="131" src="/wp-content/uploads/2018/05/word-image-1013.png" class="wp-image-1125" srcset="/wp-content/uploads/2018/05/word-image-1013.png 788w, /wp-content/uploads/2018/05/word-image-1013-300x50.png 300w, /wp-content/uploads/2018/05/word-image-1013-768x128.png 768w" sizes="(max-width: 788px) 100vw, 788px" />
</p>
<p>
   or  条件有一个满足为真
</p>
<p>
  <img loading="lazy" decoding="async" width="866" height="290" src="/wp-content/uploads/2018/05/word-image-1014.png" class="wp-image-1126" srcset="/wp-content/uploads/2018/05/word-image-1014.png 866w, /wp-content/uploads/2018/05/word-image-1014-300x100.png 300w, /wp-content/uploads/2018/05/word-image-1014-768x257.png 768w" sizes="(max-width: 866px) 100vw, 866px" />
</p>
<p>
   not 取反
</p>
<p>
  <img loading="lazy" decoding="async" width="925" height="279" src="/wp-content/uploads/2018/05/word-image-1015.png" class="wp-image-1127" srcset="/wp-content/uploads/2018/05/word-image-1015.png 925w, /wp-content/uploads/2018/05/word-image-1015-300x90.png 300w, /wp-content/uploads/2018/05/word-image-1015-768x232.png 768w" sizes="(max-width: 925px) 100vw, 925px" />
</p>
<h1>高级查询</h1>
<p>
  高级查询的格式
</p>
<p>
  Select  [all/distinct]  字段/字段表达式
</p>
<p>
  [from 子句]
</p>
<p>
  [where子句]
</p>
<p>
  [group by 子句]
</p>
<p>
  [having子句]
</p>
<p>
  [order by子句]
</p>
<p>
  [limit 子句]
</p>
<p>
  子句的顺序固定
</p>
<h2>All</h2>
<p>
  含义就是把查询出来的结果全部展示出来
</p>
<p>
  <img loading="lazy" decoding="async" width="849" height="313" src="/wp-content/uploads/2018/05/word-image-1016.png" class="wp-image-1128" srcset="/wp-content/uploads/2018/05/word-image-1016.png 849w, /wp-content/uploads/2018/05/word-image-1016-300x111.png 300w, /wp-content/uploads/2018/05/word-image-1016-768x283.png 768w" sizes="(max-width: 849px) 100vw, 849px" />
</p>
<h2>distinct去除重复数据</h2>
<p>
  <img loading="lazy" decoding="async" width="775" height="297" src="/wp-content/uploads/2018/05/word-image-1017.png" class="wp-image-1129" srcset="/wp-content/uploads/2018/05/word-image-1017.png 775w, /wp-content/uploads/2018/05/word-image-1017-300x115.png 300w, /wp-content/uploads/2018/05/word-image-1017-768x294.png 768w" sizes="(max-width: 775px) 100vw, 775px" />
</p>
<p>
  <img loading="lazy" decoding="async" width="647" height="210" src="/wp-content/uploads/2018/05/word-image-1018.png" class="wp-image-1130" srcset="/wp-content/uploads/2018/05/word-image-1018.png 647w, /wp-content/uploads/2018/05/word-image-1018-300x97.png 300w" sizes="(max-width: 647px) 100vw, 647px" />
</p>
<h2>as别名</h2>
<p>
   使用方式 as  新名字，as关键字可以省略
</p>
<p>
  <img loading="lazy" decoding="async" width="686" height="219" src="/wp-content/uploads/2018/05/word-image-1019.png" class="wp-image-1131" srcset="/wp-content/uploads/2018/05/word-image-1019.png 686w, /wp-content/uploads/2018/05/word-image-1019-300x96.png 300w" sizes="(max-width: 686px) 100vw, 686px" />
</p>
<p>
  <img loading="lazy" decoding="async" width="689" height="218" src="/wp-content/uploads/2018/05/word-image-1020.png" class="wp-image-1132" srcset="/wp-content/uploads/2018/05/word-image-1020.png 689w, /wp-content/uploads/2018/05/word-image-1020-300x95.png 300w" sizes="(max-width: 689px) 100vw, 689px" />
</p>
<h2>Where条件</h2>
<h3>In </h3>
<p>
  在某个范围内
</p>
<p>
  找出type 是打野，或输出的英雄信息
</p>
<p>
  一般会：select * from hero where type=&#8217;打野&#8217; or type=&#8217;输出&#8217;;查询
</p>
<p>
  其实还可以使用in来查询
</p>
<p>
  字段名  In (值1，值2….);含义就是  该字段的值是小括号里边的任意一个
</p>
<p>
  <img loading="lazy" decoding="async" width="851" height="210" src="/wp-content/uploads/2018/05/word-image-1021.png" class="wp-image-1133" srcset="/wp-content/uploads/2018/05/word-image-1021.png 851w, /wp-content/uploads/2018/05/word-image-1021-300x74.png 300w, /wp-content/uploads/2018/05/word-image-1021-768x190.png 768w" sizes="(max-width: 851px) 100vw, 851px" />
</p>
<p>
  	比较：or 和in
</p>
<p>
  		In比or使用更方便，如果需要再加满足的条件，只需要在小括号里边加一个值就行了而or需要使用两次or运算这样执行效率慢，语法繁琐
</p>
<p>
  <img loading="lazy" decoding="async" width="861" height="260" src="/wp-content/uploads/2018/05/word-image-1022.png" class="wp-image-1134" srcset="/wp-content/uploads/2018/05/word-image-1022.png 861w, /wp-content/uploads/2018/05/word-image-1022-300x91.png 300w, /wp-content/uploads/2018/05/word-image-1022-768x232.png 768w" sizes="(max-width: 861px) 100vw, 861px" />
</p>
<h3>Is null /is not null</h3>
<p>
  Is是判断，一般只和null连用，判断字段的值是否是null，如果是null就返回1，如果不是就返回0；
</p>
<p>
  <img loading="lazy" decoding="async" width="822" height="369" src="/wp-content/uploads/2018/05/word-image-1023.png" class="wp-image-1135" srcset="/wp-content/uploads/2018/05/word-image-1023.png 822w, /wp-content/uploads/2018/05/word-image-1023-300x135.png 300w, /wp-content/uploads/2018/05/word-image-1023-768x345.png 768w" sizes="(max-width: 822px) 100vw, 822px" />
</p>
<h3>between…and </h3>
<p>
  在什么范围之内，这个范围主要指数字
</p>
<p>
  大于3小于8
</p>
<p>
  Between 3 and 8;  包括3和8的<br />
  <img loading="lazy" decoding="async" width="829" height="250" src="/wp-content/uploads/2018/05/word-image-1024.png" class="wp-image-1136" srcset="/wp-content/uploads/2018/05/word-image-1024.png 829w, /wp-content/uploads/2018/05/word-image-1024-300x90.png 300w, /wp-content/uploads/2018/05/word-image-1024-768x232.png 768w" sizes="(max-width: 829px) 100vw, 829px" />
</p>
<p>
  Between…and…表示不了不连续的范围，比如 在这些数字里边的  1,6,8,9
</p>
<h3>like模糊查询</h3>
<p>
  模糊查询就是知道要查询信息的一部分内容，不是精确的内容的查询
</p>
<p>
  英雄名字我只知道第一个是‘牛’ 那么我怎么查到这些英雄的信息呢？
</p>
<h4>通配符</h4>
<p>
  就是占位的符号，有一定含义
</p>
<table>
<tr>
<td>
<p>
  通配符
</p>
</td>
<td>
<p>
  描述
</p>
</td>
</tr>
<tr>
<td>
<p>
  _  (下划线)
</p>
</td>
<td>
<p>
  表示任意<strong>一个</strong>字符
</p>
</td>
</tr>
<tr>
<td>
<p>
  %
</p>
</td>
<td>
<p>
  表示任意多个或一个或0个字符
</p>
</td>
</tr>
</table>
<p>
  1、’t_m’下列选项符合的条件的是（）
</p>
<p>
  A：tm 	B：tom 	C:toom	D:tam		E:tmo
</p>
<p>
  2、’张%’ 下列选项符合的条件的是（）
</p>
<p>
  A：张三	B：张三丰	C：张牙舞爪  D：张   E：小张
</p>
<p>
  3、’%诺基亚%’  下列选项符合的条件的是（）
</p>
<p>
  A：诺基亚2100   B :2100诺基亚  C：我的诺基亚质量很好 D：诺基亚
</p>
<p>
  4、SELECT * FROM 数据表 WHERE 编号 LIKE &#8217;00_A5%C’ （）
</p>
<p>
  A、0890AC   B、007_A51C    C、00A54C   D、00AA5C
</p>
<p>
  <img loading="lazy" decoding="async" width="758" height="302" src="/wp-content/uploads/2018/05/word-image-1025.png" class="wp-image-1137" srcset="/wp-content/uploads/2018/05/word-image-1025.png 758w, /wp-content/uploads/2018/05/word-image-1025-300x120.png 300w" sizes="(max-width: 758px) 100vw, 758px" />
</p>
<p>
  <img loading="lazy" decoding="async" width="703" height="160" src="/wp-content/uploads/2018/05/word-image-1026.png" class="wp-image-1138" srcset="/wp-content/uploads/2018/05/word-image-1026.png 703w, /wp-content/uploads/2018/05/word-image-1026-300x68.png 300w" sizes="(max-width: 703px) 100vw, 703px" />
</p>
<p>
  <img loading="lazy" decoding="async" width="613" height="184" src="/wp-content/uploads/2018/05/word-image-1027.png" class="wp-image-1139" srcset="/wp-content/uploads/2018/05/word-image-1027.png 613w, /wp-content/uploads/2018/05/word-image-1027-300x90.png 300w" sizes="(max-width: 613px) 100vw, 613px" />
</p>
<p>
  <img loading="lazy" decoding="async" width="852" height="185" src="/wp-content/uploads/2018/05/word-image-1028.png" class="wp-image-1140" srcset="/wp-content/uploads/2018/05/word-image-1028.png 852w, /wp-content/uploads/2018/05/word-image-1028-300x65.png 300w, /wp-content/uploads/2018/05/word-image-1028-768x167.png 768w" sizes="(max-width: 852px) 100vw, 852px" />
</p>
<h2>group by分组</h2>
<p>
  什么是group  by分组查询，作用
</p>
<p>
  分组查询是按照指定的字段来分组，分组的目的是为了统计
</p>
<p>
  <img loading="lazy" decoding="async" width="1415" height="395" src="/wp-content/uploads/2018/05/word-image-1029.png" class="wp-image-1141" srcset="/wp-content/uploads/2018/05/word-image-1029.png 1415w, /wp-content/uploads/2018/05/word-image-1029-300x84.png 300w, /wp-content/uploads/2018/05/word-image-1029-768x214.png 768w, /wp-content/uploads/2018/05/word-image-1029-1024x286.png 1024w" sizes="(max-width: 1415px) 100vw, 1415px" />
</p>
<h3>聚合函数</h3>
<p>
  聚合函数就在分组的基础上求某一个字段的相关信息，返回的是一个单独的数据，也就是  ‘一行一列’
</p>
<p>
  Sum求和
</p>
<p>
  Avg平均值
</p>
<p>
  Max最大值
</p>
<p>
  Min 最小值
</p>
<p>
  Count 数量
</p>
<p>
  <img loading="lazy" decoding="async" width="1039" height="231" src="/wp-content/uploads/2018/05/word-image-1030.png" class="wp-image-1142" srcset="/wp-content/uploads/2018/05/word-image-1030.png 1039w, /wp-content/uploads/2018/05/word-image-1030-300x67.png 300w, /wp-content/uploads/2018/05/word-image-1030-768x171.png 768w, /wp-content/uploads/2018/05/word-image-1030-1024x228.png 1024w" sizes="(max-width: 1039px) 100vw, 1039px" />
</p>
<h3>having条件</h3>
<p>
  在原有查询出来的结果上过滤
</p>
<p>
  <img loading="lazy" decoding="async" width="999" height="228" src="/wp-content/uploads/2018/05/word-image-1031.png" class="wp-image-1143" srcset="/wp-content/uploads/2018/05/word-image-1031.png 999w, /wp-content/uploads/2018/05/word-image-1031-300x68.png 300w, /wp-content/uploads/2018/05/word-image-1031-768x175.png 768w" sizes="(max-width: 999px) 100vw, 999px" />
</p>
<p>
  <img loading="lazy" decoding="async" width="869" height="129" src="/wp-content/uploads/2018/05/word-image-1032.png" class="wp-image-1144" srcset="/wp-content/uploads/2018/05/word-image-1032.png 869w, /wp-content/uploads/2018/05/word-image-1032-300x45.png 300w, /wp-content/uploads/2018/05/word-image-1032-768x114.png 768w" sizes="(max-width: 869px) 100vw, 869px" />
</p>
<h3>比较having和where的区别</h3>
<p>
  相似的地方都是条件&#8212;&#8211;过滤数据
</p>
<p>
  不同的地方
</p>
<ul>
<li>
    Where在分组之前执行，having在分组之后执行说白了，having就是在where过滤之后的结果之上，再次过滤数据
  </li>
<li>
    Having过滤只能使用查询结果中有的字段，where过滤数据能使用表中的任何字段
  </li>
</ul>
<p>
  <img loading="lazy" decoding="async" width="995" height="44" src="/wp-content/uploads/2018/05/word-image-1033.png" class="wp-image-1145" srcset="/wp-content/uploads/2018/05/word-image-1033.png 995w, /wp-content/uploads/2018/05/word-image-1033-300x13.png 300w, /wp-content/uploads/2018/05/word-image-1033-768x34.png 768w" sizes="(max-width: 995px) 100vw, 995px" />
</p>
<p>
  <img loading="lazy" decoding="async" width="777" height="248" src="/wp-content/uploads/2018/05/word-image-1034.png" class="wp-image-1146" srcset="/wp-content/uploads/2018/05/word-image-1034.png 777w, /wp-content/uploads/2018/05/word-image-1034-300x96.png 300w, /wp-content/uploads/2018/05/word-image-1034-768x245.png 768w" sizes="(max-width: 777px) 100vw, 777px" />
</p>
<h3>回溯查询  with rollup</h3>
<p>
  就是在分组的结果基础之上，再次进行相同的分组查询
</p>
<p>
  <img loading="lazy" decoding="async" width="1755" height="620" src="/wp-content/uploads/2018/05/word-image-1035.png" class="wp-image-1147" srcset="/wp-content/uploads/2018/05/word-image-1035.png 1755w, /wp-content/uploads/2018/05/word-image-1035-300x106.png 300w, /wp-content/uploads/2018/05/word-image-1035-768x271.png 768w, /wp-content/uploads/2018/05/word-image-1035-1024x362.png 1024w" sizes="(max-width: 1755px) 100vw, 1755px" />
</p>
<p>
  <img loading="lazy" decoding="async" width="920" height="201" src="/wp-content/uploads/2018/05/word-image-1036.png" class="wp-image-1148" srcset="/wp-content/uploads/2018/05/word-image-1036.png 920w, /wp-content/uploads/2018/05/word-image-1036-300x66.png 300w, /wp-content/uploads/2018/05/word-image-1036-768x168.png 768w" sizes="(max-width: 920px) 100vw, 920px" />
</p>
<p>
  <img loading="lazy" decoding="async" width="737" height="120" src="/wp-content/uploads/2018/05/word-image-1037.png" class="wp-image-1149" srcset="/wp-content/uploads/2018/05/word-image-1037.png 737w, /wp-content/uploads/2018/05/word-image-1037-300x49.png 300w" sizes="(max-width: 737px) 100vw, 737px" />
</p>
<p>
  扩展：我想在一次结果中查看到不同英雄的平均伤害，和所有英雄的平均伤害
</p>
<p>
  <img loading="lazy" decoding="async" width="965" height="234" src="/wp-content/uploads/2018/05/word-image-1038.png" class="wp-image-1150" srcset="/wp-content/uploads/2018/05/word-image-1038.png 965w, /wp-content/uploads/2018/05/word-image-1038-300x73.png 300w, /wp-content/uploads/2018/05/word-image-1038-768x186.png 768w" sizes="(max-width: 965px) 100vw, 965px" />
</p>
<h2>order by排序</h2>
<p>
  排序，按照某一字段从大到小排，从小到大排<br />
  <br />
  从大到小排序 desc   order by 字段名  desc  按照某个字段从大到小排序
</p>
<p>
  从小到大排序 asc    order by 字段名  asc按照某个字段从小到大排序
</p>
<p>
  如果没有设置排序，会按照id从小到大排序展示出来
</p>
<p>
  Id从大到小排序
</p>
<p>  <img loading="lazy" decoding="async" width="941" height="387" src="/wp-content/uploads/2018/05/word-image-1039.png" class="wp-image-1151" srcset="/wp-content/uploads/2018/05/word-image-1039.png 941w, /wp-content/uploads/2018/05/word-image-1039-300x123.png 300w, /wp-content/uploads/2018/05/word-image-1039-768x316.png 768w" sizes="(max-width: 941px) 100vw, 941px" />
</p>
<h2>limit限定 </h2>
<p>
  限定查询出来的结果显示多少条，从第几条开始显示显示多少条
</p>
<p>
  Limit 数字  &#8211;从第一条开始显示多少条数据
</p>
<p>
  Limit 数字 ，数字 &#8212;从第几条开始显示，显示多少条  不包括开始的那一条
</p>
<p>
  <img loading="lazy" decoding="async" width="948" height="345" src="/wp-content/uploads/2018/05/word-image-1040.png" class="wp-image-1152" srcset="/wp-content/uploads/2018/05/word-image-1040.png 948w, /wp-content/uploads/2018/05/word-image-1040-300x109.png 300w, /wp-content/uploads/2018/05/word-image-1040-768x279.png 768w" sizes="(max-width: 948px) 100vw, 948px" />
</p>
<p>
  实现：显示前四条数据
</p>
<p>
  <img loading="lazy" decoding="async" width="803" height="193" src="/wp-content/uploads/2018/05/word-image-1041.png" class="wp-image-1153" srcset="/wp-content/uploads/2018/05/word-image-1041.png 803w, /wp-content/uploads/2018/05/word-image-1041-300x72.png 300w, /wp-content/uploads/2018/05/word-image-1041-768x185.png 768w" sizes="(max-width: 803px) 100vw, 803px" />
</p>
<p>
  实现：从第5条开始，显示3条
</p>
<p>
  <img loading="lazy" decoding="async" width="776" height="191" src="/wp-content/uploads/2018/05/word-image-1042.png" class="wp-image-1154" srcset="/wp-content/uploads/2018/05/word-image-1042.png 776w, /wp-content/uploads/2018/05/word-image-1042-300x74.png 300w, /wp-content/uploads/2018/05/word-image-1042-768x189.png 768w" sizes="(max-width: 776px) 100vw, 776px" />
</p>
<h1>高级查询案例</h1>
<p>
  测试数据
</p>
<p>
  <img loading="lazy" decoding="async" width="840" height="337" src="/wp-content/uploads/2018/05/word-image-1043.png" class="wp-image-1155" srcset="/wp-content/uploads/2018/05/word-image-1043.png 840w, /wp-content/uploads/2018/05/word-image-1043-300x120.png 300w, /wp-content/uploads/2018/05/word-image-1043-768x308.png 768w" sizes="(max-width: 840px) 100vw, 840px" />
</p>
<ul>
<li>
    找出伤害是前三的英雄信息
  </li>
</ul>
<p>
  select name from hero order by hurt desc limit 3;
</p>
<ul>
<li>
    找出英雄名字中有&#8217;德&#8217;字的英雄
  </li>
</ul>
<p>
  select name from hero where name like &#8216;%德%&#8217;;
</p>
<ul>
<li>
    找出每种技能的平均伤害
  </li>
</ul>
<p>
  select skill,avg(hurt) from hero group by skill;
</p>
<ul>
<li>
    找出每种技能的平均伤害 和所有技能的平均伤害
  </li>
</ul>
<p>
  select skill,avg(hurt) from hero group by skill with rollup;
</p>
<ul>
<li>
    找出平均技能伤害大于60的技能
  </li>
</ul>
<p>
  select skill,avg(hurt) as 平均伤害 from hero group by skill having 平均伤害&gt;60;
</p>
<ul>
<li>
    找出伤害最高的英雄信息（不要求掌握）
  </li>
</ul>
<p>
  select name,hurt from hero where hurt= (select max(hurt) from hero);
</p>
<h1>高级新增</h1>
<p>
  之前学的新增:insert [into]  表名  [(字段列表)]    values  (值列表);
</p>
<p>
  要求，字段列表和值列表一致，每一次执行插入一条数据的
</p>
<h2>多值插入</h2>
<p>
  语法： insert [into] 表名  [(字段列表)]
</p>
<p>
  values (值列表), (值列表), (值列表)……;
</p>
<p>
   例如：
</p>
<p>
  insert into hero  values
</p>
<p>
  	(null,&#8217;a&#8217;,1,2,50,60),
</p>
<p>
  	(null,&#8217;b&#8217;,1,2,50,60),
</p>
<p>
  	(null,&#8217;c&#8217;,1,2,50,60);
</p>
<p>
  <img loading="lazy" decoding="async" width="650" height="141" src="/wp-content/uploads/2018/05/word-image-1044.png" class="wp-image-1156" srcset="/wp-content/uploads/2018/05/word-image-1044.png 650w, /wp-content/uploads/2018/05/word-image-1044-300x65.png 300w" sizes="(max-width: 650px) 100vw, 650px" />
</p>
<p>
  <img loading="lazy" decoding="async" width="814" height="378" src="/wp-content/uploads/2018/05/word-image-1045.png" class="wp-image-1157" srcset="/wp-content/uploads/2018/05/word-image-1045.png 814w, /wp-content/uploads/2018/05/word-image-1045-300x139.png 300w, /wp-content/uploads/2018/05/word-image-1045-768x357.png 768w" sizes="(max-width: 814px) 100vw, 814px" />
</p>
<h2>set方式插入</h2>
<p>
  很少用，只需要知道就可以了
</p>
<p>
  语法： insert 表名 set  字段1=值1，字段2=值2…；每次只插入一条数据
</p>
<p>
  例如：
</p>
<p>
  insert into hero set name=&#8217;d&#8217;,type=1,skill=2,hurt=23,waittime=6;
</p>
<p>
  <img loading="lazy" decoding="async" width="784" height="61" src="/wp-content/uploads/2018/05/word-image-1046.png" class="wp-image-1158" srcset="/wp-content/uploads/2018/05/word-image-1046.png 784w, /wp-content/uploads/2018/05/word-image-1046-300x23.png 300w, /wp-content/uploads/2018/05/word-image-1046-768x60.png 768w" sizes="(max-width: 784px) 100vw, 784px" />
</p>
<p>
  <img loading="lazy" decoding="async" width="816" height="404" src="/wp-content/uploads/2018/05/word-image-1047.png" class="wp-image-1159" srcset="/wp-content/uploads/2018/05/word-image-1047.png 816w, /wp-content/uploads/2018/05/word-image-1047-300x149.png 300w, /wp-content/uploads/2018/05/word-image-1047-768x380.png 768w" sizes="(max-width: 816px) 100vw, 816px" />
</p>
<h2>蠕虫复制</h2>
<p>
  什么是蠕虫复制，这个类似细胞分裂
</p>
<p>
  1 变 2
</p>
<p>
  2 变 4
</p>
<p>
  4 变 8
</p>
<p>
  每次进行一个蠕虫复制的话，数据表的数据就是成倍的增加
</p>
<p>
  当前表有10条数据，蠕虫复制了10次&#8212;-现在有多少条数据？1024*10
</p>
<p>
  再蠕虫复制10次   1024*1024*10&#8212;-千万级数据
</p>
<p>
  所以蠕虫复制需要防止；
</p>
<p>
  例如：
</p>
<p>
  <img loading="lazy" decoding="async" width="586" height="209" src="/wp-content/uploads/2018/05/word-image-1048.png" class="wp-image-1160" srcset="/wp-content/uploads/2018/05/word-image-1048.png 586w, /wp-content/uploads/2018/05/word-image-1048-300x107.png 300w" sizes="(max-width: 586px) 100vw, 586px" />
</p>
<p>
  <img loading="lazy" decoding="async" width="835" height="71" src="/wp-content/uploads/2018/05/word-image-1049.png" class="wp-image-1161" srcset="/wp-content/uploads/2018/05/word-image-1049.png 835w, /wp-content/uploads/2018/05/word-image-1049-300x26.png 300w, /wp-content/uploads/2018/05/word-image-1049-768x65.png 768w" sizes="(max-width: 835px) 100vw, 835px" /></p>
<p>
  <img loading="lazy" decoding="async" width="794" height="259" src="/wp-content/uploads/2018/05/word-image-1050.png" class="wp-image-1162" srcset="/wp-content/uploads/2018/05/word-image-1050.png 794w, /wp-content/uploads/2018/05/word-image-1050-300x98.png 300w, /wp-content/uploads/2018/05/word-image-1050-768x251.png 768w" sizes="(max-width: 794px) 100vw, 794px" />
</p>
<p>
  语法 insert [into] 表名 values select 语句
</p>
<p>
  Select 语句的查询结果字段和插入的字段列表一致（数量，类型）;
</p>
<p>
  扩展：怎么防止蠕虫复制
</p>
<p>
  	加入unique key
</p>
<h2>replace插入</h2>
<p>
  替换插入，如果插入的数据中在表中有（一个字段上—<strong><em>唯一建</em></strong>），那么会先把表中已有的数据删除，然后再插入
</p>
<p>
  Replace[ into]  表名  [(字段列表)]  values  (值列表);
</p>
<p>
  <img loading="lazy" decoding="async" width="573" height="157" src="/wp-content/uploads/2018/05/word-image-1051.png" class="wp-image-1163" srcset="/wp-content/uploads/2018/05/word-image-1051.png 573w, /wp-content/uploads/2018/05/word-image-1051-300x82.png 300w" sizes="(max-width: 573px) 100vw, 573px" />
</p>
<p>
  <img loading="lazy" decoding="async" width="821" height="83" src="/wp-content/uploads/2018/05/word-image-1052.png" class="wp-image-1164" srcset="/wp-content/uploads/2018/05/word-image-1052.png 821w, /wp-content/uploads/2018/05/word-image-1052-300x30.png 300w, /wp-content/uploads/2018/05/word-image-1052-768x78.png 768w" sizes="(max-width: 821px) 100vw, 821px" />
</p>
<p>
  <img loading="lazy" decoding="async" width="562" height="159" src="/wp-content/uploads/2018/05/word-image-1053.png" class="wp-image-1165" srcset="/wp-content/uploads/2018/05/word-image-1053.png 562w, /wp-content/uploads/2018/05/word-image-1053-300x85.png 300w" sizes="(max-width: 562px) 100vw, 562px" />
</p>
<h1>高级修改</h1>
<p>
  Update 表名 set 字段1=值1 ,字段2=值2…  where 修改条件;
</p>
<h2>排序限定条数修改</h2>
<p>
  语法：update 表名 set 字段1=值1 ,字段2=值2…  [where 条件]  [order by 子句]  [limit子句]
</p>
<p>
  在修改的过程中可以限定修改的条数，和排序
</p>
<p>
  我要修改英雄前三的伤害值 ，让伤害值加倍；
</p>
<p>
  这里用到了排序   英雄伤害从高到低排序    order by desc
</p>
<p>
  限定  		     修改前三条信息，让信息值加倍  limit 3
</p>
<p>
  Update hero set hurt=hurt*2 [hurt+hurt] order by hurt desc limit3;
</p>
<p>
  修改前，伤害前三的英雄信息
</p>
<p>
  <img loading="lazy" decoding="async" width="717" height="164" src="/wp-content/uploads/2018/05/word-image-1054.png" class="wp-image-1166" srcset="/wp-content/uploads/2018/05/word-image-1054.png 717w, /wp-content/uploads/2018/05/word-image-1054-300x69.png 300w" sizes="(max-width: 717px) 100vw, 717px" />
</p>
<p>
  <img loading="lazy" decoding="async" width="813" height="269" src="/wp-content/uploads/2018/05/word-image-1055.png" class="wp-image-1167" srcset="/wp-content/uploads/2018/05/word-image-1055.png 813w, /wp-content/uploads/2018/05/word-image-1055-300x99.png 300w, /wp-content/uploads/2018/05/word-image-1055-768x254.png 768w" sizes="(max-width: 813px) 100vw, 813px" />
</p>
<p>
  扩展：
</p>
<p>
  	回想limit  3；
</p>
<p>
  		Limit 4,2;   修改英雄伤害排名是5,6的伤害，让其加倍&#8212;update修改没有这样的用法
</p>
<p>
  <img loading="lazy" decoding="async" width="1042" height="75" src="/wp-content/uploads/2018/05/word-image-1056.png" class="wp-image-1168" srcset="/wp-content/uploads/2018/05/word-image-1056.png 1042w, /wp-content/uploads/2018/05/word-image-1056-300x22.png 300w, /wp-content/uploads/2018/05/word-image-1056-768x55.png 768w, /wp-content/uploads/2018/05/word-image-1056-1024x74.png 1024w" sizes="(max-width: 1042px) 100vw, 1042px" />
</p>
<h1>高级删除</h1>
<p>
  delete from 表名 [where 条件] [order by 子句] [limit 子句]
</p>
<h2>排序限定条数删除</h2>
<p>
  英雄伤害前2两名，英雄删除
</p>
<p>
  Delete from hero  order by hurt desc  limit 2
</p>
<p>
  删除前数据
</p>
<p>
  <img loading="lazy" decoding="async" width="914" height="392" src="/wp-content/uploads/2018/05/word-image-1057.png" class="wp-image-1169" srcset="/wp-content/uploads/2018/05/word-image-1057.png 914w, /wp-content/uploads/2018/05/word-image-1057-300x129.png 300w, /wp-content/uploads/2018/05/word-image-1057-768x329.png 768w" sizes="(max-width: 914px) 100vw, 914px" />
</p>
<p>
  删除伤害排名前两位的英雄，如果成功，德玛和诺克消失
</p>
<p>
  <img loading="lazy" decoding="async" width="999" height="455" src="/wp-content/uploads/2018/05/word-image-1058.png" class="wp-image-1170" srcset="/wp-content/uploads/2018/05/word-image-1058.png 999w, /wp-content/uploads/2018/05/word-image-1058-300x137.png 300w, /wp-content/uploads/2018/05/word-image-1058-768x350.png 768w" sizes="(max-width: 999px) 100vw, 999px" />
</p>
<p>
  扩展：能不能指定从第几条开始删除？
</p>
<p>
  	也就是delete语句中支不支持 limit  数字,数字;的用法
</p>
<p>
  测试；删除伤害排名在第3，4的两个英雄
</p>
<p>
  <img loading="lazy" decoding="async" width="930" height="388" src="/wp-content/uploads/2018/05/word-image-1059.png" class="wp-image-1171" srcset="/wp-content/uploads/2018/05/word-image-1059.png 930w, /wp-content/uploads/2018/05/word-image-1059-300x125.png 300w, /wp-content/uploads/2018/05/word-image-1059-768x320.png 768w" sizes="(max-width: 930px) 100vw, 930px" />
</p>
<p>
  Sql: delete from hero order by hurt desc limit 2,2;
</p>
<p>
  <img loading="lazy" decoding="async" width="882" height="66" src="/wp-content/uploads/2018/05/word-image-1060.png" class="wp-image-1172" srcset="/wp-content/uploads/2018/05/word-image-1060.png 882w, /wp-content/uploads/2018/05/word-image-1060-300x22.png 300w, /wp-content/uploads/2018/05/word-image-1060-768x57.png 768w" sizes="(max-width: 882px) 100vw, 882px" />
</p>
<h2>Truncate删除</h2>
<p>
  清空表，除了清空表中的数据，还可以把表的自动增长归成1
</p>
<p>
  <img loading="lazy" decoding="async" width="795" height="207" src="/wp-content/uploads/2018/05/word-image-1061.png" class="wp-image-1173" srcset="/wp-content/uploads/2018/05/word-image-1061.png 795w, /wp-content/uploads/2018/05/word-image-1061-300x78.png 300w, /wp-content/uploads/2018/05/word-image-1061-768x200.png 768w" sizes="(max-width: 795px) 100vw, 795px" />
</p>
<p>
  <img loading="lazy" decoding="async" width="975" height="217" src="/wp-content/uploads/2018/05/word-image-1062.png" class="wp-image-1174" srcset="/wp-content/uploads/2018/05/word-image-1062.png 975w, /wp-content/uploads/2018/05/word-image-1062-300x67.png 300w, /wp-content/uploads/2018/05/word-image-1062-768x171.png 768w" sizes="(max-width: 975px) 100vw, 975px" />
</p>
<p>
  Truncate请空表
</p>
<p>
  <img loading="lazy" decoding="async" width="501" height="51" src="/wp-content/uploads/2018/05/word-image-1063.png" class="wp-image-1175" srcset="/wp-content/uploads/2018/05/word-image-1063.png 501w, /wp-content/uploads/2018/05/word-image-1063-300x31.png 300w" sizes="(max-width: 501px) 100vw, 501px" />
</p>
<p>
  清空完成的效果
</p>
<p>
  <img loading="lazy" decoding="async" width="722" height="67" src="/wp-content/uploads/2018/05/word-image-1064.png" class="wp-image-1176" srcset="/wp-content/uploads/2018/05/word-image-1064.png 722w, /wp-content/uploads/2018/05/word-image-1064-300x28.png 300w" sizes="(max-width: 722px) 100vw, 722px" />
</p>
<p>
  <img loading="lazy" decoding="async" width="710" height="205" src="/wp-content/uploads/2018/05/word-image-1065.png" class="wp-image-1177" srcset="/wp-content/uploads/2018/05/word-image-1065.png 710w, /wp-content/uploads/2018/05/word-image-1065-300x87.png 300w" sizes="(max-width: 710px) 100vw, 710px" />
</p>
<h1>联合查询</h1>
<h2>含义</h2>
<p>
  什么是联合查询
</p>
<p>
  联合查询是把两个查询结果放在一起来显示
</p>
<p>
  <img loading="lazy" decoding="async" width="568" height="282" src="/wp-content/uploads/2018/05/word-image-1066.png" class="wp-image-1178" srcset="/wp-content/uploads/2018/05/word-image-1066.png 568w, /wp-content/uploads/2018/05/word-image-1066-300x149.png 300w" sizes="(max-width: 568px) 100vw, 568px" />
</p>
<p>
  联合查询就是把这个两个展示出来的结果放在一块展示
</p>
<p>
  <img loading="lazy" decoding="async" width="792" height="247" src="/wp-content/uploads/2018/05/word-image-1067.png" class="wp-image-1179" srcset="/wp-content/uploads/2018/05/word-image-1067.png 792w, /wp-content/uploads/2018/05/word-image-1067-300x94.png 300w, /wp-content/uploads/2018/05/word-image-1067-768x240.png 768w" sizes="(max-width: 792px) 100vw, 792px" />
</p>
<p>
  既然是纵向的连接：首先是字段的个数必须一致
</p>
<h2>基本形式</h2>
<p>
  语法：select 语句  union [all/distinct]  select 语句
</p>
<p>
  <img loading="lazy" decoding="async" width="612" height="165" src="/wp-content/uploads/2018/05/word-image-1068.png" class="wp-image-1180" srcset="/wp-content/uploads/2018/05/word-image-1068.png 612w, /wp-content/uploads/2018/05/word-image-1068-300x81.png 300w" sizes="(max-width: 612px) 100vw, 612px" />
</p>
<h2>注意点</h2>
<ul>
<li>
    第一纵向连接，两个结果集字段数量必须一致
  </li>
<li>
    第二如果需要对连接过后的结果集 进行排序那么必须把两个select语句用小括号包括起来
  </li>
</ul>
<p>
  <img loading="lazy" decoding="async" width="741" height="41" src="/wp-content/uploads/2018/05/word-image-1069.png" class="wp-image-1181" srcset="/wp-content/uploads/2018/05/word-image-1069.png 741w, /wp-content/uploads/2018/05/word-image-1069-300x17.png 300w" sizes="(max-width: 741px) 100vw, 741px" />
</p>
<p>
  这个order by是对联合过后的结果进行排序
</p>
<ul>
<li>
    第三如果我们前边的select 语句查询的结果字段名，有别名，那么排序的时候必须用别名
  </li>
</ul>
<p>
  <img loading="lazy" decoding="async" width="916" height="49" src="/wp-content/uploads/2018/05/word-image-1070.png" class="wp-image-1182" srcset="/wp-content/uploads/2018/05/word-image-1070.png 916w, /wp-content/uploads/2018/05/word-image-1070-300x16.png 300w, /wp-content/uploads/2018/05/word-image-1070-768x41.png 768w" sizes="(max-width: 916px) 100vw, 916px" />
</p>
<p>
  <img loading="lazy" decoding="async" width="910" height="48" src="/wp-content/uploads/2018/05/word-image-1071.png" class="wp-image-1183" srcset="/wp-content/uploads/2018/05/word-image-1071.png 910w, /wp-content/uploads/2018/05/word-image-1071-300x16.png 300w, /wp-content/uploads/2018/05/word-image-1071-768x41.png 768w" sizes="(max-width: 910px) 100vw, 910px" />
</p>
<p>
  错误原因：因为联合查询出来的结果集中没有id这个字段名，原来的id改成了编号，如果想用id进行排序，难么只能使用 ‘编号’这个名称；
</p>
<ul>
<li>
    第四联合查询结果的字段名，默认是第一个select语句查询出来的字段名
  </li>
</ul>
<p>
  <img loading="lazy" decoding="async" width="710" height="477" src="/wp-content/uploads/2018/05/word-image-1072.png" class="wp-image-1184" srcset="/wp-content/uploads/2018/05/word-image-1072.png 710w, /wp-content/uploads/2018/05/word-image-1072-300x202.png 300w" sizes="(max-width: 710px) 100vw, 710px" /></p>
]]></content:encoded>
					
					<wfw:commentRss>/%e6%95%b0%e6%8d%ae%e5%ba%93/mysql/1121.html/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Mysql（四）子查询数据库备份还原、 用户权限、 表关系、 连接查询</title>
		<link>/%e6%95%b0%e6%8d%ae%e5%ba%93/mysql/1186.html</link>
					<comments>/%e6%95%b0%e6%8d%ae%e5%ba%93/mysql/1186.html#respond</comments>
		
		<dc:creator><![CDATA[Mr.Lee]]></dc:creator>
		<pubDate>Thu, 17 May 2018 17:11:12 +0000</pubDate>
				<category><![CDATA[Mysql]]></category>
		<category><![CDATA[子查询数据库备份还原]]></category>
		<category><![CDATA[用户权限]]></category>
		<category><![CDATA[表关系]]></category>
		<category><![CDATA[连接查询]]></category>
		<guid isPermaLink="false">/?p=1186</guid>

					<description><![CDATA[连接查询 表与表的关系 公用的字段来关联表 一对一 一对多 多对多 一对一的关系 老婆和老公（法律上） 人和身 [&#8230;]]]></description>
										<content:encoded><![CDATA[<h1>连接查询</h1>
<h2>表与表的关系</h2>
<p>
  公用的字段来关联表
</p>
<h3>一对一</h3>
<p>
  <img loading="lazy" decoding="async" width="1248" height="177" src="/wp-content/uploads/2018/05/word-image-1073.png" class="wp-image-1187" srcset="/wp-content/uploads/2018/05/word-image-1073.png 1248w, /wp-content/uploads/2018/05/word-image-1073-300x43.png 300w, /wp-content/uploads/2018/05/word-image-1073-768x109.png 768w, /wp-content/uploads/2018/05/word-image-1073-1024x145.png 1024w" sizes="(max-width: 1248px) 100vw, 1248px" />
</p>
<h3>一对多</h3>
<p>
  <img loading="lazy" decoding="async" width="1491" height="259" src="/wp-content/uploads/2018/05/word-image-1074.png" class="wp-image-1188" srcset="/wp-content/uploads/2018/05/word-image-1074.png 1491w, /wp-content/uploads/2018/05/word-image-1074-300x52.png 300w, /wp-content/uploads/2018/05/word-image-1074-768x133.png 768w, /wp-content/uploads/2018/05/word-image-1074-1024x178.png 1024w" sizes="(max-width: 1491px) 100vw, 1491px" />
</p>
<h3>多对多</h3>
<p>
  <img loading="lazy" decoding="async" width="1197" height="312" src="/wp-content/uploads/2018/05/word-image-1075.png" class="wp-image-1189" srcset="/wp-content/uploads/2018/05/word-image-1075.png 1197w, /wp-content/uploads/2018/05/word-image-1075-300x78.png 300w, /wp-content/uploads/2018/05/word-image-1075-768x200.png 768w, /wp-content/uploads/2018/05/word-image-1075-1024x267.png 1024w" sizes="(max-width: 1197px) 100vw, 1197px" />
</p>
<ul>
<li><strong>一对一的关系</strong>
  </li>
</ul>
<p><strong>		    老婆和老公（法律上）</strong>
</p>
<p><strong>		    人和身份证号</strong>
</p>
<ul>
<li><strong>一对多的关系</strong>
  </li>
</ul>
<p><strong>		    父亲和孩子</strong>
</p>
<ul>
<li><strong>多对多的关系</strong>
  </li>
</ul>
<p><strong>		   学生和老师</strong>
</p>
<h2>连接查询的概念</h2>
<p>
  什么是连接查询
</p>
<p>
  	【通过公用字段】把两张表进行横向的拼接就是连接查询
</p>
<p>
  比如A表有3个字段，B表有5个字段，那么连接查询后的结果最多有8个字段
</p>
<h2>连接查询分类</h2>
<h3>交叉连接</h3>
<p>
  [Cross] join   交差连接没有条件，这里没有公用字段
</p>
<p>
  交差连接就是左边*右表
</p>
<p>
  <img loading="lazy" decoding="async" width="1057" height="386" src="/wp-content/uploads/2018/05/word-image-1076.png" class="wp-image-1190" srcset="/wp-content/uploads/2018/05/word-image-1076.png 1057w, /wp-content/uploads/2018/05/word-image-1076-300x110.png 300w, /wp-content/uploads/2018/05/word-image-1076-768x280.png 768w, /wp-content/uploads/2018/05/word-image-1076-1024x374.png 1024w" sizes="(max-width: 1057px) 100vw, 1057px" />
</p>
<p>
  语法实现: select ….from  A  cross join  B……….
</p>
<p>
  <img loading="lazy" decoding="async" width="1049" height="261" src="/wp-content/uploads/2018/05/word-image-1077.png" class="wp-image-1191" srcset="/wp-content/uploads/2018/05/word-image-1077.png 1049w, /wp-content/uploads/2018/05/word-image-1077-300x75.png 300w, /wp-content/uploads/2018/05/word-image-1077-768x191.png 768w, /wp-content/uploads/2018/05/word-image-1077-1024x255.png 1024w" sizes="(max-width: 1049px) 100vw, 1049px" />
</p>
<h3>内连接</h3>
<p>
  Inner join /  join
</p>
<p>
  根据公用字段来进行横向连接，只返回满足条件的部分
</p>
<p>
  语法  select …. From 表1 inner join 表2  on 连接的条件….
</p>
<p>
  <img loading="lazy" decoding="async" width="1013" height="180" src="/wp-content/uploads/2018/05/word-image-1078.png" class="wp-image-1192" srcset="/wp-content/uploads/2018/05/word-image-1078.png 1013w, /wp-content/uploads/2018/05/word-image-1078-300x53.png 300w, /wp-content/uploads/2018/05/word-image-1078-768x136.png 768w" sizes="(max-width: 1013px) 100vw, 1013px" />
</p>
<p>
  <img loading="lazy" decoding="async" width="1547" height="222" src="/wp-content/uploads/2018/05/word-image-1079.png" class="wp-image-1193" srcset="/wp-content/uploads/2018/05/word-image-1079.png 1547w, /wp-content/uploads/2018/05/word-image-1079-300x43.png 300w, /wp-content/uploads/2018/05/word-image-1079-768x110.png 768w, /wp-content/uploads/2018/05/word-image-1079-1024x147.png 1024w" sizes="(max-width: 1547px) 100vw, 1547px" />
</p>
<p>
  内连接：只返回满足条件 （公用字段班级id相同的）记录横向连接的结果
</p>
<p>
  内连接如果不加on条件就变成了交差连接
</p>
<p>
  说白了，如果有条件就是内连接，没有条件就是交差连接
</p>
<h3>左连接</h3>
<p>
  左连接就是返回左表的全部数据，和满足条件的右表的数据
</p>
<p>
  语法: select … from 表1 left join 表2  on条件  …….
</p>
<p>
  select * from class left join student on  class.id=student.class_id;
</p>
<p>
  <img loading="lazy" decoding="async" width="970" height="162" src="/wp-content/uploads/2018/05/word-image-1080.png" class="wp-image-1194" srcset="/wp-content/uploads/2018/05/word-image-1080.png 970w, /wp-content/uploads/2018/05/word-image-1080-300x50.png 300w, /wp-content/uploads/2018/05/word-image-1080-768x128.png 768w" sizes="(max-width: 970px) 100vw, 970px" />
</p>
<p>
  如果左边表没有满足条件的右边表数据，会自动补null，并且显示出来
</p>
<h3>右连接</h3>
<p>
  右连接，返回右表全部数据，和满足条件的左表数据
</p>
<p><strong>右边表如果没有满足条件的左表数据，会在左边自动补充Null 并且显示出来</strong>
</p>
<p>
  语法 :select … from 表1 right join 表2  on条件  …….
</p>
<p>
  Select * from class right join student on class.id=student.class_id;
</p>
<p>
  <img loading="lazy" decoding="async" width="960" height="162" src="/wp-content/uploads/2018/05/word-image-1081.png" class="wp-image-1195" srcset="/wp-content/uploads/2018/05/word-image-1081.png 960w, /wp-content/uploads/2018/05/word-image-1081-300x51.png 300w, /wp-content/uploads/2018/05/word-image-1081-768x130.png 768w" sizes="(max-width: 960px) 100vw, 960px" />
</p>
<h3>总结比较，内连接 左连接 右连接</h3>
<p>
  内连接：只返回满足条件的数据
</p>
<p>
  左连接：返回满足条件的数据和左表的所有数据 （比内连接多数据&#8212;-左边中不满足条件的记录）
</p>
<p>
  右连接：返回满足条件的数据和右表的所有数据 （比内连接多数据&#8212;-右表中不满足条件的数据）
</p>
<h3>全连接</h3>
<p>
  MySQL没有全连接  full  join
</p>
<p>
  返回的是左表全内容，和右表全部内容，满足条件的内容
</p>
<p>
  左连接的结果  union  右连接的结果
</p>
<h2>课堂练习</h2>
<ul>
<li>
    谁考试不及格
  </li>
<li>
    猪八戒都有哪些学生
  </li>
<li>
    谁参加了2门以上的考试
  </li>
<li>
    哪个几个班级有姓周的同学
  </li>
<li>
    年龄最大前三位同学在那间教室上课
  </li>
</ul>
<p>
  以下练习：要求有能力的学生自己再琢磨一种更好的连接方式
</p>
<ul>
<li>
    列出相对应的班级名,学生名,考试成绩信息
  </li>
</ul>
<h1>子查询</h1>
<h2>子查询的概念</h2>
<p>
  子查询就在一个查询select语句中还有select语句，那么这些select都是子查询
</p>
<p>
  一般来说子查询的结果一般在主查询中用于，数据来源，条件数，结果数据
</p>
<p>
  <img loading="lazy" decoding="async" width="1003" height="81" src="/wp-content/uploads/2018/05/word-image-1082.png" class="wp-image-1196" srcset="/wp-content/uploads/2018/05/word-image-1082.png 1003w, /wp-content/uploads/2018/05/word-image-1082-300x24.png 300w, /wp-content/uploads/2018/05/word-image-1082-768x62.png 768w" sizes="(max-width: 1003px) 100vw, 1003px" />
</p>
<h3>主查询</h3>
<p>
  确定结果字段的select语句就是主查询
</p>
<p>
  <img loading="lazy" decoding="async" width="834" height="76" src="/wp-content/uploads/2018/05/word-image-1083.png" class="wp-image-1197" srcset="/wp-content/uploads/2018/05/word-image-1083.png 834w, /wp-content/uploads/2018/05/word-image-1083-300x27.png 300w, /wp-content/uploads/2018/05/word-image-1083-768x70.png 768w" sizes="(max-width: 834px) 100vw, 834px" />
</p>
<h2>子查询分类</h2>
<h3>按返回结果</h3>
<h4>标量子查询</h4>
<p>
  子查询返回的结果是一个数据，一行一列
</p>
<ul>
<li>
    301房间都有谁上课
  </li>
</ul>
<p>
  select * from t_student where class_id =(select id from t_class where classroom=&#8217;301房间&#8217;);
</p>
<p>
  <img loading="lazy" decoding="async" width="1034" height="182" src="/wp-content/uploads/2018/05/word-image-1084.png" class="wp-image-1198" srcset="/wp-content/uploads/2018/05/word-image-1084.png 1034w, /wp-content/uploads/2018/05/word-image-1084-300x53.png 300w, /wp-content/uploads/2018/05/word-image-1084-768x135.png 768w, /wp-content/uploads/2018/05/word-image-1084-1024x180.png 1024w" sizes="(max-width: 1034px) 100vw, 1034px" />
</p>
<p>
  子查询中返回的数据是一行一列，这种子查询就是标量查询
</p>
<ul>
<li>
    猪八戒都有哪些学生
  </li>
</ul>
<h4>列子查询</h4>
<p>
  从子查询中返回的结果是多行一列就是列子查询
</p>
<ul>
<li>
    班级有女生的班主任是谁
  </li>
</ul>
<p>
  select * from t_class where id in (select class_id from t_student where sex=&#8217;女&#8217;);
</p>
<p>
  <img loading="lazy" decoding="async" width="968" height="163" src="/wp-content/uploads/2018/05/word-image-1085.png" class="wp-image-1199" srcset="/wp-content/uploads/2018/05/word-image-1085.png 968w, /wp-content/uploads/2018/05/word-image-1085-300x51.png 300w, /wp-content/uploads/2018/05/word-image-1085-768x129.png 768w" sizes="(max-width: 968px) 100vw, 968px" />
</p>
<p>
  子查询返回的是多行一列的数据&#8212;列子查询
</p>
<ul>
<li>
    哪些班级学生年龄超过了30岁
  </li>
</ul>
<p>
  select * from t_class where id in (select class_id from t_student where age&gt;30);
</p>
<h4>行子查询</h4>
<p>
  子查询的结果返回的是多列一行
</p>
<ul>
<li>
    和周杰伦性别一样，在同一间教室上课的人
  </li>
</ul>
<p>
  第一步：找到周杰伦的性别和班级id
</p>
<p>
  select sex,class_id from t_student where name=&#8217;周杰伦&#8217;;
</p>
<p>
  第二步：构建子查询
</p>
<p>
  select * from t_student where (sex,class_id)=(select sex,class_id from t_student where name=&#8217;周杰伦&#8217;);
</p>
<p>
  <img loading="lazy" decoding="async" width="1142" height="217" src="/wp-content/uploads/2018/05/word-image-1086.png" class="wp-image-1200" srcset="/wp-content/uploads/2018/05/word-image-1086.png 1142w, /wp-content/uploads/2018/05/word-image-1086-300x57.png 300w, /wp-content/uploads/2018/05/word-image-1086-768x146.png 768w, /wp-content/uploads/2018/05/word-image-1086-1024x195.png 1024w" sizes="(max-width: 1142px) 100vw, 1142px" />
</p>
<p>
  第三步：把周杰伦本省过滤掉
</p>
<p>
  select * from t_student where (sex,class_id)=(select sex,class_id from t_student where name=&#8217;周杰伦&#8217;)
</p>
<p>
  and name &lt;&gt; &#8216;周杰伦&#8217;;
</p>
<p>
  <img loading="lazy" decoding="async" width="1310" height="199" src="/wp-content/uploads/2018/05/word-image-1087.png" class="wp-image-1201" srcset="/wp-content/uploads/2018/05/word-image-1087.png 1310w, /wp-content/uploads/2018/05/word-image-1087-300x46.png 300w, /wp-content/uploads/2018/05/word-image-1087-768x117.png 768w, /wp-content/uploads/2018/05/word-image-1087-1024x156.png 1024w" sizes="(max-width: 1310px) 100vw, 1310px" />
</p>
<h4>表子查询</h4>
<p>
  子查询是作为数据的来源使用 一般是在from后边，返回的信息是多行多列
</p>
<ul>
<li>
    用表子查询，找所有姓周的男生
  </li>
</ul>
<p>
  select * from (select * from t_student where sex=&#8217;男&#8217;) as tb where tb.name like &#8216;周%&#8217;;
</p>
<p>
  或select * from (select * from t_student where name like &#8216;周%&#8217;) as tb where tb.sex=&#8217;男&#8217;;
</p>
<p>
  <img loading="lazy" decoding="async" width="1172" height="355" src="/wp-content/uploads/2018/05/word-image-1088.png" class="wp-image-1202" srcset="/wp-content/uploads/2018/05/word-image-1088.png 1172w, /wp-content/uploads/2018/05/word-image-1088-300x91.png 300w, /wp-content/uploads/2018/05/word-image-1088-768x233.png 768w, /wp-content/uploads/2018/05/word-image-1088-1024x310.png 1024w" sizes="(max-width: 1172px) 100vw, 1172px" />
</p>
<h4>Exists子查询</h4>
<p>
  Exitsts 是存在，如果存在返回1，如果不存在返回0
</p>
<ul>
<li>
    有考试满分的学生显示所有班级名称
  </li>
</ul>
<p>
  select  class from t_class exists (select * from t_result where result=100);
</p>
<p>
  如果查询出来的结果有那么条件成立
</p>
<p>
  如果查询不出来信息那么条件不通过
</p>
<p>
  <img loading="lazy" decoding="async" width="996" height="212" src="/wp-content/uploads/2018/05/word-image-1089.png" class="wp-image-1203" srcset="/wp-content/uploads/2018/05/word-image-1089.png 996w, /wp-content/uploads/2018/05/word-image-1089-300x64.png 300w, /wp-content/uploads/2018/05/word-image-1089-768x163.png 768w" sizes="(max-width: 996px) 100vw, 996px" />
</p>
<h3>按试用场合</h3>
<h4>作为主查询的结果数据</h4>
<p>  <img loading="lazy" decoding="async" width="851" height="244" src="/wp-content/uploads/2018/05/word-image-1090.png" class="wp-image-1204" srcset="/wp-content/uploads/2018/05/word-image-1090.png 851w, /wp-content/uploads/2018/05/word-image-1090-300x86.png 300w, /wp-content/uploads/2018/05/word-image-1090-768x220.png 768w" sizes="(max-width: 851px) 100vw, 851px" />
</p>
<h4>作为主查询的条件数据</h4>
<p>
  	子查询在where条件里边
</p>
<p>
  	Having
</p>
<p>
  	on
</p>
<h4>作为主查询的来源数据</h4>
<p>
  	子查询在from后边
</p>
<h2>子查询中特定关键字</h2>
<h3>in关键字</h3>
<p>
   在什么范围中
</p>
<p>
   Not  in 标识不再范围中
</p>
<ul>
<li>
    有男生的班级都有哪些
  </li>
</ul>
<p>
  第一步：先找男生的班级id  去重
</p>
<p>
     Select  distinct class_id from t_student where sex=’男’;
</p>
<p>
  第二步：根据男生班级的id在班级表中找到班级的名字
</p>
<p>
  select class from t_class where id in (Select distinct class_id from t_student where sex=&#8217;男&#8217;);
</p>
<p>
  <img loading="lazy" decoding="async" width="1082" height="188" src="/wp-content/uploads/2018/05/word-image-1091.png" class="wp-image-1205" srcset="/wp-content/uploads/2018/05/word-image-1091.png 1082w, /wp-content/uploads/2018/05/word-image-1091-300x52.png 300w, /wp-content/uploads/2018/05/word-image-1091-768x133.png 768w, /wp-content/uploads/2018/05/word-image-1091-1024x178.png 1024w" sizes="(max-width: 1082px) 100vw, 1082px" />
</p>
<ul>
<li>
    没有男生的班级都有哪些
  </li>
</ul>
<p>
  <img loading="lazy" decoding="async" width="1120" height="185" src="/wp-content/uploads/2018/05/word-image-1092.png" class="wp-image-1206" srcset="/wp-content/uploads/2018/05/word-image-1092.png 1120w, /wp-content/uploads/2018/05/word-image-1092-300x50.png 300w, /wp-content/uploads/2018/05/word-image-1092-768x127.png 768w, /wp-content/uploads/2018/05/word-image-1092-1024x169.png 1024w" sizes="(max-width: 1120px) 100vw, 1120px" />
</p>
<h3>any关键字</h3>
<p>
  表示满足任意一个条件即可
</p>
<ul>
<li>
    找出比任意一个姓周的年龄大的学生
  </li>
</ul>
<p>
  第一步：找出所有姓周的年龄
</p>
<p>
  select age from t_student where name like &#8216;周%&#8217;;
</p>
<p>
  第二：根据所有姓周的学生年龄来找比其年龄大的人
</p>
<p>
  select name,age from t_student where age &gt; any (select age from t_student where name like &#8216;周%&#8217;);
</p>
<p>
  <img loading="lazy" decoding="async" width="1088" height="181" src="/wp-content/uploads/2018/05/word-image-1093.png" class="wp-image-1207" srcset="/wp-content/uploads/2018/05/word-image-1093.png 1088w, /wp-content/uploads/2018/05/word-image-1093-300x50.png 300w, /wp-content/uploads/2018/05/word-image-1093-768x128.png 768w, /wp-content/uploads/2018/05/word-image-1093-1024x170.png 1024w" sizes="(max-width: 1088px) 100vw, 1088px" />
</p>
<h3>all关键字</h3>
<p>
  表示满足所有的条件
</p>
<ul>
<li>
    找出比所有姓周的年龄小的学生
  </li>
</ul>
<p>
  第一步：找出所有姓周的年龄
</p>
<p>
  select age from t_student where name like &#8216;周%&#8217;;
</p>
<p>
  第二步：根据所有姓周年龄找结果字段数据
</p>
<p>
  select name,age from t_student where age &lt; all (select age from t_student where name like &#8216;周%&#8217;);
</p>
<p>
  <img loading="lazy" decoding="async" width="1119" height="254" src="/wp-content/uploads/2018/05/word-image-1094.png" class="wp-image-1208" srcset="/wp-content/uploads/2018/05/word-image-1094.png 1119w, /wp-content/uploads/2018/05/word-image-1094-300x68.png 300w, /wp-content/uploads/2018/05/word-image-1094-768x174.png 768w, /wp-content/uploads/2018/05/word-image-1094-1024x232.png 1024w" sizes="(max-width: 1119px) 100vw, 1119px" />
</p>
<h1>数据的备份还原</h1>
<h2>备份还原的意义</h2>
<p>
  防范于未然，保证数据的安全性和完整性，网站最重要的就是数据，如果没有数据，你这个就是镜中花水中月
</p>
<h2>文件备份</h2>
<p>
  <img loading="lazy" decoding="async" width="847" height="68" src="/wp-content/uploads/2018/05/word-image-1095.png" class="wp-image-1209" srcset="/wp-content/uploads/2018/05/word-image-1095.png 847w, /wp-content/uploads/2018/05/word-image-1095-300x24.png 300w, /wp-content/uploads/2018/05/word-image-1095-768x62.png 768w" sizes="(max-width: 847px) 100vw, 847px" />
</p>
<p>
  <img loading="lazy" decoding="async" width="1018" height="414" src="/wp-content/uploads/2018/05/word-image-1096.png" class="wp-image-1210" srcset="/wp-content/uploads/2018/05/word-image-1096.png 1018w, /wp-content/uploads/2018/05/word-image-1096-300x122.png 300w, /wp-content/uploads/2018/05/word-image-1096-768x312.png 768w" sizes="(max-width: 1018px) 100vw, 1018px" />
</p>
<p>
  数据库的本质就是文件，数据都是存放在文件中，我们把这个文件夹中的文件复制出来一份，是不是就是把当前数据库进行了备份呢？&#8212;&#8211;不一定
</p>
<p>
  这样的备份是有要求的，要这个数据库的表数据引擎必须是myisam的
</p>
<p>
  测试：
</p>
<p>
  创建数据库，数据表
</p>
<p>
  <img loading="lazy" decoding="async" width="830" height="194" src="/wp-content/uploads/2018/05/word-image-1097.png" class="wp-image-1211" srcset="/wp-content/uploads/2018/05/word-image-1097.png 830w, /wp-content/uploads/2018/05/word-image-1097-300x70.png 300w, /wp-content/uploads/2018/05/word-image-1097-768x180.png 768w" sizes="(max-width: 830px) 100vw, 830px" />
</p>
<p>
  <img loading="lazy" decoding="async" width="598" height="341" src="/wp-content/uploads/2018/05/word-image-1098.png" class="wp-image-1212" srcset="/wp-content/uploads/2018/05/word-image-1098.png 598w, /wp-content/uploads/2018/05/word-image-1098-300x171.png 300w" sizes="(max-width: 598px) 100vw, 598px" />
</p>
<p>
  在test表中添加测试数据
</p>
<p>
  <img loading="lazy" decoding="async" width="731" height="202" src="/wp-content/uploads/2018/05/word-image-1099.png" class="wp-image-1213" srcset="/wp-content/uploads/2018/05/word-image-1099.png 731w, /wp-content/uploads/2018/05/word-image-1099-300x83.png 300w" sizes="(max-width: 731px) 100vw, 731px" />
</p>
<p>
  复制lzh文件夹，重命名
</p>
<p>
  <img loading="lazy" decoding="async" width="1133" height="288" src="/wp-content/uploads/2018/05/word-image-1100.png" class="wp-image-1214" srcset="/wp-content/uploads/2018/05/word-image-1100.png 1133w, /wp-content/uploads/2018/05/word-image-1100-300x76.png 300w, /wp-content/uploads/2018/05/word-image-1100-768x195.png 768w, /wp-content/uploads/2018/05/word-image-1100-1024x260.png 1024w" sizes="(max-width: 1133px) 100vw, 1133px" />
</p>
<p>
  查看数据库
</p>
<p>
  <img loading="lazy" decoding="async" width="929" height="543" src="/wp-content/uploads/2018/05/word-image-1101.png" class="wp-image-1215" srcset="/wp-content/uploads/2018/05/word-image-1101.png 929w, /wp-content/uploads/2018/05/word-image-1101-300x175.png 300w, /wp-content/uploads/2018/05/word-image-1101-768x449.png 768w" sizes="(max-width: 929px) 100vw, 929px" />
</p>
<p>
  操作lzh1数据库
</p>
<p>
  <img loading="lazy" decoding="async" width="911" height="329" src="/wp-content/uploads/2018/05/word-image-1102.png" class="wp-image-1216" srcset="/wp-content/uploads/2018/05/word-image-1102.png 911w, /wp-content/uploads/2018/05/word-image-1102-300x108.png 300w, /wp-content/uploads/2018/05/word-image-1102-768x277.png 768w" sizes="(max-width: 911px) 100vw, 911px" />
</p>
<p>
  这种文件备份数据库只能备份myisam数据库引擎的数据表
</p>
<h2>整库备份</h2>
<p>
  用到了一个mysqldump工具来进行备份数据库，备份出来的数据是保存到一个.sql文件中的
</p>
<p>
  <img loading="lazy" decoding="async" width="1110" height="358" src="/wp-content/uploads/2018/05/word-image-1103.png" class="wp-image-1217" srcset="/wp-content/uploads/2018/05/word-image-1103.png 1110w, /wp-content/uploads/2018/05/word-image-1103-300x97.png 300w, /wp-content/uploads/2018/05/word-image-1103-768x248.png 768w, /wp-content/uploads/2018/05/word-image-1103-1024x330.png 1024w" sizes="(max-width: 1110px) 100vw, 1110px" />
</p>
<p>
  具体的使用方式是如下
</p>
<p>
  Mysqldump -h主机名 -P端口 -u 用户名 -p  数据库名 &gt; sql文件的地址
</p>
<p>
  如果主机名和端口号都是默认的那么可以省略
</p>
<p>
  案例:把db1数据库备份
</p>
<p>
  备份的时候一定要退出数据库连接
</p>
<p>
   Mysqldump  -uroot  -proot  db1 &gt;C:/db1.sql;
</p>
<p>
  <img loading="lazy" decoding="async" width="1376" height="393" src="/wp-content/uploads/2018/05/word-image-1104.png" class="wp-image-1218" srcset="/wp-content/uploads/2018/05/word-image-1104.png 1376w, /wp-content/uploads/2018/05/word-image-1104-300x86.png 300w, /wp-content/uploads/2018/05/word-image-1104-768x219.png 768w, /wp-content/uploads/2018/05/word-image-1104-1024x292.png 1024w" sizes="(max-width: 1376px) 100vw, 1376px" />
</p>
<h2>单表备份</h2>
<p>
  使用MySQLdump工具来备份
</p>
<p>
  使用方式
</p>
<p>
  Mysqldump -h主机名 -P端口 -u 用户名 -p  数据库名 表名 &gt; sql文件的地址
</p>
<p>
  如果主机名和端口号都是默认的那么可以省略
</p>
<p>
  <img loading="lazy" decoding="async" width="1455" height="382" src="/wp-content/uploads/2018/05/word-image-1105.png" class="wp-image-1219" srcset="/wp-content/uploads/2018/05/word-image-1105.png 1455w, /wp-content/uploads/2018/05/word-image-1105-300x79.png 300w, /wp-content/uploads/2018/05/word-image-1105-768x202.png 768w, /wp-content/uploads/2018/05/word-image-1105-1024x269.png 1024w" sizes="(max-width: 1455px) 100vw, 1455px" />
</p>
<p>
  Db1.sql里边只用class表的定义sql和数据插入的sql没有其他表的sql
</p>
<h2>多表备份</h2>
<p>
  使用MySQLdump工具来备份
</p>
<p>
  使用方式
</p>
<p>
  Mysqldump -h主机名 -P端口 -u 用户名 -p  数据库名 表名1   表名2….. &gt; sql文件的地址
</p>
<p>
  如果主机名和端口号都是默认的那么可以省略
</p>
<p>
  <img loading="lazy" decoding="async" width="1543" height="373" src="/wp-content/uploads/2018/05/word-image-1106.png" class="wp-image-1220" srcset="/wp-content/uploads/2018/05/word-image-1106.png 1543w, /wp-content/uploads/2018/05/word-image-1106-300x73.png 300w, /wp-content/uploads/2018/05/word-image-1106-768x186.png 768w, /wp-content/uploads/2018/05/word-image-1106-1024x248.png 1024w" sizes="(max-width: 1543px) 100vw, 1543px" />
</p>
<p>
  Db1.sql文件中只有class 和 student表的相关sql语句没有其他表的sql
</p>
<h2>还原</h2>
<h3>工具还原</h3>
<p>
  Mysql工具还原数据
</p>
<p>
  <img loading="lazy" decoding="async" width="1193" height="390" src="/wp-content/uploads/2018/05/word-image-1107.png" class="wp-image-1221" srcset="/wp-content/uploads/2018/05/word-image-1107.png 1193w, /wp-content/uploads/2018/05/word-image-1107-300x98.png 300w, /wp-content/uploads/2018/05/word-image-1107-768x251.png 768w, /wp-content/uploads/2018/05/word-image-1107-1024x335.png 1024w" sizes="(max-width: 1193px) 100vw, 1193px" />
</p>
<p>
  使用方式   使用还原的时候要退出mysql连接
</p>
<p>
  	Mysql  -h主机名  -P端口号  -u用户名 -p密码  数据库名  &lt; sql文件的地址路径
</p>
<p>
  <img loading="lazy" decoding="async" width="1467" height="346" src="/wp-content/uploads/2018/05/word-image-1108.png" class="wp-image-1222" srcset="/wp-content/uploads/2018/05/word-image-1108.png 1467w, /wp-content/uploads/2018/05/word-image-1108-300x71.png 300w, /wp-content/uploads/2018/05/word-image-1108-768x181.png 768w, /wp-content/uploads/2018/05/word-image-1108-1024x242.png 1024w" sizes="(max-width: 1467px) 100vw, 1467px" />
</p>
<p>
  查看bbss数据库
</p>
<p>
  <img loading="lazy" decoding="async" width="764" height="131" src="/wp-content/uploads/2018/05/word-image-1109.png" class="wp-image-1223" srcset="/wp-content/uploads/2018/05/word-image-1109.png 764w, /wp-content/uploads/2018/05/word-image-1109-300x51.png 300w" sizes="(max-width: 764px) 100vw, 764px" />
</p>
<h3>source还原</h3>
<p>
  source是一个命令，用来还原数据文件到数据库
</p>
<p>
  用法: source  数据库sql文件路径;
</p>
<p>
  前提：你得连接数据库进入到你需要还原的数据库里边
</p>
<p>
  <img loading="lazy" decoding="async" width="840" height="184" src="/wp-content/uploads/2018/05/word-image-1110.png" class="wp-image-1224" srcset="/wp-content/uploads/2018/05/word-image-1110.png 840w, /wp-content/uploads/2018/05/word-image-1110-300x66.png 300w, /wp-content/uploads/2018/05/word-image-1110-768x168.png 768w" sizes="(max-width: 840px) 100vw, 840px" />
</p>
<h2>增量备份了解</h2>
<p>
  例如：
</p>
<p>
  	九月份我备份了30次
</p>
<p>
  	1号备份直到一号的数据库
</p>
<p>
  	2号备份 一号到二号的数据 &#8212;-一号一天的数据
</p>
<p>
  3号备份 二号到三号的数据 &#8212;-二号一天的数据
</p>
<p>
  ………
</p>
<p>
  这样的备份就是增量备份&#8212;每天只备份不重复的一部分，这些部分加起来就是整个数据库
</p>
<p>
  每次备份，数据量小，备份速度快
</p>
<p>
  还原的时候，比较麻烦，还有就是还原的数据有时间的先后问题，只能先还原先备份的数据，在根据时间的顺序还原，如果有一次还原失败，整体数据都会失败，也就是还原不成功
</p>
<h1>用户权限管理</h1>
<h2>用户权限管理的必要性</h2>
<p>
  在项目开发中不同的人员对数据库有不同的权限需求，我们要尽量给这些工作人员小的权限
</p>
<p>
  避免误删，或是破坏数据库的安全性和完整性
</p>
<h2>用户管理</h2>
<h3>用户信息的保存&amp;含义</h3>
<p>
  <img loading="lazy" decoding="async" width="990" height="122" src="/wp-content/uploads/2018/05/word-image-1111.png" class="wp-image-1225" srcset="/wp-content/uploads/2018/05/word-image-1111.png 990w, /wp-content/uploads/2018/05/word-image-1111-300x37.png 300w, /wp-content/uploads/2018/05/word-image-1111-768x95.png 768w" sizes="(max-width: 990px) 100vw, 990px" />
</p>
<h3>创建用户</h3>
<p>
  语法：
</p>
<p>
  Create user user1@’主机地址’  identified by ‘密码’
</p>
<p>
  <img loading="lazy" decoding="async" width="871" height="239" src="/wp-content/uploads/2018/05/word-image-1112.png" class="wp-image-1226" srcset="/wp-content/uploads/2018/05/word-image-1112.png 871w, /wp-content/uploads/2018/05/word-image-1112-300x82.png 300w, /wp-content/uploads/2018/05/word-image-1112-768x211.png 768w" sizes="(max-width: 871px) 100vw, 871px" />
</p>
<h3>删除用户</h3>
<p>
  语法：
</p>
<p>
  	Drop  user 用户名@’主机地址’;
</p>
<p>
  	<a href="mailto:测试删除uer1@'127.0.0.1">测试删除uer1@’127.0.0.1</a>’;
</p>
<p>
  <img loading="lazy" decoding="async" width="450" height="56" src="/wp-content/uploads/2018/05/word-image-1113.png" class="wp-image-1227" srcset="/wp-content/uploads/2018/05/word-image-1113.png 450w, /wp-content/uploads/2018/05/word-image-1113-300x37.png 300w" sizes="(max-width: 450px) 100vw, 450px" />
</p>
<p>
  <img loading="lazy" decoding="async" width="761" height="144" src="/wp-content/uploads/2018/05/word-image-1114.png" class="wp-image-1228" srcset="/wp-content/uploads/2018/05/word-image-1114.png 761w, /wp-content/uploads/2018/05/word-image-1114-300x57.png 300w" sizes="(max-width: 761px) 100vw, 761px" />
</p>
<h3>修改用户密码</h3>
<p>
  第一种直接修改mysql系统数据下的user表
</p>
<p>
  update user set password=password(&#8216;root&#8217;) where user=&#8217;user1&#8242; and host=&#8217;127.0.0.1&#8242;;
</p>
<p>
  <img loading="lazy" decoding="async" width="1007" height="88" src="/wp-content/uploads/2018/05/word-image-1115.png" class="wp-image-1229" srcset="/wp-content/uploads/2018/05/word-image-1115.png 1007w, /wp-content/uploads/2018/05/word-image-1115-300x26.png 300w, /wp-content/uploads/2018/05/word-image-1115-768x67.png 768w" sizes="(max-width: 1007px) 100vw, 1007px" />
</p>
<p>
  测试使用老密码登录（注意先关闭cmd ,在打开cmd）
</p>
<p>
  <img loading="lazy" decoding="async" width="859" height="85" src="/wp-content/uploads/2018/05/word-image-1116.png" class="wp-image-1230" srcset="/wp-content/uploads/2018/05/word-image-1116.png 859w, /wp-content/uploads/2018/05/word-image-1116-300x30.png 300w, /wp-content/uploads/2018/05/word-image-1116-768x76.png 768w" sizes="(max-width: 859px) 100vw, 859px" />
</p>
<p>
  <img loading="lazy" decoding="async" width="793" height="282" src="/wp-content/uploads/2018/05/word-image-1117.png" class="wp-image-1231" srcset="/wp-content/uploads/2018/05/word-image-1117.png 793w, /wp-content/uploads/2018/05/word-image-1117-300x107.png 300w, /wp-content/uploads/2018/05/word-image-1117-768x273.png 768w" sizes="(max-width: 793px) 100vw, 793px" />
</p>
<p>
  注意重启服务
</p>
<p>
  第二种修改密码
</p>
<p>
  给自己修改密码
</p>
<p>
  Set  password=password(‘abc’);
</p>
<p>
  <img loading="lazy" decoding="async" width="754" height="90" src="/wp-content/uploads/2018/05/word-image-1118.png" class="wp-image-1232" srcset="/wp-content/uploads/2018/05/word-image-1118.png 754w, /wp-content/uploads/2018/05/word-image-1118-300x36.png 300w" sizes="(max-width: 754px) 100vw, 754px" />
</p>
<p>
  <img loading="lazy" decoding="async" width="933" height="308" src="/wp-content/uploads/2018/05/word-image-1119.png" class="wp-image-1233" srcset="/wp-content/uploads/2018/05/word-image-1119.png 933w, /wp-content/uploads/2018/05/word-image-1119-300x99.png 300w, /wp-content/uploads/2018/05/word-image-1119-768x254.png 768w" sizes="(max-width: 933px) 100vw, 933px" />
</p>
<p>
  给别修改密码（管理员权限）
</p>
<p>
  set password for user1@&#8217;127.0.0.1&#8242; =password(&#8216;root&#8217;) ;
</p>
<p>
  <img loading="lazy" decoding="async" width="723" height="138" src="/wp-content/uploads/2018/05/word-image-1120.png" class="wp-image-1234" srcset="/wp-content/uploads/2018/05/word-image-1120.png 723w, /wp-content/uploads/2018/05/word-image-1120-300x57.png 300w" sizes="(max-width: 723px) 100vw, 723px" />
</p>
<p>
  <img loading="lazy" decoding="async" width="927" height="315" src="/wp-content/uploads/2018/05/word-image-1121.png" class="wp-image-1235" srcset="/wp-content/uploads/2018/05/word-image-1121.png 927w, /wp-content/uploads/2018/05/word-image-1121-300x102.png 300w, /wp-content/uploads/2018/05/word-image-1121-768x261.png 768w" sizes="(max-width: 927px) 100vw, 927px" />
</p>
<h2>权限管理</h2>
<p>
  <img loading="lazy" decoding="async" width="937" height="344" src="/wp-content/uploads/2018/05/word-image-1122.png" class="wp-image-1236" srcset="/wp-content/uploads/2018/05/word-image-1122.png 937w, /wp-content/uploads/2018/05/word-image-1122-300x110.png 300w, /wp-content/uploads/2018/05/word-image-1122-768x282.png 768w" sizes="(max-width: 937px) 100vw, 937px" />
</p>
<p>
  Mysql权限表
</p>
<p>
  <img loading="lazy" decoding="async" width="613" height="298" src="/wp-content/uploads/2018/05/word-image-1123.png" class="wp-image-1237" srcset="/wp-content/uploads/2018/05/word-image-1123.png 613w, /wp-content/uploads/2018/05/word-image-1123-300x146.png 300w" sizes="(max-width: 613px) 100vw, 613px" />
</p>
<h3>给用户授权</h3>
<p>
  Grant  权限名 on  库名.表名  to 用户名@’主机地址’；
</p>
<p>
  <img loading="lazy" decoding="async" width="781" height="84" src="/wp-content/uploads/2018/05/word-image-1124.png" class="wp-image-1238" srcset="/wp-content/uploads/2018/05/word-image-1124.png 781w, /wp-content/uploads/2018/05/word-image-1124-300x32.png 300w, /wp-content/uploads/2018/05/word-image-1124-768x83.png 768w" sizes="(max-width: 781px) 100vw, 781px" />
</p>
<p>
  如果想把某一个数据库下的所有表的select给user1怎么做呢？
</p>
<p>
  grant select on bbss.* to <a href="mailto:user1@'127.0.0.1">user1@&#8217;127.0.0.1</a>&#8216;;  &#8212;*代表所有的表
</p>
<p>
  <img loading="lazy" decoding="async" width="773" height="69" src="/wp-content/uploads/2018/05/word-image-1125.png" class="wp-image-1239" srcset="/wp-content/uploads/2018/05/word-image-1125.png 773w, /wp-content/uploads/2018/05/word-image-1125-300x27.png 300w, /wp-content/uploads/2018/05/word-image-1125-768x69.png 768w" sizes="(max-width: 773px) 100vw, 773px" />
</p>
<p>
  如果想把所有数据的所有数据表的select权限都给user1;
</p>
<p>
  grant select on *.* to <a href="mailto:user1@'127.0.0.1">user1@&#8217;127.0.0.1</a>&#8216;;
</p>
<p>
  <img loading="lazy" decoding="async" width="647" height="73" src="/wp-content/uploads/2018/05/word-image-1126.png" class="wp-image-1240" srcset="/wp-content/uploads/2018/05/word-image-1126.png 647w, /wp-content/uploads/2018/05/word-image-1126-300x34.png 300w" sizes="(max-width: 647px) 100vw, 647px" />
</p>
<p>
  注意：赋予权限后，当前的连接不会生效，从新连接数据库后才会生效，有权限缓存的问题
</p>
<h3>收回权限</h3>
<p>
  Revoke 权限名on 数据库名.表名  from 用户名@’主机地址’；
</p>
<p>
  <img loading="lazy" decoding="async" width="733" height="91" src="/wp-content/uploads/2018/05/word-image-1127.png" class="wp-image-1241" srcset="/wp-content/uploads/2018/05/word-image-1127.png 733w, /wp-content/uploads/2018/05/word-image-1127-300x37.png 300w" sizes="(max-width: 733px) 100vw, 733px" />
</p>
<p>
  <img loading="lazy" decoding="async" width="587" height="198" src="/wp-content/uploads/2018/05/word-image-1128.png" class="wp-image-1242" srcset="/wp-content/uploads/2018/05/word-image-1128.png 587w, /wp-content/uploads/2018/05/word-image-1128-300x101.png 300w" sizes="(max-width: 587px) 100vw, 587px" />
</p>
<h3>刷新权限</h3>
<p>
  把权限从数据表中刷新的内存
</p>
<p>
  Flush  privilege;
</p>
<h2>用户密码丢失处理</h2>
<ul>
<li>
    开启服务  跳过权限认证
  </li>
</ul>
<p>
  mysqld &#8211;skip-grant-tables
</p>
<p>
  <img loading="lazy" decoding="async" width="881" height="156" src="/wp-content/uploads/2018/05/word-image-1129.png" class="wp-image-1243" srcset="/wp-content/uploads/2018/05/word-image-1129.png 881w, /wp-content/uploads/2018/05/word-image-1129-300x53.png 300w, /wp-content/uploads/2018/05/word-image-1129-768x136.png 768w" sizes="(max-width: 881px) 100vw, 881px" />
</p>
<ul>
<li>
    连接服务器  这时候不需要用户名 和密码
  </li>
</ul>
<p>
  Mysql
</p>
<p>
  <img loading="lazy" decoding="async" width="840" height="298" src="/wp-content/uploads/2018/05/word-image-1130.png" class="wp-image-1244" srcset="/wp-content/uploads/2018/05/word-image-1130.png 840w, /wp-content/uploads/2018/05/word-image-1130-300x106.png 300w, /wp-content/uploads/2018/05/word-image-1130-768x272.png 768w" sizes="(max-width: 840px) 100vw, 840px" />
</p>
<ul>
<li>
    修改密码
  </li>
</ul>
<p>
  update mysql.user set password=password(&#8216;abc&#8217;) where user=&#8217;root&#8217; and host=&#8217;localhost&#8217;;
</p>
<p>
  <img loading="lazy" decoding="async" width="973" height="237" src="/wp-content/uploads/2018/05/word-image-1131.png" class="wp-image-1245" srcset="/wp-content/uploads/2018/05/word-image-1131.png 973w, /wp-content/uploads/2018/05/word-image-1131-300x73.png 300w, /wp-content/uploads/2018/05/word-image-1131-768x187.png 768w" sizes="(max-width: 973px) 100vw, 973px" />
</p>
<ul>
<li>
    重启服务
  </li>
</ul>
<p>
  <img loading="lazy" decoding="async" width="801" height="345" src="/wp-content/uploads/2018/05/word-image-1132.png" class="wp-image-1246" srcset="/wp-content/uploads/2018/05/word-image-1132.png 801w, /wp-content/uploads/2018/05/word-image-1132-300x129.png 300w, /wp-content/uploads/2018/05/word-image-1132-768x331.png 768w" sizes="(max-width: 801px) 100vw, 801px" />
</p>
<ul>
<li>
    重新连接
  </li>
</ul>
<p>
  <img loading="lazy" decoding="async" width="1013" height="462" src="/wp-content/uploads/2018/05/word-image-1133.png" class="wp-image-1247" srcset="/wp-content/uploads/2018/05/word-image-1133.png 1013w, /wp-content/uploads/2018/05/word-image-1133-300x137.png 300w, /wp-content/uploads/2018/05/word-image-1133-768x350.png 768w" sizes="(max-width: 1013px) 100vw, 1013px" /></p>
]]></content:encoded>
					
					<wfw:commentRss>/%e6%95%b0%e6%8d%ae%e5%ba%93/mysql/1186.html/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Mysql（五）事物、 外键、 存储函数、 存储过程、 流程控制、 视图、 触发器</title>
		<link>/%e6%95%b0%e6%8d%ae%e5%ba%93/mysql/1249.html</link>
					<comments>/%e6%95%b0%e6%8d%ae%e5%ba%93/mysql/1249.html#respond</comments>
		
		<dc:creator><![CDATA[Mr.Lee]]></dc:creator>
		<pubDate>Thu, 17 May 2018 17:10:06 +0000</pubDate>
				<category><![CDATA[Mysql]]></category>
		<category><![CDATA[事物]]></category>
		<category><![CDATA[外键]]></category>
		<category><![CDATA[存储函数]]></category>
		<category><![CDATA[存储过程]]></category>
		<category><![CDATA[流程控制]]></category>
		<category><![CDATA[视图]]></category>
		<category><![CDATA[触发器]]></category>
		<guid isPermaLink="false">/?p=1249</guid>

					<description><![CDATA[外键 什么是外键 在两张表中公用字段，在一个关系中是主键，在另外一个关系中就是外键 公共字段是主键的表，是主表 [&#8230;]]]></description>
										<content:encoded><![CDATA[<h1>外键</h1>
<h2>什么是外键</h2>
<p>
  在两张表中公用字段，在一个关系中是主键，在另外一个关系中就是外键
</p>
<p>
  公共字段是主键的表，是主表；是外键的表就是从表
</p>
<p>
  <img loading="lazy" decoding="async" width="610" height="494" src="/wp-content/uploads/2018/05/word-image-1134.png" class="wp-image-1250" srcset="/wp-content/uploads/2018/05/word-image-1134.png 610w, /wp-content/uploads/2018/05/word-image-1134-300x243.png 300w" sizes="(max-width: 610px) 100vw, 610px" />
</p>
<h2>增加外键</h2>
<p>
  建表的时候加外键（明确指定从表中的公用字段是外键—有一定的约束）
</p>
<p>
  create table class
</p>
<p>
  (
</p>
<p>
  	id int primary key auto_increment,
</p>
<p>
  	class_name char(20)
</p>
<p>
  )charset=utf8;
</p>
<p>
  create table student
</p>
<p>
  (
</p>
<p>
  	id int primary key auto_increment,
</p>
<p>
  	name char(30),
</p>
<p>
  	class_id int,
</p>
<p>
  	foreign key(class_id) references class(id)
</p>
<p>
  )charset=utf8;
</p>
<p>
  指定外键的时候，系统会自动的把外键字段加一个索引
</p>
<p>
  <img loading="lazy" decoding="async" width="887" height="286" src="/wp-content/uploads/2018/05/word-image-1135.png" class="wp-image-1251" srcset="/wp-content/uploads/2018/05/word-image-1135.png 887w, /wp-content/uploads/2018/05/word-image-1135-300x97.png 300w, /wp-content/uploads/2018/05/word-image-1135-768x248.png 768w" sizes="(max-width: 887px) 100vw, 887px" />
</p>
<p>
  创建外键并指定名字
</p>
<p>
  <img loading="lazy" decoding="async" width="791" height="175" src="/wp-content/uploads/2018/05/word-image-1136.png" class="wp-image-1252" srcset="/wp-content/uploads/2018/05/word-image-1136.png 791w, /wp-content/uploads/2018/05/word-image-1136-300x66.png 300w, /wp-content/uploads/2018/05/word-image-1136-768x170.png 768w" sizes="(max-width: 791px) 100vw, 791px" />
</p>
<p>
  <img loading="lazy" decoding="async" width="1017" height="257" src="/wp-content/uploads/2018/05/word-image-1137.png" class="wp-image-1253" srcset="/wp-content/uploads/2018/05/word-image-1137.png 1017w, /wp-content/uploads/2018/05/word-image-1137-300x76.png 300w, /wp-content/uploads/2018/05/word-image-1137-768x194.png 768w" sizes="(max-width: 1017px) 100vw, 1017px" />
</p>
<p>
  修改表加外键
</p>
<p>
  alter table 表名add foreign key(外键字段) references 主表(主键);
</p>
<p>
  <img loading="lazy" decoding="async" width="909" height="88" src="/wp-content/uploads/2018/05/word-image-1138.png" class="wp-image-1254" srcset="/wp-content/uploads/2018/05/word-image-1138.png 909w, /wp-content/uploads/2018/05/word-image-1138-300x29.png 300w, /wp-content/uploads/2018/05/word-image-1138-768x74.png 768w" sizes="(max-width: 909px) 100vw, 909px" />
</p>
<p>
  <img loading="lazy" decoding="async" width="914" height="296" src="/wp-content/uploads/2018/05/word-image-1139.png" class="wp-image-1255" srcset="/wp-content/uploads/2018/05/word-image-1139.png 914w, /wp-content/uploads/2018/05/word-image-1139-300x97.png 300w, /wp-content/uploads/2018/05/word-image-1139-768x249.png 768w" sizes="(max-width: 914px) 100vw, 914px" />
</p>
<h2>删除外键</h2>
<p>
  Alter table  表名 drop foreign key 外键名字;
</p>
<p>
  <img loading="lazy" decoding="async" width="771" height="89" src="/wp-content/uploads/2018/05/word-image-1140.png" class="wp-image-1256" srcset="/wp-content/uploads/2018/05/word-image-1140.png 771w, /wp-content/uploads/2018/05/word-image-1140-300x35.png 300w, /wp-content/uploads/2018/05/word-image-1140-768x89.png 768w" sizes="(max-width: 771px) 100vw, 771px" />
</p>
<h2>外键的基本要求</h2>
<ul>
<li>
    首先数据表字段是外键，表必须是innodb的数据库引擎
  </li>
<li>
    主表和从表的公用字段，数据类型和必要的属性必须一致
  </li>
<li>
    外键创建的时候需要注意数据的影响&#8212;（修改表后期加外键的时候）公用字段中从表的数据必须能在主表相应字段中找到
  </li>
</ul>
<p>
  <img loading="lazy" decoding="async" width="848" height="84" src="/wp-content/uploads/2018/05/word-image-1141.png" class="wp-image-1257" srcset="/wp-content/uploads/2018/05/word-image-1141.png 848w, /wp-content/uploads/2018/05/word-image-1141-300x30.png 300w, /wp-content/uploads/2018/05/word-image-1141-768x76.png 768w" sizes="(max-width: 848px) 100vw, 848px" />
</p>
<p>
  <img loading="lazy" decoding="async" width="410" height="163" src="/wp-content/uploads/2018/05/word-image-1142.png" class="wp-image-1258" srcset="/wp-content/uploads/2018/05/word-image-1142.png 410w, /wp-content/uploads/2018/05/word-image-1142-300x119.png 300w" sizes="(max-width: 410px) 100vw, 410px" /></p>
<p>  <img loading="lazy" decoding="async" width="381" height="166" src="/wp-content/uploads/2018/05/word-image-1143.png" class="wp-image-1259" srcset="/wp-content/uploads/2018/05/word-image-1143.png 381w, /wp-content/uploads/2018/05/word-image-1143-300x131.png 300w" sizes="(max-width: 381px) 100vw, 381px" />
</p>
<p>
  <img loading="lazy" decoding="async" width="1097" height="64" src="/wp-content/uploads/2018/05/word-image-1144.png" class="wp-image-1260" srcset="/wp-content/uploads/2018/05/word-image-1144.png 1097w, /wp-content/uploads/2018/05/word-image-1144-300x18.png 300w, /wp-content/uploads/2018/05/word-image-1144-768x45.png 768w, /wp-content/uploads/2018/05/word-image-1144-1024x60.png 1024w" sizes="(max-width: 1097px) 100vw, 1097px" />
</p>
<p>
  <img loading="lazy" decoding="async" width="1001" height="150" src="/wp-content/uploads/2018/05/word-image-1145.png" class="wp-image-1261" srcset="/wp-content/uploads/2018/05/word-image-1145.png 1001w, /wp-content/uploads/2018/05/word-image-1145-300x45.png 300w, /wp-content/uploads/2018/05/word-image-1145-768x115.png 768w" sizes="(max-width: 1001px) 100vw, 1001px" />
</p>
<h2>外键约束</h2>
<h3>什么是外键约束</h3>
<p>
  就是对主表数据，和从表数据的一些要求
</p>
<p>
  从表中有的相关数据，主表中不能随意删除
</p>
<p>
  <img loading="lazy" decoding="async" width="821" height="416" src="/wp-content/uploads/2018/05/word-image-1146.png" class="wp-image-1262" srcset="/wp-content/uploads/2018/05/word-image-1146.png 821w, /wp-content/uploads/2018/05/word-image-1146-300x152.png 300w, /wp-content/uploads/2018/05/word-image-1146-768x389.png 768w" sizes="(max-width: 821px) 100vw, 821px" />
</p>
<p>
  想操作主表中的内容怎么办/
</p>
<p>
  把相关信息从从表中全部删除，再修改相应主表中的内容
</p>
<p>
  <img loading="lazy" decoding="async" width="929" height="323" src="/wp-content/uploads/2018/05/word-image-1147.png" class="wp-image-1263" srcset="/wp-content/uploads/2018/05/word-image-1147.png 929w, /wp-content/uploads/2018/05/word-image-1147-300x104.png 300w, /wp-content/uploads/2018/05/word-image-1147-768x267.png 768w" sizes="(max-width: 929px) 100vw, 929px" />
</p>
<p>
  <img loading="lazy" decoding="async" width="727" height="129" src="/wp-content/uploads/2018/05/word-image-1148.png" class="wp-image-1264" srcset="/wp-content/uploads/2018/05/word-image-1148.png 727w, /wp-content/uploads/2018/05/word-image-1148-300x53.png 300w" sizes="(max-width: 727px) 100vw, 727px" />
</p>
<p>
  从表中用的相关数据，必须是主表中有的
</p>
<p>
  <img loading="lazy" decoding="async" width="939" height="387" src="/wp-content/uploads/2018/05/word-image-1149.png" class="wp-image-1265" srcset="/wp-content/uploads/2018/05/word-image-1149.png 939w, /wp-content/uploads/2018/05/word-image-1149-300x124.png 300w, /wp-content/uploads/2018/05/word-image-1149-768x317.png 768w" sizes="(max-width: 939px) 100vw, 939px" />
</p>
<h2>外键的意义</h2>
<p>
  保证了数据的一致性（外键约束的体现）
</p>
<p>
  和完整性（班级和人进行了关联）
</p>
<p>
  工作中一般很少使用外键，因为操作表数据的时候太麻烦，限制的条件太死
</p>
<h1>视图</h1>
<h2>	什么是视图</h2>
<p>
  视图其实就是一张虚构的表，这个表只有表结构，没有表数据，视图的数据是从真正的数据表中引用的，那么我们修改视图的数据相关数据表的数据也会被修改；说白了视图就是把select查询结果当做了一个表
</p>
<h2>	视图的操作</h2>
<h3>创建视图</h3>
<p>
  Create  view  view1 as   select 语句
</p>
<p>
  <img loading="lazy" decoding="async" width="876" height="115" src="/wp-content/uploads/2018/05/word-image-1150.png" class="wp-image-1266" srcset="/wp-content/uploads/2018/05/word-image-1150.png 876w, /wp-content/uploads/2018/05/word-image-1150-300x39.png 300w, /wp-content/uploads/2018/05/word-image-1150-768x101.png 768w" sizes="(max-width: 876px) 100vw, 876px" />
</p>
<h3>查看视图</h3>
<p>
  <img loading="lazy" decoding="async" width="650" height="199" src="/wp-content/uploads/2018/05/word-image-1151.png" class="wp-image-1267" srcset="/wp-content/uploads/2018/05/word-image-1151.png 650w, /wp-content/uploads/2018/05/word-image-1151-300x92.png 300w" sizes="(max-width: 650px) 100vw, 650px" />
</p>
<h3>使用视图</h3>
<p>
  和使用表的用法一样，注意这里视图主要是用于查询和修改的，一版不用于添加也不删除
</p>
<p>
  查询视图
</p>
<p>
  <img loading="lazy" decoding="async" width="604" height="140" src="/wp-content/uploads/2018/05/word-image-1152.png" class="wp-image-1268" srcset="/wp-content/uploads/2018/05/word-image-1152.png 604w, /wp-content/uploads/2018/05/word-image-1152-300x70.png 300w" sizes="(max-width: 604px) 100vw, 604px" />
</p>
<p>
  视图中的数据，都是从真实的表中来的
</p>
<p>
  create view view1 as
</p>
<p>
  	select class_name,name from class join student on class.id=student.class_id;
</p>
<p>
  <img loading="lazy" decoding="async" width="813" height="117" src="/wp-content/uploads/2018/05/word-image-1153.png" class="wp-image-1269" srcset="/wp-content/uploads/2018/05/word-image-1153.png 813w, /wp-content/uploads/2018/05/word-image-1153-300x43.png 300w, /wp-content/uploads/2018/05/word-image-1153-768x111.png 768w" sizes="(max-width: 813px) 100vw, 813px" />
</p>
<p>
  <img loading="lazy" decoding="async" width="857" height="159" src="/wp-content/uploads/2018/05/word-image-1154.png" class="wp-image-1270" srcset="/wp-content/uploads/2018/05/word-image-1154.png 857w, /wp-content/uploads/2018/05/word-image-1154-300x56.png 300w, /wp-content/uploads/2018/05/word-image-1154-768x142.png 768w" sizes="(max-width: 857px) 100vw, 857px" />
</p>
<h3>删除视图</h3>
<p>
  <img loading="lazy" decoding="async" width="734" height="68" src="/wp-content/uploads/2018/05/word-image-1155.png" class="wp-image-1271" srcset="/wp-content/uploads/2018/05/word-image-1155.png 734w, /wp-content/uploads/2018/05/word-image-1155-300x28.png 300w" sizes="(max-width: 734px) 100vw, 734px" />
</p>
<h2>视图数据的操作</h2>
<h3>增加视图数据</h3>
<p>
  一般不是对视图的数据进行添加
</p>
<p>
  这个视图的数据是来源于多表的
</p>
<p>
  	肯定不能插入成功；
</p>
<p>
  <img loading="lazy" decoding="async" width="882" height="63" src="/wp-content/uploads/2018/05/word-image-1156.png" class="wp-image-1272" srcset="/wp-content/uploads/2018/05/word-image-1156.png 882w, /wp-content/uploads/2018/05/word-image-1156-300x21.png 300w, /wp-content/uploads/2018/05/word-image-1156-768x55.png 768w" sizes="(max-width: 882px) 100vw, 882px" />
</p>
<p>
  这个视图数据是来源于一张表的
</p>
<p>
  	当视图的数据是这个表中所有必须要写的数据的时候能插入
</p>
<p>
  	否则不能插入
</p>
<p>
  测试1
</p>
<p>
  <img loading="lazy" decoding="async" width="651" height="62" src="/wp-content/uploads/2018/05/word-image-1157.png" class="wp-image-1273" srcset="/wp-content/uploads/2018/05/word-image-1157.png 651w, /wp-content/uploads/2018/05/word-image-1157-300x29.png 300w" sizes="(max-width: 651px) 100vw, 651px" />
</p>
<p>
  <img loading="lazy" decoding="async" width="874" height="61" src="/wp-content/uploads/2018/05/word-image-1158.png" class="wp-image-1274" srcset="/wp-content/uploads/2018/05/word-image-1158.png 874w, /wp-content/uploads/2018/05/word-image-1158-300x21.png 300w, /wp-content/uploads/2018/05/word-image-1158-768x54.png 768w" sizes="(max-width: 874px) 100vw, 874px" />
</p>
<p>
  <img loading="lazy" decoding="async" width="834" height="214" src="/wp-content/uploads/2018/05/word-image-1159.png" class="wp-image-1275" srcset="/wp-content/uploads/2018/05/word-image-1159.png 834w, /wp-content/uploads/2018/05/word-image-1159-300x77.png 300w, /wp-content/uploads/2018/05/word-image-1159-768x197.png 768w" sizes="(max-width: 834px) 100vw, 834px" />
</p>
<p>
  测试2
</p>
<p>
  <img loading="lazy" decoding="async" width="961" height="278" src="/wp-content/uploads/2018/05/word-image-1160.png" class="wp-image-1276" srcset="/wp-content/uploads/2018/05/word-image-1160.png 961w, /wp-content/uploads/2018/05/word-image-1160-300x87.png 300w, /wp-content/uploads/2018/05/word-image-1160-768x222.png 768w" sizes="(max-width: 961px) 100vw, 961px" />
</p>
<h3>删除视图数据</h3>
<p>
  第一种：视图的数据来源于多个表
</p>
<p>
  <img loading="lazy" decoding="async" width="755" height="251" src="/wp-content/uploads/2018/05/word-image-1161.png" class="wp-image-1277" srcset="/wp-content/uploads/2018/05/word-image-1161.png 755w, /wp-content/uploads/2018/05/word-image-1161-300x100.png 300w" sizes="(max-width: 755px) 100vw, 755px" />
</p>
<p>
  第二种：视图的数据来源于一个表
</p>
<p>
  <img loading="lazy" decoding="async" width="896" height="269" src="/wp-content/uploads/2018/05/word-image-1162.png" class="wp-image-1278" srcset="/wp-content/uploads/2018/05/word-image-1162.png 896w, /wp-content/uploads/2018/05/word-image-1162-300x90.png 300w, /wp-content/uploads/2018/05/word-image-1162-768x231.png 768w" sizes="(max-width: 896px) 100vw, 896px" />
</p>
<p>
  <img loading="lazy" decoding="async" width="792" height="191" src="/wp-content/uploads/2018/05/word-image-1163.png" class="wp-image-1279" srcset="/wp-content/uploads/2018/05/word-image-1163.png 792w, /wp-content/uploads/2018/05/word-image-1163-300x72.png 300w, /wp-content/uploads/2018/05/word-image-1163-768x185.png 768w" sizes="(max-width: 792px) 100vw, 792px" />
</p>
<h3>修改视图数据</h3>
<p>
  视图 数据的修改和表修改一样的用法都是使用update，视图数据的修改成功后，相应数据表中的数据也会发生改变
</p>
<p>
  <img loading="lazy" decoding="async" width="767" height="255" src="/wp-content/uploads/2018/05/word-image-1164.png" class="wp-image-1280" srcset="/wp-content/uploads/2018/05/word-image-1164.png 767w, /wp-content/uploads/2018/05/word-image-1164-300x100.png 300w" sizes="(max-width: 767px) 100vw, 767px" />
</p>
<p>
  <img loading="lazy" decoding="async" width="879" height="185" src="/wp-content/uploads/2018/05/word-image-1165.png" class="wp-image-1281" srcset="/wp-content/uploads/2018/05/word-image-1165.png 879w, /wp-content/uploads/2018/05/word-image-1165-300x63.png 300w, /wp-content/uploads/2018/05/word-image-1165-768x162.png 768w" sizes="(max-width: 879px) 100vw, 879px" />
</p>
<p>
  查询视图
</p>
<p>
  和普通的表查询一样
</p>
<h2>视图的作用和好处</h2>
<p>
  视图的数据都是存在真实的表中的，但是视图的结构可以自己定义（select查询结果的结构）
</p>
<p>
  当一些敏感数据不想被用户看到，但是该表中还有些数据用户还必须使用
</p>
<p>
  我们就可以用视图来解决这个问题
</p>
<p>
  比如下边的一些敏感数据 年龄，性别我们都可以用视图来把这些信息不显示（只需要用select语句不选这两个字段），用户只需要有权限查询我们创建的视图就可以了
</p>
<table>
<tr>
<td>
<p>
  Id
</p>
</td>
<td>
<p>
  Name
</p>
</td>
<td>
<p>
  Age
</p>
</td>
<td>
<p>
  sex
</p>
</td>
</tr>
<tr>
<td>
<p>
  1
</p>
</td>
<td>
<p>
  林志玲
</p>
</td>
<td>
<p>
  67
</p>
</td>
<td>
<p>
  男
</p>
</td>
</tr>
<tr>
<td>
<p>
  2
</p>
</td>
<td>
<p>
  赵薇
</p>
</td>
<td>
<p>
  58
</p>
</td>
<td>
<p>
  男
</p>
</td>
</tr>
</table>
<p>
  我们可以把一些复杂的sql语句的结果做成视图
</p>
<p>
  	四表联查
</p>
<p>
  		班级名，学生名，课程名, 成绩
</p>
<p>
  	我们可以把四表联查的sql结果做成视图，每次我们需要查看这种数据的时候直接
</p>
<p>
  Select * from 视图;就可以了，而不用每次都写一个四表连接的sql
</p>
<p>
  如果一个表数据量太大有200万条，查询的速度慢
</p>
<p>
  我们可以把200条分别做成视图
</p>
<p>
  1-10万条是一个视图  （id从1&#8212;10万）
</p>
<p>
  10-20万条是一个视图	   （id从10万到20万）
</p>
<p>
  ……………
</p>
<p>
  我们查询前先判断id是哪个范围，再根据范围查找相应视图
</p>
<p>
  查询的效率就大大的提高了  这种做法就是把表横向切割&#8212;-分表
</p>
<h1>事务</h1>
<h2>什么是事务</h2>
<p>
  你向银行存钱 ，钱已经存入银行了，这是该把你的存钱记录存入电脑了，但是停电了
</p>
<p>
  	你的钱少了，但是钱没在银行提现
</p>
<p>
  你去银行取钱，钱取出来了，该从你的账户扣钱，这是又停电了，
</p>
<p>
  	你拿到钱了，银行账户余额没少
</p>
<p>
  在多条sql的时候，如果有一条不成功，那么所有的sql执行失效&#8212;事务
</p>
<h2>事务的执行流程</h2>
<p>
  开启事务   begin  /start transcation
</p>
<p>
  执行sql
</p>
<p>
  提交事务（所有sql执行成功） commit
</p>
<p>
  回滚  (有一条sql执行失败就回滚)  rollback
</p>
<p>
  注意;再开启事务后，没有提交事务，或是回滚都是没有效果的
</p>
<p>
  <img loading="lazy" decoding="async" width="961" height="301" src="/wp-content/uploads/2018/05/word-image-1166.png" class="wp-image-1282" srcset="/wp-content/uploads/2018/05/word-image-1166.png 961w, /wp-content/uploads/2018/05/word-image-1166-300x94.png 300w, /wp-content/uploads/2018/05/word-image-1166-768x241.png 768w" sizes="(max-width: 961px) 100vw, 961px" />
</p>
<p>
  <img loading="lazy" decoding="async" width="969" height="236" src="/wp-content/uploads/2018/05/word-image-1167.png" class="wp-image-1283" srcset="/wp-content/uploads/2018/05/word-image-1167.png 969w, /wp-content/uploads/2018/05/word-image-1167-300x73.png 300w, /wp-content/uploads/2018/05/word-image-1167-768x187.png 768w" sizes="(max-width: 969px) 100vw, 969px" />
</p>
<p>
  <img loading="lazy" decoding="async" width="745" height="276" src="/wp-content/uploads/2018/05/word-image-1168.png" class="wp-image-1284" srcset="/wp-content/uploads/2018/05/word-image-1168.png 745w, /wp-content/uploads/2018/05/word-image-1168-300x111.png 300w" sizes="(max-width: 745px) 100vw, 745px" />
</p>
<p>
  测试2
</p>
<p>
  事务执行没有完成的时候，数据表的数据没有任何变化
</p>
<p>
  <img loading="lazy" decoding="async" width="868" height="244" src="/wp-content/uploads/2018/05/word-image-1169.png" class="wp-image-1285" srcset="/wp-content/uploads/2018/05/word-image-1169.png 868w, /wp-content/uploads/2018/05/word-image-1169-300x84.png 300w, /wp-content/uploads/2018/05/word-image-1169-768x216.png 768w" sizes="(max-width: 868px) 100vw, 868px" />
</p>
<p>
  <img loading="lazy" decoding="async" width="743" height="306" src="/wp-content/uploads/2018/05/word-image-1170.png" class="wp-image-1286" srcset="/wp-content/uploads/2018/05/word-image-1170.png 743w, /wp-content/uploads/2018/05/word-image-1170-300x124.png 300w" sizes="(max-width: 743px) 100vw, 743px" />
</p>
<p>
  	提交事务后，数据表中的数据会永久性的改变
</p>
<p>
  <img loading="lazy" decoding="async" width="638" height="62" src="/wp-content/uploads/2018/05/word-image-1171.png" class="wp-image-1287" srcset="/wp-content/uploads/2018/05/word-image-1171.png 638w, /wp-content/uploads/2018/05/word-image-1171-300x29.png 300w" sizes="(max-width: 638px) 100vw, 638px" />
</p>
<p>
  <img loading="lazy" decoding="async" width="808" height="345" src="/wp-content/uploads/2018/05/word-image-1172.png" class="wp-image-1288" srcset="/wp-content/uploads/2018/05/word-image-1172.png 808w, /wp-content/uploads/2018/05/word-image-1172-300x128.png 300w, /wp-content/uploads/2018/05/word-image-1172-768x328.png 768w" sizes="(max-width: 808px) 100vw, 808px" />
</p>
<h2>事务基本原理图</h2>
<p>
  <img loading="lazy" decoding="async" width="1328" height="552" src="/wp-content/uploads/2018/05/word-image-1173.png" class="wp-image-1289" srcset="/wp-content/uploads/2018/05/word-image-1173.png 1328w, /wp-content/uploads/2018/05/word-image-1173-300x125.png 300w, /wp-content/uploads/2018/05/word-image-1173-768x319.png 768w, /wp-content/uploads/2018/05/word-image-1173-1024x426.png 1024w" sizes="(max-width: 1328px) 100vw, 1328px" />
</p>
<h2>事务的特点（acid）</h2>
<ul>
<li>
    原子性（Atomicity）
  </li>
</ul>
<p>
  事务里边的所有sql语句是一个整体，不可分割，要么全部执行成功，要么全部执行失败
</p>
<ul>
<li>
    一致性（consistency）
  </li>
</ul>
<p>
  事务执行过后，没有用户访问到的数据都是一样的
</p>
<p>
  <img loading="lazy" decoding="async" width="1045" height="476" src="/wp-content/uploads/2018/05/word-image-1174.png" class="wp-image-1290" srcset="/wp-content/uploads/2018/05/word-image-1174.png 1045w, /wp-content/uploads/2018/05/word-image-1174-300x137.png 300w, /wp-content/uploads/2018/05/word-image-1174-768x350.png 768w, /wp-content/uploads/2018/05/word-image-1174-1024x466.png 1024w" sizes="(max-width: 1045px) 100vw, 1045px" />
</p>
<ul>
<li>
    隔离性（Isolation）
  </li>
</ul>
<p>
  事务与事务之间没有影响各自执行自己的命令
</p>
<p>
  当前事务一开启执行后，开启事务2，操的数据如果一样比如是同一行数据，那么事务2会等待事务1结束以后再执行，开启事务1以后，操作的这行数据就会被‘锁’起来，其他的命令不能操作
</p>
<p>
  <img loading="lazy" decoding="async" width="1431" height="180" src="/wp-content/uploads/2018/05/word-image-1175.png" class="wp-image-1291" srcset="/wp-content/uploads/2018/05/word-image-1175.png 1431w, /wp-content/uploads/2018/05/word-image-1175-300x38.png 300w, /wp-content/uploads/2018/05/word-image-1175-768x97.png 768w, /wp-content/uploads/2018/05/word-image-1175-1024x129.png 1024w" sizes="(max-width: 1431px) 100vw, 1431px" />
</p>
<p>
  <img loading="lazy" decoding="async" width="831" height="144" src="/wp-content/uploads/2018/05/word-image-1176.png" class="wp-image-1292" srcset="/wp-content/uploads/2018/05/word-image-1176.png 831w, /wp-content/uploads/2018/05/word-image-1176-300x52.png 300w, /wp-content/uploads/2018/05/word-image-1176-768x133.png 768w" sizes="(max-width: 831px) 100vw, 831px" />
</p>
<ul>
<li>
    永久性（Durability）
  </li>
</ul>
<p>
  事务结束以后，对表的影响是永久有效的
</p>
<h1>Mysql编程</h1>
<h2>系统函数(了解)</h2>
<ul>
<li>
    字符串函数，比如：char_length(), concat(), instr(), lcase(), left(), ltrim(), mid()
  </li>
<li>
    时间函数，比如：now(), cordate(), curtime(), datediff(), date_add()
  </li>
<li>
    数学函数，比如：abs(), ceiling(), floor(), pow(), rand(), round()
  </li>
<li>
    其他函数，比如：md5(), version(), datebase(), UUID()
  </li>
</ul>
<p>
  系统函数就是mysql系统自己定义的函数，我们只需要调用就可以了
</p>
<p>
  <img loading="lazy" decoding="async" width="981" height="153" src="/wp-content/uploads/2018/05/word-image-1177.png" class="wp-image-1293" srcset="/wp-content/uploads/2018/05/word-image-1177.png 981w, /wp-content/uploads/2018/05/word-image-1177-300x47.png 300w, /wp-content/uploads/2018/05/word-image-1177-768x120.png 768w" sizes="(max-width: 981px) 100vw, 981px" />
</p>
<h2>存储函数</h2>
<p>
  就是自己定义函数，必须返回一个单独的值，存储函数里边不能有结果集显示不能有select show 等命令
</p>
<h3>创建存储函数</h3>
<p>
  创建语法：
</p>
<p>
  	create function 函数名(参数1 类型1,参数2 类型2&#8230;..) returns 返回值类型
</p>
<p>
  begin
</p>
<p>
  	&#8230;..
</p>
<p>
  end;
</p>
<p>
  其中begin和end 就是开始和结束的标识 可以理解成PHP的 {  }
</p>
<p>
  <img loading="lazy" decoding="async" width="1030" height="134" src="/wp-content/uploads/2018/05/word-image-1178.png" class="wp-image-1294" srcset="/wp-content/uploads/2018/05/word-image-1178.png 1030w, /wp-content/uploads/2018/05/word-image-1178-300x39.png 300w, /wp-content/uploads/2018/05/word-image-1178-768x100.png 768w, /wp-content/uploads/2018/05/word-image-1178-1024x133.png 1024w" sizes="(max-width: 1030px) 100vw, 1030px" />
</p>
<p>
  解决：修改sql代码执行结束符
</p>
<p>
  	命令：delimiter  新的结束符
</p>
<p>
  <img loading="lazy" decoding="async" width="564" height="64" src="/wp-content/uploads/2018/05/word-image-1179.png" class="wp-image-1295" srcset="/wp-content/uploads/2018/05/word-image-1179.png 564w, /wp-content/uploads/2018/05/word-image-1179-300x34.png 300w" sizes="(max-width: 564px) 100vw, 564px" />
</p>
<p>
  声明存储函数
</p>
<p>
  <img loading="lazy" decoding="async" width="769" height="150" src="/wp-content/uploads/2018/05/word-image-1180.png" class="wp-image-1296" srcset="/wp-content/uploads/2018/05/word-image-1180.png 769w, /wp-content/uploads/2018/05/word-image-1180-300x59.png 300w, /wp-content/uploads/2018/05/word-image-1180-768x150.png 768w" sizes="(max-width: 769px) 100vw, 769px" />
</p>
<p>
  查看存储函数状态；
</p>
<p>
  Show function status;
</p>
<p>
  <img loading="lazy" decoding="async" width="976" height="216" src="/wp-content/uploads/2018/05/word-image-1181.png" class="wp-image-1297" srcset="/wp-content/uploads/2018/05/word-image-1181.png 976w, /wp-content/uploads/2018/05/word-image-1181-300x66.png 300w, /wp-content/uploads/2018/05/word-image-1181-768x170.png 768w" sizes="(max-width: 976px) 100vw, 976px" />
</p>
<p>
  存储函数是属于某一个数据库的只能在当前这个数据库中使用
</p>
<h3>调用存储函数</h3>
<p>
  一般存储函数的调用和select 连用
</p>
<p>
  其实和系统函数的使用没有差别，都是函数的调用
</p>
<p>
  <img loading="lazy" decoding="async" width="566" height="135" src="/wp-content/uploads/2018/05/word-image-1182.png" class="wp-image-1298" srcset="/wp-content/uploads/2018/05/word-image-1182.png 566w, /wp-content/uploads/2018/05/word-image-1182-300x72.png 300w" sizes="(max-width: 566px) 100vw, 566px" />
</p>
<p>
  扩展，如果传入的参数类型不是int会怎么样？
</p>
<p>
  <img loading="lazy" decoding="async" width="856" height="76" src="/wp-content/uploads/2018/05/word-image-1183.png" class="wp-image-1299" srcset="/wp-content/uploads/2018/05/word-image-1183.png 856w, /wp-content/uploads/2018/05/word-image-1183-300x27.png 300w, /wp-content/uploads/2018/05/word-image-1183-768x68.png 768w" sizes="(max-width: 856px) 100vw, 856px" />
</p>
<p>
  <img loading="lazy" decoding="async" width="915" height="197" src="/wp-content/uploads/2018/05/word-image-1184.png" class="wp-image-1300" srcset="/wp-content/uploads/2018/05/word-image-1184.png 915w, /wp-content/uploads/2018/05/word-image-1184-300x65.png 300w, /wp-content/uploads/2018/05/word-image-1184-768x165.png 768w" sizes="(max-width: 915px) 100vw, 915px" />
</p>
<h3>删除存储函数</h3>
<p>
  drop function 函数名;
</p>
<p>
  <img loading="lazy" decoding="async" width="840" height="76" src="/wp-content/uploads/2018/05/word-image-1185.png" class="wp-image-1301" srcset="/wp-content/uploads/2018/05/word-image-1185.png 840w, /wp-content/uploads/2018/05/word-image-1185-300x27.png 300w, /wp-content/uploads/2018/05/word-image-1185-768x69.png 768w" sizes="(max-width: 840px) 100vw, 840px" />
</p>
<p>
  总结：存储函数就是一个普通的有返回值的函数，这里返回值必须是一个单独的数据
</p>
<p>
  		存储函数里边不能使用select show等命令因为，select show 返回的是一个结果集
</p>
<h2>变量</h2>
<h3>系统变量</h3>
<p>
  查看系统变量
</p>
<p>
  Show variables;
</p>
<p>
  Autocommit  自动事务的提交，默认自动事务的提交会开启的
</p>
<p>
  自动事务的开启  set atuocommit=1;
</p>
<p>
  关闭   set  autocommit=0;
</p>
<p>
  <img loading="lazy" decoding="async" width="862" height="233" src="/wp-content/uploads/2018/05/word-image-1186.png" class="wp-image-1302" srcset="/wp-content/uploads/2018/05/word-image-1186.png 862w, /wp-content/uploads/2018/05/word-image-1186-300x81.png 300w, /wp-content/uploads/2018/05/word-image-1186-768x208.png 768w" sizes="(max-width: 862px) 100vw, 862px" />
</p>
<p>
  <img loading="lazy" decoding="async" width="1444" height="268" src="/wp-content/uploads/2018/05/word-image-1187.png" class="wp-image-1303" srcset="/wp-content/uploads/2018/05/word-image-1187.png 1444w, /wp-content/uploads/2018/05/word-image-1187-300x56.png 300w, /wp-content/uploads/2018/05/word-image-1187-768x143.png 768w, /wp-content/uploads/2018/05/word-image-1187-1024x190.png 1024w" sizes="(max-width: 1444px) 100vw, 1444px" />
</p>
<p>
  <img loading="lazy" decoding="async" width="1503" height="361" src="/wp-content/uploads/2018/05/word-image-1188.png" class="wp-image-1304" srcset="/wp-content/uploads/2018/05/word-image-1188.png 1503w, /wp-content/uploads/2018/05/word-image-1188-300x72.png 300w, /wp-content/uploads/2018/05/word-image-1188-768x184.png 768w, /wp-content/uploads/2018/05/word-image-1188-1024x246.png 1024w" sizes="(max-width: 1503px) 100vw, 1503px" />
</p>
<p>
  <img loading="lazy" decoding="async" width="1638" height="334" src="/wp-content/uploads/2018/05/word-image-1189.png" class="wp-image-1305" srcset="/wp-content/uploads/2018/05/word-image-1189.png 1638w, /wp-content/uploads/2018/05/word-image-1189-300x61.png 300w, /wp-content/uploads/2018/05/word-image-1189-768x157.png 768w, /wp-content/uploads/2018/05/word-image-1189-1024x209.png 1024w" sizes="(max-width: 1638px) 100vw, 1638px" />
</p>
<h3>局部变量</h3>
<p>
  用declare声明的变量
</p>
<p>
  声明格式是如下
</p>
<p>
  	Declare 变量名 类型  default 默认值；
</p>
<p>
  局部变量一般使用在函数的begin  end中间，应该先声明再使用；
</p>
<h3>会话变量</h3>
<p>
  就是在一次数据库连接中都生效的变量
</p>
<p>
  声明方式是：set  @变量名=值；
</p>
<p>
  <img loading="lazy" decoding="async" width="1052" height="220" src="/wp-content/uploads/2018/05/word-image-1190.png" class="wp-image-1306" srcset="/wp-content/uploads/2018/05/word-image-1190.png 1052w, /wp-content/uploads/2018/05/word-image-1190-300x63.png 300w, /wp-content/uploads/2018/05/word-image-1190-768x161.png 768w, /wp-content/uploads/2018/05/word-image-1190-1024x214.png 1024w" sizes="(max-width: 1052px) 100vw, 1052px" />
</p>
<h2>流程控制</h2>
<h3>If分支</h3>
<p>
  if 条件 then
</p>
<p>
  	//代码
</p>
<p>
  elseif 条件 then
</p>
<p>
  	//代码
</p>
<p>
  else
</p>
<p>
  	//代码
</p>
<p>
  end if;
</p>
<p>
  做一个判断学生成绩的函数，如果分数超过80为优秀，超过60为及格 ，低于60不及格
</p>
<p>
  <img loading="lazy" decoding="async" width="1000" height="272" src="/wp-content/uploads/2018/05/word-image-1191.png" class="wp-image-1307" srcset="/wp-content/uploads/2018/05/word-image-1191.png 1000w, /wp-content/uploads/2018/05/word-image-1191-300x82.png 300w, /wp-content/uploads/2018/05/word-image-1191-768x209.png 768w" sizes="(max-width: 1000px) 100vw, 1000px" />
</p>
<p>
  <img loading="lazy" decoding="async" width="819" height="433" src="/wp-content/uploads/2018/05/word-image-1192.png" class="wp-image-1308" srcset="/wp-content/uploads/2018/05/word-image-1192.png 819w, /wp-content/uploads/2018/05/word-image-1192-300x159.png 300w, /wp-content/uploads/2018/05/word-image-1192-768x406.png 768w" sizes="(max-width: 819px) 100vw, 819px" />
</p>
<h3>While循环</h3>
<p>
  while 条件 do
</p>
<p>
  	//代码
</p>
<p>
  end while;
</p>
<p>
  案例，求一个数的阶乘
</p>
<p>
  <img loading="lazy" decoding="async" width="911" height="209" src="/wp-content/uploads/2018/05/word-image-1193.png" class="wp-image-1309" srcset="/wp-content/uploads/2018/05/word-image-1193.png 911w, /wp-content/uploads/2018/05/word-image-1193-300x69.png 300w, /wp-content/uploads/2018/05/word-image-1193-768x176.png 768w" sizes="(max-width: 911px) 100vw, 911px" />
</p>
<p>
  <img loading="lazy" decoding="async" width="741" height="138" src="/wp-content/uploads/2018/05/word-image-1194.png" class="wp-image-1310" srcset="/wp-content/uploads/2018/05/word-image-1194.png 741w, /wp-content/uploads/2018/05/word-image-1194-300x56.png 300w" sizes="(max-width: 741px) 100vw, 741px" />
</p>
<h2>Mysql注释</h2>
<h3>第一种</h3>
<p>
  	&#8212; 注释  注&#8211;后有一个空格
</p>
<h3>第二种</h3>
<p>
  	# 注释  注#后有一个空格
</p>
<h3>第三种</h3>
<p>
  	/*
</p>
<p>
  	 多行注释
</p>
<p>
  	 */
</p>
<h2>存储过程</h2>
<p>
  什么是存储过程：说白了，存储过程也是一个mysql自定义函数，要求没有return返回值
</p>
<p>
  也就没有返回值的MySQL自定义函数，一般用于处理大型的业务逻辑，存储过程的代码只解析一次，
</p>
<p>
  存储过程也是只属于某一个数据库的
</p>
<h3>创建存储过程</h3>
<p>
  语法：
</p>
<p>
  Create procedure 名字 ([形参修饰符] 参数1 参数类型,[形参修饰符] 参数2,参数类型….)
</p>
<p>
  Begin
</p>
<p>
  End;
</p>
<p>
  <img loading="lazy" decoding="async" width="951" height="234" src="/wp-content/uploads/2018/05/word-image-1195.png" class="wp-image-1311" srcset="/wp-content/uploads/2018/05/word-image-1195.png 951w, /wp-content/uploads/2018/05/word-image-1195-300x74.png 300w, /wp-content/uploads/2018/05/word-image-1195-768x189.png 768w" sizes="(max-width: 951px) 100vw, 951px" />
</p>
<h3>调用存储过程</h3>
<p>
  存储过程的调用和存储函数的调用不同，存储函数不是单独调用的，可以和其他存储函数一块调用
</p>
<p>
  <img loading="lazy" decoding="async" width="806" height="179" src="/wp-content/uploads/2018/05/word-image-1196.png" class="wp-image-1312" srcset="/wp-content/uploads/2018/05/word-image-1196.png 806w, /wp-content/uploads/2018/05/word-image-1196-300x67.png 300w, /wp-content/uploads/2018/05/word-image-1196-768x171.png 768w" sizes="(max-width: 806px) 100vw, 806px" />
</p>
<h3>存储过程调用</h3>
<p>
  存储过程是单独调用的用到了call关键字
</p>
<p>
  用法:call 存储过程名字(参数列表);
</p>
<p>
  <img loading="lazy" decoding="async" width="729" height="153" src="/wp-content/uploads/2018/05/word-image-1197.png" class="wp-image-1313" srcset="/wp-content/uploads/2018/05/word-image-1197.png 729w, /wp-content/uploads/2018/05/word-image-1197-300x63.png 300w" sizes="(max-width: 729px) 100vw, 729px" />
</p>
<h3>查看存储过程</h3>
<p>
  Show  procedure  status;
</p>
<p>
  <img loading="lazy" decoding="async" width="976" height="171" src="/wp-content/uploads/2018/05/word-image-1198.png" class="wp-image-1314" srcset="/wp-content/uploads/2018/05/word-image-1198.png 976w, /wp-content/uploads/2018/05/word-image-1198-300x53.png 300w, /wp-content/uploads/2018/05/word-image-1198-768x135.png 768w" sizes="(max-width: 976px) 100vw, 976px" />
</p>
<h3>删除存储过程</h3>
<p>
  Drop  procedure 存储过程的名字
</p>
<p>
  <img loading="lazy" decoding="async" width="650" height="86" src="/wp-content/uploads/2018/05/word-image-1199.png" class="wp-image-1315" srcset="/wp-content/uploads/2018/05/word-image-1199.png 650w, /wp-content/uploads/2018/05/word-image-1199-300x40.png 300w" sizes="(max-width: 650px) 100vw, 650px" />
</p>
<h3>存储过程的形参修饰符in,out,inout</h3>
<p>
  形参修饰符放在参数前边，类型放在参数后边
</p>
<p>
  In
</p>
<p>
  	参数的值可以传入，但是存储过程不能修改这个值
</p>
<p>
  Out
</p>
<p>
  	不能传入值，能在内部修改变量的值，外部也生效
</p>
<p>
  Inout
</p>
<p>
  	能传入值，并且可以修改标量的值，并且外部也生效
</p>
<p>
  思考：存储函数和存储过程的区别
</p>
<h2>触发器</h2>
<h3>触发器概念</h3>
<h4>触发器的基本概念</h4>
<p>
  类似js中的点击事件，当我们点击了一个连接会自动的跳出一个窗口
</p>
<p>
  触发器是在操作数据的时候，比如删除(增加，更新)了某个表的数据的时候，自动调用的自定义函数
</p>
<h4>触发器的作用好处</h4>
<p>
  首先可以安全验证，&#8212;增加数据的时候，进行数据的安全验证
</p>
<p>
  	不用手动调用，&#8212;如果一件商品下架了，那么订单中就不要出现这个商品了，触发器可以自动的删除订单中的商品
</p>
<h3>创建触发器</h3>
<p>
  创建触发器基本语法
</p>
<p>
  create trigger 名称 after|before 事件 on 表名  for each row
</p>
<p>
  begin
</p>
<p>
  #SQL语句
</p>
<p>
  end //
</p>
<p>
  定义一个触发器，当删除商品的时候，自动的把订单中用相关商品的记录删除（自动）
</p>
<p>
  <img loading="lazy" decoding="async" width="822" height="82" src="/wp-content/uploads/2018/05/word-image-1200.png" class="wp-image-1316" srcset="/wp-content/uploads/2018/05/word-image-1200.png 822w, /wp-content/uploads/2018/05/word-image-1200-300x30.png 300w, /wp-content/uploads/2018/05/word-image-1200-768x77.png 768w" sizes="(max-width: 822px) 100vw, 822px" />
</p>
<p>
  触发事件  触发 触发器自动调用
</p>
<p>
  <img loading="lazy" decoding="async" width="973" height="49" src="/wp-content/uploads/2018/05/word-image-1201.png" class="wp-image-1317" srcset="/wp-content/uploads/2018/05/word-image-1201.png 973w, /wp-content/uploads/2018/05/word-image-1201-300x15.png 300w, /wp-content/uploads/2018/05/word-image-1201-768x39.png 768w" sizes="(max-width: 973px) 100vw, 973px" />
</p>
<p>
  删除商品信息后，再次查看订单表信息
</p>
<p>
  <img loading="lazy" decoding="async" width="782" height="50" src="/wp-content/uploads/2018/05/word-image-1202.png" class="wp-image-1318" srcset="/wp-content/uploads/2018/05/word-image-1202.png 782w, /wp-content/uploads/2018/05/word-image-1202-300x19.png 300w, /wp-content/uploads/2018/05/word-image-1202-768x49.png 768w" sizes="(max-width: 782px) 100vw, 782px" />
</p>
</p>
<p>
  触发时机关键字：before, after
</p>
<p>
  触发事件关键字：insert, delete, update
</p>
<p>
  触发器一共有
</p>
<p>
  	6中before insert，before delete，before update，after insert ,after delete,after update;
</p>
<p>
  注意触发器不能有冲突
</p>
<p>
  <img loading="lazy" decoding="async" width="1053" height="119" src="/wp-content/uploads/2018/05/word-image-1203.png" class="wp-image-1319" srcset="/wp-content/uploads/2018/05/word-image-1203.png 1053w, /wp-content/uploads/2018/05/word-image-1203-300x34.png 300w, /wp-content/uploads/2018/05/word-image-1203-768x87.png 768w, /wp-content/uploads/2018/05/word-image-1203-1024x116.png 1024w" sizes="(max-width: 1053px) 100vw, 1053px" />
</p>
<h3>触发器的应用</h3>
<h4>触发器中的关键字：new</h4>
<p>
  	New新添加的记录信息
</p>
<p>
  	Before  Delete
</p>
<p>
  	After  delete
</p>
<p>
  	两个都没有new关键字
</p>
<h4>触发器中的关键字：old</h4>
<p>
  	Old代表老的信息记录
</p>
<p>
  	Before insert 这个触发器有old吗？ 没有</p>
]]></content:encoded>
					
					<wfw:commentRss>/%e6%95%b0%e6%8d%ae%e5%ba%93/mysql/1249.html/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
