-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsearch.xml
7580 lines (7191 loc) · 761 KB
/
search.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<?xml version="1.0" encoding="utf-8"?>
<search>
<entry>
<title>计算机组成原理笔记(一):计算机系统概述</title>
<url>/2020/09/08/CO1/</url>
<content><![CDATA[<h1 id="一、计算机的发展"><a href="#一、计算机的发展" class="headerlink" title="一、计算机的发展"></a>一、计算机的发展</h1><p>1946年,世界上第一台计算机(ENIAC)诞生于美国宾夕法尼亚大学,可以分为4个阶段</p>
<ul>
<li>第一代:1946-1957年,电子管计算机</li>
<li>第二代:1958-1964年,晶体管计算机</li>
<li>第三代:1965-1971年,中小规模或电路计算机</li>
<li>第四代:1972-至今,大规模和超大规模集成电路计算机</li>
</ul>
<a id="more"></a>
<h1 id="二、计算机的应用"><a href="#二、计算机的应用" class="headerlink" title="二、计算机的应用"></a>二、计算机的应用</h1><ol>
<li>科学计算</li>
<li>过程控制</li>
<li>人工智能</li>
<li>数据处理</li>
<li>计算机辅助应用</li>
<li>网络应用</li>
<li>多媒体技术</li>
<li>电子商务</li>
</ol>
<h1 id="三、计算机的发展趋势"><a href="#三、计算机的发展趋势" class="headerlink" title="三、计算机的发展趋势"></a>三、计算机的发展趋势</h1><ol>
<li>巨型化:指计算机的运算速度更高,存储容量更大,功能更强</li>
<li>微型化</li>
<li>智能化</li>
<li>网络化</li>
<li>多媒体化</li>
</ol>
<h1 id="四、计算机的特点"><a href="#四、计算机的特点" class="headerlink" title="四、计算机的特点"></a>四、计算机的特点</h1><ol>
<li>计算机速度快</li>
<li>运算精度高</li>
<li>逻辑运算能力强</li>
<li>存储容量大</li>
<li>自动化程度高</li>
<li>性价比高</li>
</ol>
<h1 id="五、计算机的分类"><a href="#五、计算机的分类" class="headerlink" title="五、计算机的分类"></a>五、计算机的分类</h1><p>(一)按数据处理方式</p>
<ol>
<li><p>数字式计算机:是当今世界电子计算机行业中的主流</p>
</li>
<li><p>模拟式计算机:问世较早,内部所使用的电信号模拟自然界的实际信号</p>
</li>
<li><p>数字模拟混合式计算机</p>
</li>
</ol>
<p>(二)按计算机用途</p>
<ol>
<li><p>专用计算机</p>
</li>
<li><p>通用计算机</p>
</li>
</ol>
<p>(三)按计算机性能</p>
<ol>
<li>巨型计算机</li>
<li>大/中型计算机</li>
<li>小型计算机</li>
<li>微型计算机</li>
<li>单片机</li>
</ol>
<p>(四)按计算机使用方式</p>
<ol>
<li>桌面型计算机</li>
<li>服务器型计算机</li>
<li>嵌入式计算机</li>
</ol>
<h1 id="六、计算机的性能指标"><a href="#六、计算机的性能指标" class="headerlink" title="六、计算机的性能指标"></a>六、计算机的性能指标</h1><p>(一)字长</p>
<p>字长以二进制为单位,是CPU一次能够处理二进制数据的位数,它直接关系到计算机的计算精度和运算能力</p>
<p>(二)运算速度</p>
<p>用来衡量运算速度的指标有MIPS(百万条指令/秒)、MFLOPS(百万次浮点运算/秒)、CPI(执行一条指令所需要的时钟周期)</p>
<p>(三)时钟频率</p>
<p>指CPU在单位时间内发出的脉冲次数,以兆赫(MHz)和吉赫(GHz)为单位</p>
<p>(四)内存容量</p>
<h1 id="七、计算机系统和组成结构"><a href="#七、计算机系统和组成结构" class="headerlink" title="七、计算机系统和组成结构"></a>七、计算机系统和组成结构</h1><p>(一)冯·诺依曼计算机</p>
<p>存储程序的概念由冯·诺依曼于1945年提出,奠定了现在计算机的结构基础。现在计算机均为冯诺依曼体系结构</p>
<ol>
<li>计算机的五大组成:运算器、控制器、存储器、输入设备和输出设备五大部件</li>
<li>采用二进制</li>
<li>存储程序:是冯诺依曼思想的核心,将实现编号的程序存入计算机中,计算机按照这些程序自动运行</li>
</ol>
<p>(二)冯·诺依曼的工作原理</p>
<ol>
<li>存储程序:将要执行的程序和数据事先编程二进制形式的编码存入主存储其中</li>
<li>程序控制:自动地、连续的从主存储器中依次取出指令并执行</li>
</ol>
<p>典型的冯诺依曼以运算器为中心,但是现代的计算机已转为存储器为中心</p>
<p>(三)计算机系统的构成</p>
<p>一个计算机系统包括硬件系统和软件系统两大部分</p>
<p>硬件包括运算器、控制器、存储器、输入设备和输出设备等五个基本部分</p>
<p>而硬件中包括:</p>
<ol>
<li>主机系统:运算器、控制器与内存储器</li>
<li>外部设备:外存储器、输入设备、输出设备</li>
</ol>
<p>运算器和控制器统称为CPU</p>
<ul>
<li>随机存储器(RAM):随时读写,速度很快</li>
<li>只读存储器(ROM):一般是事先写好的,计算机工作过程中只能读出,ROM数据稳定,断电后不会改变</li>
</ul>
<p>软件则是程序和有关文档的总称,通常存放在计算机的主存或辅存内</p>
<p>计算机软件系统包括软件系统和应用软件两大类</p>
<p>(四)计算机系统的层次机构</p>
<ol start="0">
<li>微程序机器层</li>
<li>机器语言层</li>
<li>操作系统层</li>
<li>汇编语言层</li>
<li>高级语言层</li>
</ol>
]]></content>
<categories>
<category>计算机组成原理</category>
</categories>
<tags>
<tag>计算机组成原理</tag>
</tags>
</entry>
<entry>
<title>机器学习笔记(六)朴素贝叶斯</title>
<url>/2020/08/03/Bayes/</url>
<content><![CDATA[<h2 id="1-朴素贝叶斯原理"><a href="#1-朴素贝叶斯原理" class="headerlink" title="1 朴素贝叶斯原理"></a>1 朴素贝叶斯原理</h2><p>朴素贝叶斯是一种直接衡量标签和特征之间的概率关系的有监督学习算法,是一种专注分类的算法</p>
<p>贝叶斯理论等式:</p>
<p>$$P(Y|X)=\frac{P(X|Y) * P(Y)}{P(X)}$$</p>
<p>我们可以把特征$X$当成是我们的条件事件,而我们要求解的标签Y当成是我们被满足条件后会被影响的结果,而两者之间的概率关系就是$P(Y|X)$,这个概率在机器学习中,被称为是标签的后验概率。而标签Y被写作$P(Y)$,被称为标签的先验概率</p>
<a id="more"></a>
<p>假设我们只有两个特征$X_1,X_2$,由联合概率公式</p>
<p>$$P(X_1,X_2|Y=1)=\frac{X_1,X_2,Y=1}{P(Y=1)}$$<br>$$=\frac{P(X_1,X_2,Y=1)}{P(X_2,Y=1)} * \frac{P(X_2,Y=1)}{P(Y=1)}$$<br>$$=P(X_1|X_2,Y=1) * P(X_2|Y=1)$$</p>
<p><strong>将(X_2,Y=1)看成一个条件</strong></p>
<p><strong>当X_1,X_2是独立时$$P(X_1|X_2,Y=1)等于P(X_1|Y=1)$$</strong><br>$$=P(X_1|Y=1) * P(X_2|Y=1)$$</p>
<p>推广到n个$X$,则有:</p>
<p>$$P(X|Y=1)=\prod_{i=1}^{n}P(X_i=x_i|Y=1)$$</p>
<p><strong>假设特征之间是有条件独立的,可以解决众多问题,也简化了很多计算过程,这是朴素贝叶斯被称为“朴素”的理由</strong></p>
<p>因此,贝叶斯在特征之间有较多相关性的数据集上表现不佳。</p>
<p>分母的求解可以根据全概率公式<br>$$P(X)=\sum_{i=1}^mP(y_i) * P(X|Y_i)$$</p>
<p>其中m代表标签的种类,对于二分类:<br>$$P(X)=P(Y=1) * P(X|Y=1)+P(Y=0) * P(X|Y=0)$$</p>
<h2 id="2-不同分布下的贝叶斯"><a href="#2-不同分布下的贝叶斯" class="headerlink" title="2 不同分布下的贝叶斯"></a>2 不同分布下的贝叶斯</h2><h3 id="2-1-高斯朴素贝叶斯GaussianNB"><a href="#2-1-高斯朴素贝叶斯GaussianNB" class="headerlink" title="2.1 高斯朴素贝叶斯GaussianNB"></a>2.1 高斯朴素贝叶斯GaussianNB</h3><figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">class sklearn.naive_bayes.GaussianNB (priors=None, var_smoothing=1e-09)</span><br></pre></td></tr></table></figure>
<p>高斯朴素贝叶斯,通过假设$P(x_i|Y)$是服从高斯分布</p>
<p>$$P(x_i|Y)=f(x_i;\mu,\sigma) * \epsilon$$<br>$$=\frac{1}{\sqrt{2\pi \sigma_y^2}}exp(-\frac{(x_i-\mu_y)^2}{2\sigma_y^2})$$</p>
<h3 id="2-2-多项式朴素贝叶斯MultinomialNB"><a href="#2-2-多项式朴素贝叶斯MultinomialNB" class="headerlink" title="2.2 多项式朴素贝叶斯MultinomialNB"></a>2.2 多项式朴素贝叶斯MultinomialNB</h3><p>假设概率分布是服从一个简单多项式分布,具体可解释为:实验包括n次重复实验,每项实验都有不同的可能结果,在任何给定的实验中,特定结果发生的概率是不变的。</p>
<ol>
<li>多项式分布擅长的是分类型变量,在其原理假设中的概率是离散的,并且不同下的相互独立,互不影响。虽然sklearn中的多项式分布也可以处理连续型变量,但现实中,如果我们真的想要处理连续型变量,使用高斯朴素贝叶斯。</li>
<li>多项式实验中的实验结果都很具体,它所涉及的特征往往是次数,频率,计数,出现与否这样的概念,这些概念都是离散的正整数,因此sklearn中的多项式朴素贝叶斯不接受负值的输入。</li>
</ol>
<h3 id="2-3-伯努利朴素贝叶斯BernoulliNB"><a href="#2-3-伯努利朴素贝叶斯BernoulliNB" class="headerlink" title="2.3 伯努利朴素贝叶斯BernoulliNB"></a>2.3 伯努利朴素贝叶斯BernoulliNB</h3><p>多项式朴素贝叶斯可同时处理二项分布(抛硬币)和多项分布(掷骰子),其中二项分布又叫做伯努利分布,它是一种现实中常见,并且拥有很多优越数学性质的分布。因此,既然有着多项式朴素贝叶斯,我们自然也就又专门用来处理二项分布的朴素贝叶斯:伯努利朴素贝叶斯。</p>
<h3 id="2-4-改进多项式朴素贝叶斯:补集朴素贝叶斯ComplementNB"><a href="#2-4-改进多项式朴素贝叶斯:补集朴素贝叶斯ComplementNB" class="headerlink" title="2.4 改进多项式朴素贝叶斯:补集朴素贝叶斯ComplementNB"></a>2.4 改进多项式朴素贝叶斯:补集朴素贝叶斯ComplementNB</h3><p>补集朴素贝叶斯(complement naive Bayes,CNB)算法是标准多项式朴素贝叶斯算法的改进。CNB的发明小组创造出CNB的初衷是为了解决贝叶斯中的“朴素”假设带来的各种问题,他们希望能够创造出数学方法以逃避朴素贝叶斯中的朴素假设,让算法能够不去关心所有特征之间是否是条件独立的。以此为基础,他们创造出了能够解决样本不平衡问题,并且能够一定程度上忽略朴素假设的补集朴素贝叶斯。在实验中,CNB的参数估计已经被证明比普通多项式朴素贝叶斯更稳定,并且它特别适合于样本不平衡的数据集。有时候,CNB在文本分类任务上的表现有时能够优于多项式朴素贝叶斯,因此现在补集朴素贝叶斯也开始逐渐流行。</p>
]]></content>
<categories>
<category>机器学习</category>
</categories>
<tags>
<tag>机器学习</tag>
</tags>
</entry>
<entry>
<title>计算机组成原理笔记(三):指令和总线</title>
<url>/2020/09/10/CO3/</url>
<content><![CDATA[<h1 id="一、指令系统"><a href="#一、指令系统" class="headerlink" title="一、指令系统"></a>一、指令系统</h1><p>(1)指令系统组成</p>
<p>计算机的指令有微指令、机器指令和宏指令之分</p>
<p>微指令是微程序级的命令,属于硬件;</p>
<p>宏指令是由若干条机器指令组成的软件指令,属于指令</p>
<p>机器指令则介于微指令与宏指令之间,是软件和硬件的交界面,通常简称为指令</p>
<a id="more"></a>
<p>指令系统一般由两种类型组成</p>
<p>1.非特权指令</p>
<p>主要提供用户使用,又可分为功能性指令和非功能性指令。功能性指令主要包括算术逻辑指令、数据传输指令、浮点运算指令、字符串指令等;非功能性指令主要包括转移指令、控制指令等。</p>
<p>2.特权指令</p>
<p>主要提供系统程序员使用,一般不允许用户使用。其中包括I/O指令,停机等待指令、存储管理及保护指令、控制系统状态指令、诊断指令等。</p>
<p>用户希望使用这些指令,必须通过访管指令调用操作系统,再由操作系统控制和执行这些特权指令</p>
<p>指令系统较好有几个原则:</p>
<ol>
<li>完备性</li>
<li>规整性:指令系统正交性、均匀性、对称性</li>
<li>兼容性</li>
<li>可扩充性</li>
</ol>
<p>(2)指令分类</p>
<p>按照功能可以分为</p>
<ol>
<li>数据传送指令</li>
<li>算术运算类</li>
<li>逻辑运算</li>
<li>程序控制</li>
<li>输入输出</li>
<li>字符串</li>
<li>系统控制类</li>
<li>其他指令</li>
</ol>
<p>(3)指令格式</p>
<p>1.基本格式</p>
<p>用二进制代码表示结构的形式,通常由操作码字段和地址码字段组成</p>
<p>2.指令长度</p>
<p>二进制代码的位数</p>
<p>指令长度可以等于机器字长,也可以大于或小于</p>
<p>指令长度等于机器字长称为单字长指令</p>
<p>等于半个机器字长,称为半字节指令</p>
<p>等于两个机器字长,称为双字长指令</p>
<p>若所有指令长度都是相等的,称为定长指令字结构;如果指令长度可变,称为变长指令字结构</p>
<p>3.操作码</p>
<p>指令系统中的每一条指令都有唯一确定的操作码</p>
<p>在字长较长的大中型计算机中大多采用固定长度,微小和小型计算机采用可变格式</p>
<p>4.地址码</p>
<p>用于指令的源操作数的地址、结果的地址以及下一条指令的地址</p>
<p>(4)寻址方式</p>
<p>寻址方式可以分为数据寻址和指令寻址。</p>
<p>1.指令寻址</p>
<p>指令寻址比较简单,可以分为顺序寻址和跳跃寻址</p>
<p>2.数据寻址</p>
<p>指令字中必须设字段来指明属于哪一种寻址方式。</p>
<ol>
<li>立即寻址:操作码和操作数被同时取出,不必再次访问存储器</li>
<li>直接寻址:给出地址A就是操作数的有效地址</li>
<li>间接寻址:指令给的地址不是操作数的地址,而是存放操作数的地址</li>
<li>寄存器寻址:所指寄存器中存放着的操作数(寄存器存取数据快;由于寄存器的数量较少,其地址码字段比主存单元地址字段短的多)</li>
<li>变址寻址:在遇到需要频繁修改地址时,无需修改命令,只需修改变址就可以</li>
<li>基址寻址:算法与变址寻址基本相同,但是面向场合不同,变址面向用户,基址面向系统</li>
<li>相对寻址</li>
<li>隐含寻址</li>
<li>堆栈寻址</li>
</ol>
<p>(5)RISC技术</p>
<p>精简指令系统</p>
<ol>
<li>选取使用频率较高的简单指令,以及很有用但不复杂</li>
<li>指令长度固定,指令格式少,寻址方式类少</li>
<li>只有存取指令访问存储器,其余操作都在寄存器内完成</li>
<li>CPU有多个通用寄存器</li>
<li>采用流水线操作,大部分指令在一个时钟周期完成</li>
<li>控制器采用组合逻辑控制为主</li>
<li>采用优化编译技术</li>
</ol>
<h1 id="二、总线系统"><a href="#二、总线系统" class="headerlink" title="二、总线系统"></a>二、总线系统</h1><p>总线是连接多个部件的信息传输线,是各部分共享的传输介质</p>
<p>从不同角度,按数据传输方式,可分为串行传输总线和并行传输总线;</p>
<p>按连接部件不同,可分为片内总线、系统总线和通信总线</p>
<p>系统总线按照传输信息的不同,又可以分为三类:</p>
<ol>
<li>地址总线:传送CPU发出的地址信息,是单向总线</li>
<li>数据总线:传送数据信息,是双向总线</li>
<li>控制总线:传送控制信号、时序信号和状态信息等,是双向总线</li>
</ol>
<p>总线的特性</p>
<ul>
<li>物理特性</li>
<li>功能特性</li>
<li>电器特性</li>
<li>时间特性</li>
</ul>
<p>总线性能指标</p>
<ul>
<li>总线频率</li>
<li>总线宽度:总线的位数</li>
<li>总线的传输速率</li>
<li>时钟同步/异步</li>
<li>总线复用</li>
<li>总线负载能力</li>
</ul>
<p>总结结构</p>
<ul>
<li>单总线结构:用一条系统总结连接计算机系统的各个功能部件,各功能间所有的信息传输都靠这条总线来实现</li>
<li>双总线结构</li>
<li>三总线结构</li>
</ul>
<p>总线标准</p>
<ul>
<li>SCSI:小型计算机接口,是一种通用的并行接口标准,用于计算机和外部设备之间进行物理连接和传输数据,通常用在硬盘和磁带</li>
<li>RS-232C:串行通信总线,应用于串行二进制交换的数据终端设备和数据通信设备之间的标准接口</li>
<li>FireWire</li>
<li>USB:通用串行,实现外设的简单快速连接<ul>
<li>USB2.0最高速度480Mbs,供电能力0.5A</li>
<li>USB3.0最高速度5Gbps,供电能力1A</li>
</ul>
</li>
</ul>
<p>总线控制</p>
<ul>
<li>总线仲裁:为避免总线冲突,以一定的优先算法仲裁总线的使用权</li>
</ul>
<p>1.链式查询</p>
<p>有点在于只用很少几根线就能按一定优先次序实现总线仲裁,很容易扩充设备。但是对电路故障很敏感,而且查询的优先极是固定的,优先极较低的设备可能长期不能使用总线</p>
<p>2.定时器定时查询</p>
<p>3.独立请求</p>
<ul>
<li>总线通信控制</li>
</ul>
<p>解决通信双方如何获知传输开始和传输结构</p>
<ol>
<li>同步通信:通信双方由同一时标控制通信</li>
<li>异步通信</li>
<li>半同步通信</li>
<li>分离式通信</li>
</ol>
<p>总线的信息传输模式</p>
<ol>
<li>读写操作</li>
<li>块传输操作</li>
<li>写后读、读修改写操作</li>
<li>广播、广集操作</li>
</ol>
]]></content>
<categories>
<category>计算机组成原理</category>
</categories>
<tags>
<tag>计算机组成原理</tag>
</tags>
</entry>
<entry>
<title>计算机组成原理笔记(二):数据的表示与运算</title>
<url>/2020/09/09/CO2/</url>
<content><![CDATA[<h1 id="一、非十进制数转换为十进制数"><a href="#一、非十进制数转换为十进制数" class="headerlink" title="一、非十进制数转换为十进制数"></a>一、非十进制数转换为十进制数</h1><p>(一)方法</p>
<p>每位上的数码乘以基的位次方,然后求和</p>
<a id="more"></a>
<h1 id="二、十进制转换成非十进制数"><a href="#二、十进制转换成非十进制数" class="headerlink" title="二、十进制转换成非十进制数"></a>二、十进制转换成非十进制数</h1><p>(一)方法</p>
<p>整数部分:除N取余数,直至商为0,余数倒数输出</p>
<p>小数部分:乘N取整数,直至积为0(或满足精度),整数正输出</p>
<h1 id="三、二-八-十六进制相互转换"><a href="#三、二-八-十六进制相互转换" class="headerlink" title="三、二/八/十六进制相互转换"></a>三、二/八/十六进制相互转换</h1><p>对应位数相互转换</p>
<p>一个八进制对应3个二进制</p>
<p>一个十六进制对应4个二进制</p>
<h1 id="四、机器数"><a href="#四、机器数" class="headerlink" title="四、机器数"></a>四、机器数</h1><p>对于数的符号机器是无法识别的,需要把符号数码化,约定二进制的最高位为符号位</p>
<p>“0”表示正号,“1”表示负号</p>
<p>(一)原码</p>
<p>机器数最简单的表示方式,其符号位用0表示正号,1表示负号</p>
<p>(二)反码</p>
<p>机器数的反码由原码得到,如果是正数则与原码一样</p>
<p>如果是负数,则符号位不变,其余取反</p>
<p>(三)补码</p>
<p>如果是正数,则机器数的补码与原码一致</p>
<p>如果是负数,则是反码末尾加一</p>
<p>(四)补码的加减运算</p>
<p>1.补码加法</p>
<p>两个补码表示的数相加,符号位参与运算,且两位数和的补码等于两数补码之和:</p>
<p>$$[X+Y]补=[X]补+[Y]补$$</p>
<p>$$[Y补]补=[Y]原$$</p>
<p>已知[Y]补求[-Y]补的方法是:将[Y]<br>补连通符号位一起求反,末尾加一</p>
<p>2.符号扩展</p>
<p>原有符号位,保持不变,若<br>为正数所有附加位用0进行填充;若为负数则所有附加位用负数填充</p>
<p>3.补码溢出的产生</p>
<p>发生这种错误的原因在于两数相加之和的数值已超过了机器允许的表示范围</p>
<ul>
<li>若两数异号则不会溢出</li>
</ul>
<p>4.补码溢出的检测</p>
<p>(1)采用符号位检测</p>
<p>(2)采用进位位</p>
<p>(3)采用变形补码(双符号位补码)</p>
<h1 id="五、定点数和浮点数表示"><a href="#五、定点数和浮点数表示" class="headerlink" title="五、定点数和浮点数表示"></a>五、定点数和浮点数表示</h1><ul>
<li><p>定点数:小数点固定不变</p>
</li>
<li><p>浮点数:小数点可以浮动</p>
</li>
</ul>
<p>微型机多使用定点数</p>
<p>计算机中的浮点表示包括两个部分:一部分是阶码(表示指数,记作E);另一部分是尾数(表示有效数字,记作M)</p>
<p>设任意一个数N可以表示为:</p>
<p>$$N*2^E$$</p>
<p>其中,2位基数;E为阶码;M为尾数,浮点数在机器中的表示方法如下:</p>
<table>
<thead>
<tr>
<th align="center">阶符</th>
<th align="center">阶码(E)</th>
<th align="center">数符</th>
<th align="center">尾数(M)</th>
</tr>
</thead>
</table>
<p>当一个数的阶码大于机器所能表示的最大阶码,产生上溢,上溢时机器一般不再继续运算而转入</p>
<p>当一个阶码小于机器所能表示的最小阶码,发生下溢,机器按0来处理</p>
<p>(一)IEEE754标准</p>
<p>S:1位,E:8位,M:23位</p>
<table>
<thead>
<tr>
<th align="center">符号位(S)</th>
<th align="center">阶码(E)</th>
<th align="center">尾数(M)</th>
</tr>
</thead>
</table>
<p>其对应的真值是:</p>
<p>$$x=(-1)^S * (1.M)* 2^e, e = (E)_{10}-127$$</p>
<h1 id="六、浮点加减法运算"><a href="#六、浮点加减法运算" class="headerlink" title="六、浮点加减法运算"></a>六、浮点加减法运算</h1><p>(一)对阶</p>
<p>对阶的目的是使两操作数的小数点位置对齐。</p>
<p>(二)尾数求和</p>
<p>将对阶后的两个尾数,按定点加(减)运算规则进行运算</p>
<p>(三)规格化</p>
<p>为增加有效数字的位数,提高运算精度,必须将求和(差)后的尾数规格化</p>
<p>当尾数用二进制表示时,尾数M的规格化形式为</p>
<p>$$1/2<=|M|<1$$</p>
<p>(四)舍入</p>
<ol>
<li>0舍1入法:在尾数右移时,被移去的最高数值为0,则舍去;反之则在尾数的末位加1</li>
<li>恒置1法:尾数右移,尾数丢失,都在尾数末位恒置1</li>
</ol>
<p>(五)溢出判断</p>
<p>浮点数的溢出是以其阶码溢出表现出来的</p>
<h1 id="七、逻辑运算和位移操作"><a href="#七、逻辑运算和位移操作" class="headerlink" title="七、逻辑运算和位移操作"></a>七、逻辑运算和位移操作</h1><p>计算机中的逻辑运算包括与、或、非、异或等运算</p>
<p>移位运算为移位操作,对计算机来说有很大的实用价值,如当某计算机没有乘除法运算线路时,可以采用移位和加法相结合以实现乘除运算</p>
<p>算术移位的规则(有符号数):</p>
<p>首先,不论是正数还是负数,移位后其符号位均不变</p>
<p>对于正数,移位后出现的空位均填0</p>
<p>对于负数,其空位的添补规则不同:</p>
<ol>
<li>原码,其空位均添0</li>
<li>反码,其空位均添1</li>
<li>补码,左移空位添0,右移其空位添1</li>
</ol>
<p>逻辑移位的规则是(无符号数):</p>
<p>逻辑左移,高位丢失,低位添0</p>
<p>逻辑右移,低位丢失,高位添0</p>
<h1 id="八、非数值数据的表示"><a href="#八、非数值数据的表示" class="headerlink" title="八、非数值数据的表示"></a>八、非数值数据的表示</h1><p>ASCII码,美国信息交换标准代码,是计算机中使用最广泛的字符编码,已经作为国际通用的信息交换标准代码</p>
<p>汉子的编码:GB2312-80,简称国标码</p>
<h1 id="九、数据校验码"><a href="#九、数据校验码" class="headerlink" title="九、数据校验码"></a>九、数据校验码</h1><p>奇偶校验码,在被传送的n位有效信息代码上增加一位校验位,并使其配置后n+1位代码中1的个数为奇数,则称其为奇校验,如果是偶数则称为偶校验</p>
<p>循环冗余校验码(CRC),基于摸2运算建立的校验码,将待编码的有效信息左移若干位,用另一个约定的多项式去除,所产生的余数就是校验位。有效信息和校验位相拼接就构成了CRC</p>
<p>接受到的数据除以校验位,如果有余数发生错误,如果除尽了就代表是正确的</p>
<p>海明校验码是目前广泛采用的一种有效的校验码。在有效信息中加入几个校验位形成海明码,当某一位出现错误后,就会引起有关的几个校验位的值发生变化,因此海明码不但可以发现错误,还能指出错误的位置,为自动纠错提供位置</p>
]]></content>
<categories>
<category>计算机组成原理</category>
</categories>
<tags>
<tag>计算机组成原理</tag>
</tags>
</entry>
<entry>
<title>计算机组成原理笔记(四):存储系统</title>
<url>/2020/09/11/CO4/</url>
<content><![CDATA[<h1 id="1-存储器概述"><a href="#1-存储器概述" class="headerlink" title="1 存储器概述"></a>1 存储器概述</h1><p>按照数据的高字节和低字节在存储器中的存储次序,可分为</p>
<ul>
<li>大端:将最低字节存储在最大地址</li>
<li>小端:将最低字节存储在最小地址</li>
</ul>
<p>边界对齐虽然浪费了部分存储空间,但是提高了指令对操作数的访问速度</p>
<a id="more"></a>
<p>(一)按存储介质分类</p>
<ul>
<li>半导体</li>
<li>磁性材料</li>
<li>光盘等</li>
</ul>
<p>(二)按存取方式</p>
<ul>
<li>随机存储器:半导体和磁芯存储器</li>
<li>顺序存储器:磁带</li>
<li>半顺序存储器:磁盘</li>
</ul>
<p>(三)按存储器的读写功能分类</p>
<ul>
<li><p>只读存储器(ROM):半导体存储器,只能读出不能写入</p>
<ul>
<li>掩膜只读存储器MROM</li>
<li>可编程只读存储器PROM:只能写一次</li>
<li>可编程可擦除EPROM</li>
<li>用电可擦除EEPROM</li>
</ul>
</li>
<li><p>随机存储器(RAM)</p>
<ul>
<li>静态随机存储器SRAM(速度比动态快)</li>
<li>动态随机存储器DRAM</li>
</ul>
</li>
</ul>
<p>(四)按信息的可保存性</p>
<p>断电后信息小时的存储器,称为易失性存储器;断电后能保存的,称为非易失性存储器</p>
<h1 id="2-主存储器"><a href="#2-主存储器" class="headerlink" title="2 主存储器"></a>2 主存储器</h1><p>(一)DRAM的刷新</p>
<p>通常有三种刷新方式:集中刷新、分散刷新和异步刷新</p>
<p>(二)存储器与CPU的连接</p>
<p>存储器的扩展</p>
<p>1.位扩展</p>
<p>2.字扩展</p>
<p>3.字和位同时扩展</p>
<p>存储芯片与CPU芯片连接,要注意片与片之间的地址线、数据线和控制线的连接</p>
<p>1.地址线的连接</p>
<p>CPU的地址线往往比存储芯片的地址线多,通常是将CPU地址线的低位与存储芯片的地址线连接,高位在存储芯片扩充时使用,或做其他用途</p>
<p>2.数据线的连接</p>
<p>CPU的竖线数与存储芯片的数据线也不一定相等,要对存储芯片扩展,使其数据位数与CPU的数据线数相等</p>
<p>3.读/写命令线</p>
<p>可以直接与存储芯片的读/写命令线直接连接</p>
<p>4.片选线的连接</p>
<p>5.合理选择存储芯片</p>
<h1 id="3-高速缓冲存储器"><a href="#3-高速缓冲存储器" class="headerlink" title="3 高速缓冲存储器"></a>3 高速缓冲存储器</h1><p>Cache的容量与快长是影响Cache效率的重要因素,通常用“命中率”来衡量Cache的效率。</p>
<p>Cache块内写入的信息,必须与被映射的主存块内的信息完全一致。</p>
<ol>
<li>写直达法</li>
<li>写回法</li>
</ol>
<p>高速缓冲存储器的改进</p>
<ol>
<li>单一缓存和两级缓存</li>
<li>统一缓存和分立缓存</li>
</ol>
<p>高速缓冲存储器的地址映射</p>
<ol>
<li>直接映射</li>
<li>全相联映射:可以将主存映射到Cache任意块上</li>
<li>组相联映射</li>
</ol>
<p>高速缓冲存储器的替换策略</p>
<ol>
<li>先进先出</li>
<li>近期最少使用使用</li>
</ol>
]]></content>
<categories>
<category>计算机组成原理</category>
</categories>
<tags>
<tag>计算机组成原理</tag>
</tags>
</entry>
<entry>
<title>计算机组成原理笔记(六):I/O设备和系统</title>
<url>/2020/09/11/CO6/</url>
<content><![CDATA[<h1 id="1-外存储器"><a href="#1-外存储器" class="headerlink" title="1 外存储器"></a>1 外存储器</h1><p>磁表面存储器的主要技术指标</p>
<ol>
<li>记录密度</li>
<li>存储容量</li>
<li>平均寻址时间</li>
<li>数据传输率</li>
<li>误码率</li>
</ol>
<a id="more"></a>
<p>磁表面存储器的记录方式</p>
<ol>
<li>归零制(RZ)</li>
<li>不归零制(NRZ)</li>
<li>“见1就翻”的不归零制(NRZ1)</li>
<li>调相制(PM):磁带</li>
<li>调频制(FM):硬盘和软盘</li>
<li>改进型调频制(MFM)</li>
</ol>
<p>评价记录方式的评价指标</p>
<ol>
<li>编码效率:记录一位信息的最大磁化翻转次数</li>
<li>自同步能力</li>
</ol>
<h1 id="2-中断方式"><a href="#2-中断方式" class="headerlink" title="2 中断方式"></a>2 中断方式</h1><ol>
<li>人为设置的中断</li>
<li>程序性事故</li>
<li>硬件故障</li>
<li>I/O设备</li>
<li>外部事件</li>
</ol>
<p>中断可简单地归纳为以下几个阶段</p>
<ol>
<li>中断请求</li>
<li>中断优判</li>
<li>中断响应</li>
<li>中断服务</li>
<li>中断返回</li>
</ol>
<h1 id="3-DMA方式"><a href="#3-DMA方式" class="headerlink" title="3 DMA方式"></a>3 DMA方式</h1><p>DMA适合于内存与高速I/O设备或外存之间的信息交换。DMA方式中,由于DMA接口与CPU共享内存,为有效分时使用内存,通常DMA与内存交换数据时采用以下三种方式</p>
<ol>
<li>CPU停止访问内存法</li>
<li>周期挪用法</li>
<li>DMA与CPU交替访问</li>
</ol>
]]></content>
<categories>
<category>计算机组成原理</category>
</categories>
<tags>
<tag>计算机组成原理</tag>
</tags>
</entry>
<entry>
<title>数据库总结笔记(一):关系数据库标准语言</title>
<url>/2020/09/16/DB1/</url>
<content><![CDATA[<h1 id="1-关系数据库常识"><a href="#1-关系数据库常识" class="headerlink" title="1 关系数据库常识"></a>1 关系数据库常识</h1><p>(一)关系代数</p>
<p>抽象的查询语言,它运算的对象是关系,运算产生的结果也是关系</p>
<ol>
<li>基于传统的集合运算(二目运算,包括并、差、交和笛卡尔积)</li>
<li>专门的关系运算(选择、投影、连接和除运算等)</li>
</ol>
<p>自然连接是一种特殊的等值连接。要求两个关系中进行比较的分量必须是相同的属性组,并且在结果中把重复的属性列去掉</p>
<p>外连接是连接运算的扩展,可以用来处理缺失的信息,避免信息的丢失</p>
<a id="more"></a>
<h1 id="2-SQL概述"><a href="#2-SQL概述" class="headerlink" title="2 SQL概述"></a>2 SQL概述</h1><h2 id="2-1-数据定义语言"><a href="#2-1-数据定义语言" class="headerlink" title="2.1 数据定义语言"></a>2.1 数据定义语言</h2><p>(一)定义表</p>
<p>1.语句格式</p>
<figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">CREATE TABLE <表名>(<列名称><数据类型>[列级完整性约束][,<列名称><数据类型>[列级完整性约束]...][,<表级完整性约束>]);</span><br></pre></td></tr></table></figure>
<p>完整性约束:</p>
<ol>
<li>Not NULL:不能为空</li>
<li>NULL:可以为空</li>
<li>Unique:不能有相同的</li>
<li>PRIMARY KEY:主码,不能为空</li>
<li>FOREIGN KEY : 外键,另一张表的主键</li>
</ol>
<p>(二)修改表</p>
<p>1.语句格式</p>
<figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">ALTER TABLE <表名>[ADD<列名><数据类型>[列的完整性约束]]|[ADD<表级完整性约束>]</span><br><span class="line">[ALTER COLUMN<列名><新的数据类型>]</span><br><span class="line">[DROP COLUMN<列名>]</span><br><span class="line">[DROP CONSTRAINT<表级完整性约束名>]</span><br></pre></td></tr></table></figure>
<p>(三)删除表</p>
<p>1.语句格式</p>
<figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">DROP TABLE<表名1>[,<表名2>];</span><br></pre></td></tr></table></figure>
<p>(四)建立索引</p>
<p>1.数据格式</p>
<figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">CREATE [UNIQUE][CLUSTER] INDEX<索引名称></span><br><span class="line"></span><br><span class="line">ON<表名>(<列名>[<次序>][,<列名>[<次序>]]...);</span><br></pre></td></tr></table></figure>
<ol>
<li>UNIQUE:此索引的每一个索引值只对应唯一的数据记录</li>
<li>CLUSTER:索引引项的顺序与关系中的记录的物理顺序一致的索引组织</li>
<li>次序:ASC(升序)、DESC(降序),默认为ASC</li>
</ol>
<p>(五)删除索引</p>
<p>1.语句格式</p>
<figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">DROP INDEX<索引名称>;</span><br></pre></td></tr></table></figure>
<h2 id="2-2-数据查询语言"><a href="#2-2-数据查询语言" class="headerlink" title="2.2 数据查询语言"></a>2.2 数据查询语言</h2><p>(一)语句基本形式</p>
<p>1.语句格式</p>
<figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">SELECT [ALL|DISTINCT] <目标列表达式>[,<目标列表达式>]...</span><br><span class="line">FROM <表名或试图名称>[,<表名或视图名称>]...</span><br><span class="line">[WHERE <条件表达式>]</span><br><span class="line">[GROUP BY <列名1>[HAVING<条件表达式>]]</span><br><span class="line">[ORDER BY <列名2>[ASC|DESC]];</span><br></pre></td></tr></table></figure>
<ol>
<li>[ALL|DISTINCT]:默认为ALL,有重复元组,如果不希望有重复元组则选DISTINCT</li>
<li>HAVING:如果GROUP BY中带HAVING短语,则只有满足条件的组才会被输出</li>
</ol>
<p>(二)单表查询</p>
<p>单表查询是对一个表的查询,也可以称为单关系查询</p>
<p>1.查询指定的列</p>
<figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">SELECT StudentName, StudentAddress FROM Stuednt;</span><br></pre></td></tr></table></figure>
<p>2.查询全部的列</p>
<figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">SELECT * FROM Student;</span><br></pre></td></tr></table></figure>
<p>3.查询计算的值</p>
<figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">COUNT([DISTINCT/ALL]*)----统计元组的个数</span><br><span class="line">COUNT([DISTINCT/ALL]<列名>)----统计结果中某列值的个数</span><br><span class="line">MAX(<列名>)----给出一列上的最大值</span><br><span class="line">MIN(<列名>)</span><br><span class="line">SUM([DISTINCT/ALL]<列名>)</span><br><span class="line">SUM([DISTINCT/ALL]<列名>)</span><br></pre></td></tr></table></figure>
<p>4.消除取值重复的行</p>
<figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">SELECT DISTINCT StudentNumber FROM Grade;</span><br></pre></td></tr></table></figure>
<p>5.查询满足条件的元组</p>
<p>(SQL语言中<>代表不等于)</p>
<figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">查询所有男同学信息</span><br><span class="line">SELECT * FROM Student WHERE StudentSex="男";</span><br><span class="line"></span><br><span class="line">查询成绩介于70到80分的学生</span><br><span class="line">SELECT * FROM Grade WHERE StudentGrade BETWEEN 70 AND 80;</span><br><span class="line"></span><br><span class="line">查询系别为01或02的学生姓名</span><br><span class="line">SELECT StudentName FROM Student</span><br><span class="line">WHERE StudentDept IN("01","02");</span><br><span class="line"></span><br><span class="line">字符匹配查询(汉子占两个字节)</span><br><span class="line">[NOT] LIKE ‘<匹配串>’[ESCAPE ‘<换码字符>’]</span><br><span class="line">其中匹配串可以使一个完整的字符串也可以含有通配符"-"或"%"</span><br><span class="line"></span><br><span class="line">在Student表中,查询姓沙的信息</span><br><span class="line">SELECT * FROM Student WHERE StudentName LIKE '沙%';</span><br><span class="line"></span><br><span class="line">查询系别01,并且性别为男的学生记录</span><br><span class="line">SELECT *FROM Student</span><br><span class="line">WHRER StudentSex="男" AND StudentDept = 01</span><br><span class="line"></span><br><span class="line">按成绩降序排列</span><br><span class="line">SELECT *FROM Grade ORDER BY StudentGrade DESC</span><br><span class="line"></span><br><span class="line">统计每个学生所选的课程数</span><br><span class="line">SELECT COUNT (StudentNumber) AS 所选课程数 FROM Grade GROUP BY StudentNumber;</span><br></pre></td></tr></table></figure>
<p>(三)连接查询</p>
<p>也称多表查询</p>
<p>1.内连接查询</p>
<p>(1)语句格式</p>
<figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">SELECT [DISTINCT/ALL]<目标列表达式[别名]清单></span><br><span class="line">FROM <关系名1[别名1]> INNER JOIN<关系名2[别名2]></span><br><span class="line">ON <连接条件表达式>;</span><br><span class="line"></span><br><span class="line">SELECT [DISTINCT/ALL] <目标列表达式[别名]清单></span><br><span class="line">FROM <关系名[别名]清单></span><br><span class="line">WHERE <连接条件表达式>;</span><br></pre></td></tr></table></figure>
<p>2.外连接</p>
<p>除了返回满足条件的元组外,还返回不匹配的元组,相当于并集</p>
<p>3.自身连接</p>
<p>是一个表与其自己连接</p>
<p>(四)嵌套查询</p>
<p>在SQL语言中,一个SELECT-FROM-WHERE语句称为一个查询块,将一个查询块嵌套在另一个查询块WHERE子句或HAVING短语的条件中的查询称为嵌套查询</p>
<p>但是不能使用ORDER BY子句,其只能对查询结果进行排序</p>
<figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">1.IN的子查询</span><br><span class="line">查询属于软件工程系徐盛的学号、姓名和性别</span><br><span class="line">SELECT S.StudentNumber, S.StudentName, S.StudentSex</span><br><span class="line">FROM Student S WHERE StudentDept IN</span><br><span class="line">(SELECT DeptNumber FROM Dept WHERE DetpName="软件工程系")</span><br><span class="line"></span><br><span class="line">2.比较运算符的查询</span><br><span class="line">SELECT S.StudentNumber, S.StudentName, S.StudentSex</span><br><span class="line">FROM Student S WHERE StudentDept=</span><br><span class="line">(SELECT DeptNumber FROM Dept WHERE DetpName="软件工程系")</span><br><span class="line"></span><br><span class="line">3.ANY或ALL的子查询</span><br><span class="line"></span><br><span class="line">4.EXISTS的子查询</span><br></pre></td></tr></table></figure>
<h2 id="2-3-数据更新语言"><a href="#2-3-数据更新语言" class="headerlink" title="2.3 数据更新语言"></a>2.3 数据更新语言</h2><p>(一)插入数据</p>
<p>1.语句格式</p>
<figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">INSERT INTO<表名>[(<属性名清单>)] VALUES(<常量清单>);</span><br></pre></td></tr></table></figure>
<p>2.实例</p>
<figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">插入学号、姓名、性别、籍贯、系别</span><br><span class="line">INSERT INTO Student(StudentNumber, StudentName, StudentSex,StudentAddress,StudentDept)</span><br><span class="line">VALUES('20160702','陈海','男','吉林','男')</span><br></pre></td></tr></table></figure>
<p>(二)修改数据</p>
<p>1.数据格式</p>
<figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">UPDATE <表名>SET <列名>=<表达式>[,<列名>=<表达式>][WHERE<条件>];</span><br></pre></td></tr></table></figure>
<p>2.实例</p>
<figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">修改籍贯</span><br><span class="line">Update Student SET StudentAddress='黑龙江'</span><br><span class="line">WHERE StudentName='陈海';</span><br></pre></td></tr></table></figure>
<p>(三)删除语句</p>
<p>1.语句格式</p>
<figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">DELETE FROM<表名>[WHERE<条件>];</span><br></pre></td></tr></table></figure>
<p>2.实例</p>
<figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">DELETE FROM Student WHERE StudentSex='女';</span><br></pre></td></tr></table></figure>
<h1 id="3-视图"><a href="#3-视图" class="headerlink" title="3 视图"></a>3 视图</h1><p>视图是一个虚表,不存放数据,数据仍然存放在原表中</p>
<p>(一)创立视图<br>1.语句格式</p>
<figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">CREATE VIEW <视图名>[<列名清单>]</span><br><span class="line"></span><br><span class="line">AS<子查询>[WITH CHECK OPTION];</span><br></pre></td></tr></table></figure>
<p>2.实例</p>
<figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">从Student表中取出系别为02的数据,组成视图</span><br><span class="line">CREATE VIEW Student_VIEW</span><br><span class="line">AS SELECT * FROM Student WHERE StudentDept=02;</span><br></pre></td></tr></table></figure>
<p>(二)删除视图</p>
<p>1.语句格式</p>
<figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">DROP VIEW <视图名>;</span><br></pre></td></tr></table></figure>
<p>2.实例</p>
<figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">DROP VIEW Student_VIEW;</span><br></pre></td></tr></table></figure>
<p>(三)查询视图</p>
<p>与基本表一致</p>
<p>(四)更新视图</p>
<p>防止视图对基本表的修改,因此对视图的更新最终都是通过对基本表的更新来进行的</p>
<p>(五)视图表的有点与缺点</p>
<p>优点:</p>
<ol>
<li>简单</li>
<li>安全</li>
<li>逻辑数据独立性</li>
<li>视图用户能以多角度看待同一数据</li>
</ol>
<p>缺点:</p>
<ol>
<li>性能差</li>
<li>修改限制严重</li>
</ol>
]]></content>
<categories>
<category>数据库</category>
</categories>
<tags>
<tag>数据库</tag>
</tags>
</entry>
<entry>
<title>数据库总结笔记(三):数据库高级应用</title>
<url>/2020/10/09/DB3/</url>
<content><![CDATA[<h1 id="1-物理结构设计"><a href="#1-物理结构设计" class="headerlink" title="1 物理结构设计"></a>1 物理结构设计</h1><p>(一)关系模式存取方法选择</p>
<p>常用的存取方法有三类,第一类是索引方法,目前主要是B+索引;第二是聚簇索引;第三类是HASH方法</p>
<p>1.索引存取方法</p>
<p>索引存取方法主要是为了提高查找效率,主要基于三点</p>
<ol>
<li>如果某属性或属性组织经常出现在查询条件中,考虑为该属性或属性组建立索引</li>
<li>如果某个属性常作为最大值和最小值等聚集函数的参数,考虑为该属性建立索引</li>
<li>如果某属性经常出现在连接操作中,考虑为该属性建立索引</li>
</ol>
<p>2.聚簇存取方法</p>
<p>聚簇是为了提高某个属性的查询速度,把这个属性或这些属性上具有相同值的元组集中存放在连续的物理块</p>
<p>3.HASH存取方法</p>
<a id="more"></a>
<h1 id="2-事务"><a href="#2-事务" class="headerlink" title="2 事务"></a>2 事务</h1><p>事务是一系列的数据库操作,是数据库应用程序的基本逻辑单元,具有以下4个特性(ACID)</p>
<ol>
<li>原子性</li>
<li>一致性</li>
<li>隔离性</li>
<li>持续性</li>
</ol>
<p>(一)并发控制概述</p>
<p>如果并发操作不加控制,虽然单个事务的执行并未发生问题,但由于其他事务的并发,可能引起数据的不一致性,主要体现在以下三个方面</p>
<ol>
<li>丢失修改</li>
<li>不可重复读</li>
<li>读“脏”数据</li>
</ol>
<p>(二)封锁</p>
<p>在对某个对象进行操作时,操作过程要给该对象进行加锁,使用时加锁,使用后撤销锁。锁的基本类型有两种:排他锁和共享锁</p>
<p>1.排它锁(写锁)</p>
<p>一旦建立,那么其他事务对该加了排它锁的对象不能进行再次加锁和其他类型操作</p>
<p>2.共享锁(读锁)</p>
<p>加了共享锁,其他事务就不能建立排它锁,但是可以再次建立一个共享锁</p>
<p>(三)活锁和死锁</p>
<p>1.活锁</p>
<p>活锁的解决方法很简单,主要采用的是先来先服务的策略</p>
<p>2.死锁</p>
<p>死锁的预防就是破坏死锁产生的条件,通常有两种:一次封锁法和顺序封锁法</p>
<ol>
<li>一次封锁法:一次性申请所有加锁要求</li>
<li>顺序封锁法:预先对所有数据对象规定一个顺序</li>
</ol>
<p>死锁的解决一般由两种,分别是:超时法和等待图法</p>
<p>(四)两段锁协议</p>
<p>1.加锁阶段</p>
<p>在对任何数据进行读操作之前要申请并获得S锁,在进行写操作之前要申请并获得X锁。加锁不成功进入等待状态</p>
<p>2.解锁阶段</p>
<p>在该阶段只能进行解锁操作不能进行加锁操作</p>
]]></content>
<categories>
<category>数据库</category>
</categories>
<tags>
<tag>数据库</tag>
</tags>
</entry>
<entry>
<title>数据库与SQL知识总结</title>
<url>/2020/08/29/DB/</url>
<content><![CDATA[<h2 id="1-常见问题总结"><a href="#1-常见问题总结" class="headerlink" title="1 常见问题总结"></a>1 常见问题总结</h2><h2 id="1-1-什么是MySQL"><a href="#1-1-什么是MySQL" class="headerlink" title="1.1 什么是MySQL"></a>1.1 什么是MySQL</h2><p>MySQL是一种关系型数据库,默认端口号是33006,默认的存储引擎是InnoDB,只有InnoDB是事务性存储引擎</p>
<p><strong>MyISAM和InnoDB区别</strong></p>
<p>MyISAM是MySQL的默认数据引擎(5.5版之前)虽然性能极佳,但是不支持事务和行级锁,却最大的缺陷就是崩溃后无法安全恢复,在5.5版之后,MySQL就引入了InnoDB(事务性数据库引擎)</p>
<a id="more"></a>
<p><strong>两者对比</strong></p>
<ol>
<li>是否支持行级锁</li>
<li>是否支持事务和崩溃后的安全恢复</li>
<li>是否支持外键</li>
<li>是否支持MVCC</li>
</ol>
<p><strong>字符集和校对规则</strong></p>
<p>字符集指的是一种从二进制编码到某类字符符号的映射,校对规则是指某种字符集下的排序规则</p>
<p>MySQL采用的是类似继承的方式指定字符集的默认值,每个数据库以及每张数据表都有自己的默认值,他们逐层继承</p>
<p><strong>索引</strong></p>
<p>MySQL索引使用的数据结构主要有BTree索引和哈希索引,对哈希索引来说,底层的数据结构就是哈希表,因此在绝大多数需求为单挑记录查询的时候,可以选择哈希索引,查询性能最快,其余大部分场景,建议选择BTree索引</p>
<p>MySQL的BTree索引使用的是B树中的B+Tree,但对于主要的两种存储引擎的实现方式是不同的</p>
<ul>
<li>MyISAM:B+树叶结点的data域存放的是数据记录地址,在检索索引的时候,先按照B+树搜索算法搜索索引,如果指定的Key存在,则取出其data域的值,然后以data域的值为地址读取相应的数据记录,被称为非聚簇索引</li>
<li>InnoDB:其数据本身就是索引文件,索引文件和数据文件是分离的,其表数据文件本身就是按B+树组织的一个索引结构,树的叶结点data域保存了完整的数据记录,这个索引key时数据表的主键,因此InonoDB表数据文件本身就是主索引。这被称为聚簇索引。而其余的索引都作为辅助索引,辅助索引的data域存储相应记录主键的值而不是地址。</li>
</ul>
<p>在根据主索引搜索时,直到找到key所在的结点即取出数据,在根据辅助索引查找时,则需要先取出主键的值,再走一遍主索引,因此,在设计表的时候,不建议使用过长的字段作为主键,也不建议使用非常单调的字段作为主键,这样会造成主索引频繁分裂</p>
<h2 id="1-2-什么是事务?"><a href="#1-2-什么是事务?" class="headerlink" title="1.2 什么是事务?"></a>1.2 什么是事务?</h2><p>事务是逻辑上的一组操作,要么都执行,要么都不执行</p>
<p>事务的四大特性(ACID)</p>
<ol>
<li>原子性(Atomicity):事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么完全不起作用</li>
<li>一致性(Consistency):执行事务前后,数据保持一致,多个事务对统一数据读取的结果是相同的</li>
<li>隔离性(IsoIation):并发访问数据库时,一个用户的事务不被其它事务所干扰,各并发事务之间数据库时独立的</li>
<li>持久性(Durability):一个事务被提交之后。对数据库中数据的改变是永久的,即使数据库发送故障也不应该对齐有任何影响</li>
</ol>
<p><strong>并发事务带来哪些问题?</strong></p>
<ul>
<li>脏度(Dirty read):当一个事务正在访问数据并且对数据进行了修改,而这种修改还没有提交到数据库中,这时另外一个事务也访问了这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据,那么另外一个事务读到这个数据是“脏数据”,依据“脏”数据所做的操作可能是不正确的</li>
<li>丢失修改(Lost to modify):指一个事务读取一个数据时,另一个事务也访问了该数据,那么在第一个事务中修改了这个数据,第二个事务也修改了这个数据,这样第一个事务内的修改结果就被丢失</li>
<li>不可重复读(Unrepeatableread):指一个事务内多次读同一个数据,这个事务还没有结束时,另一个事务也访问该数据,那么在第一个事务中的两次读数据之间,由于第二个事务的修改导致第一个事务两次读取的数据可能不太一样,就发生了在一个事务内两次读到的数据是不一样的情况</li>
<li>幻读(Phantom read):幻读与不可重复读类似,它发生在一个事务(T1)读取了几行数据,接着另一个并发事务(T2)插入了一些数据时,在随后的查询中,第一个事务就会发现多了一些原本不存在的记录</li>
</ul>
<p><strong>不可重复读和幻读的区别</strong></p>
<p>不可重复读的重点是修改,比如多次读取一条记录发现其中某些列的值被修改,幻读的重点在于新增或删除,比如多读取一条记录发现记录增多或减少了</p>
<p><strong>事务隔离级别有哪些?MySQL的默认隔离级别是?</strong></p>
<p>SQL标准定义了四个隔离级别:</p>
<ul>
<li>READ-UNCOMMITTED(读取未提交):最低的隔离界别,允许读取尚未提交的数据,可能会导致脏度,幻读,不可重复读</li>
<li>READ-COMMITTED(读取已提交):允许读取并发事务已提交的数据,可以阻止脏度,但是幻读和不可重复读还是有可能发生</li>
<li>REPEATABLE-READ(可重复读):对同一字段的多次读取结果都是一致的,除非数据被本身事务自己所修改,可以阻止脏度和不可重复读,但幻读仍有可能发生</li>
<li>SERIALIZABLE(可串行化):最高的隔离级别,完全俯冲ACID的隔离级别,所有事务依次逐个执行</li>
</ul>
<p>注意:与SQL标准不同的地方在于InnoDB存储引擎在<strong>REPEATABLE-READ(可重读)</strong>事务隔离级别下使用的Next-key Lock锁算法,因此可以避免幻读的产生。已经可以完全保证了事务的隔离性要求</p>
<p>InnoDB 存储引擎在 分布式事务 的情况下一般会用到 SERIALIZABLE(可串行化) 隔离级别</p>
<p><strong>锁机制与InnoDB锁算法</strong></p>
<p>MyISAM和InnoDB存储引擎使用的锁:</p>
<ul>
<li>MyISAM采用表级锁</li>
<li>InnoDB支持行级锁和表级锁,默认为行级锁</li>
</ul>
<p><strong>表级锁和行级锁对比:</strong></p>
<ul>
<li>表级锁:MySQL中锁定粒度最大的一种锁,对当前操作的整张表加锁,实现简单,资源消耗较少,不会出现死锁,但出发锁冲突的概率最高,并发度最低</li>
<li>行级锁:MySQL中粒度最小的一种锁,只针对当前的行进行加锁,行级锁能大大减少数据库操作的冲突,其并发度高,但加锁的开销也最大,加锁慢,会出现死锁</li>
</ul>
<p><strong>大表优化</strong></p>
<p>当MySQL单表记录过大时,数据库的CRUD性能会明显下降,一些常见的优化措施如下:</p>
<ol>
<li>限定数据的范围</li>
<li>读/写分离</li>
<li>垂直分区:根据数据库里数据表的相关性进行拆分,把一张列比较多的表拆分为多张表</li>
<li>水平分区:数据表行的拆分</li>
</ol>
<p><strong>池化设计思想,什么是数据库连接池?为什么需要数据库连接池?</strong></p>
<p>数据库连接本质是一个socket连接,数据库服务端还要维护一些缓存和用户权限信息之类的,可以把数据库连接池看作是维护的数据库连接的缓存,以便将来需要对数据库的请求时可以重用这些连接。为每个用户打开和维护数据库连接,尤其是对动态数据库驱动的网站应用程序的请求,即昂贵又浪费资源。在连接池中,创建链接后,将其放置池中,并再次使用它,因此不必建立新的连接,如果使用了所有连接,则建立一个新连接并将其添加到池中。</p>
<h1 id="2-MySQL与SQL常用操作命令"><a href="#2-MySQL与SQL常用操作命令" class="headerlink" title="2 MySQL与SQL常用操作命令"></a>2 MySQL与SQL常用操作命令</h1><h2 id="2-1-基本操作"><a href="#2-1-基本操作" class="headerlink" title="2.1 基本操作"></a>2.1 基本操作</h2><figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">/* Windows服务 */</span><br><span class="line">-- 启动MySQL</span><br><span class="line"> net start mysql</span><br><span class="line">-- 创建Windows服务</span><br><span class="line"> sc create mysql binPath= mysqld_bin_path(注意:等号与值之间有空格)</span><br><span class="line">/* 连接与断开服务器 */</span><br><span class="line">mysql -h 地址 -P 端口 -u 用户名 -p 密码</span><br><span class="line">SHOW PROCESSLIST -- 显示哪些线程正在运行</span><br><span class="line">SHOW VARIABLES -- 显示系统变量信息</span><br></pre></td></tr></table></figure>
<h2 id="2-2-数据库操作"><a href="#2-2-数据库操作" class="headerlink" title="2.2 数据库操作"></a>2.2 数据库操作</h2><figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">/* 数据库操作 */ ------------------</span><br><span class="line">-- 查看当前数据库</span><br><span class="line"> SELECT DATABASE();</span><br><span class="line">-- 显示当前时间、用户名、数据库版本</span><br><span class="line"> SELECT now(), user(), version();</span><br><span class="line">-- 创建库</span><br><span class="line"> CREATE DATABASE[ IF NOT EXISTS] 数据库名 数据库选项</span><br><span class="line"> 数据库选项:</span><br><span class="line"> CHARACTER SET charset_name</span><br><span class="line"> COLLATE collation_name</span><br><span class="line">-- 查看已有库</span><br><span class="line"> SHOW DATABASES[ LIKE 'PATTERN']</span><br><span class="line">-- 查看当前库信息</span><br><span class="line"> SHOW CREATE DATABASE 数据库名</span><br><span class="line">-- 修改库的选项信息</span><br><span class="line"> ALTER DATABASE 库名 选项信息</span><br><span class="line">-- 删除库</span><br><span class="line"> DROP DATABASE[ IF EXISTS] 数据库名</span><br><span class="line"> 同时删除该数据库相关的目录及其目录内容</span><br></pre></td></tr></table></figure>
<h2 id="2-3-表的操作"><a href="#2-3-表的操作" class="headerlink" title="2.3 表的操作"></a>2.3 表的操作</h2><figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">-- 创建表</span><br><span class="line"> CREATE [TEMPORARY] TABLE[ IF NOT EXISTS] [库名.]表名 ( 表的结构定义 )[ 表选项]</span><br><span class="line"> 每个字段必须有数据类型</span><br><span class="line"> 最后一个字段后不能有逗号</span><br><span class="line"> TEMPORARY 临时表,会话结束时表自动消失</span><br><span class="line"> 对于字段的定义:</span><br><span class="line"> 字段名 数据类型 [NOT NULL | NULL] [DEFAULT default_value] [AUTO_INCREMENT] [UNIQUE [KEY] | [PRIMARY] KEY] [COMMENT 'string']</span><br><span class="line">-- 表选项</span><br><span class="line"> -- 字符集</span><br><span class="line"> CHARSET = charset_name</span><br><span class="line"> 如果表没有设定,则使用数据库字符集</span><br><span class="line"> -- 存储引擎</span><br><span class="line"> ENGINE = engine_name</span><br><span class="line"> 表在管理数据时采用的不同的数据结构,结构不同会导致处理方式、提供的特性操作等不同</span><br><span class="line"> 常见的引擎:InnoDB MyISAM Memory/Heap BDB Merge Example CSV MaxDB Archive</span><br><span class="line"> 不同的引擎在保存表的结构和数据时采用不同的方式</span><br><span class="line"> MyISAM表文件含义:.frm表定义,.MYD表数据,.MYI表索引</span><br><span class="line"> InnoDB表文件含义:.frm表定义,表空间数据和日志文件</span><br><span class="line"> SHOW ENGINES -- 显示存储引擎的状态信息</span><br><span class="line"> SHOW ENGINE 引擎名 {LOGS|STATUS} -- 显示存储引擎的日志或状态信息</span><br><span class="line"> -- 自增起始数</span><br><span class="line"> AUTO_INCREMENT = 行数</span><br><span class="line"> -- 数据文件目录</span><br><span class="line"> DATA DIRECTORY = '目录'</span><br><span class="line"> -- 索引文件目录</span><br><span class="line"> INDEX DIRECTORY = '目录'</span><br><span class="line"> -- 表注释</span><br><span class="line"> COMMENT = 'string'</span><br><span class="line"> -- 分区选项</span><br><span class="line"> PARTITION BY ... (详细见手册)</span><br><span class="line">-- 查看所有表</span><br><span class="line"> SHOW TABLES[ LIKE 'pattern']</span><br><span class="line"> SHOW TABLES FROM 库名</span><br><span class="line">-- 查看表结构</span><br><span class="line"> SHOW CREATE TABLE 表名 (信息更详细)</span><br><span class="line"> DESC 表名 / DESCRIBE 表名 / EXPLAIN 表名 / SHOW COLUMNS FROM 表名 [LIKE 'PATTERN']</span><br><span class="line"> SHOW TABLE STATUS [FROM db_name] [LIKE 'pattern']</span><br><span class="line">-- 修改表</span><br><span class="line"> -- 修改表本身的选项</span><br><span class="line"> ALTER TABLE 表名 表的选项</span><br><span class="line"> eg: ALTER TABLE 表名 ENGINE=MYISAM;</span><br><span class="line"> -- 对表进行重命名</span><br><span class="line"> RENAME TABLE 原表名 TO 新表名</span><br><span class="line"> RENAME TABLE 原表名 TO 库名.表名 (可将表移动到另一个数据库)</span><br><span class="line"> -- RENAME可以交换两个表名</span><br><span class="line"> -- 修改表的字段机构(13.1.2. ALTER TABLE语法)</span><br><span class="line"> ALTER TABLE 表名 操作名</span><br><span class="line"> -- 操作名</span><br><span class="line"> ADD[ COLUMN] 字段定义 -- 增加字段</span><br><span class="line"> AFTER 字段名 -- 表示增加在该字段名后面</span><br><span class="line"> FIRST -- 表示增加在第一个</span><br><span class="line"> ADD PRIMARY KEY(字段名) -- 创建主键</span><br><span class="line"> ADD UNIQUE [索引名] (字段名)-- 创建唯一索引</span><br><span class="line"> ADD INDEX [索引名] (字段名) -- 创建普通索引</span><br><span class="line"> DROP[ COLUMN] 字段名 -- 删除字段</span><br><span class="line"> MODIFY[ COLUMN] 字段名 字段属性 -- 支持对字段属性进行修改,不能修改字段名(所有原有属性也需写上)</span><br><span class="line"> CHANGE[ COLUMN] 原字段名 新字段名 字段属性 -- 支持对字段名修改</span><br><span class="line"> DROP PRIMARY KEY -- 删除主键(删除主键前需删除其AUTO_INCREMENT属性)</span><br><span class="line"> DROP INDEX 索引名 -- 删除索引</span><br><span class="line"> DROP FOREIGN KEY 外键 -- 删除外键</span><br><span class="line">-- 删除表</span><br><span class="line"> DROP TABLE[ IF EXISTS] 表名 ...</span><br><span class="line">-- 清空表数据</span><br><span class="line"> TRUNCATE [TABLE] 表名</span><br><span class="line">-- 复制表结构</span><br><span class="line"> CREATE TABLE 表名 LIKE 要复制的表名</span><br><span class="line">-- 复制表结构和数据</span><br><span class="line"> CREATE TABLE 表名 [AS] SELECT * FROM 要复制的表名</span><br><span class="line">-- 检查表是否有错误</span><br><span class="line"> CHECK TABLE tbl_name [, tbl_name] ... [option] ...</span><br><span class="line">-- 优化表</span><br><span class="line"> OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ...</span><br><span class="line">-- 修复表</span><br><span class="line"> REPAIR [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ... [QUICK] [EXTENDED] [USE_FRM]</span><br><span class="line">-- 分析表</span><br><span class="line"> ANALYZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ...</span><br></pre></td></tr></table></figure>
<h2 id="2-4-数据操作"><a href="#2-4-数据操作" class="headerlink" title="2.4 数据操作"></a>2.4 数据操作</h2><figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">/* 数据操作 */ ------------------</span><br><span class="line">-- 增</span><br><span class="line"> INSERT [INTO] 表名 [(字段列表)] VALUES (值列表)[, (值列表), ...]</span><br><span class="line"> -- 如果要插入的值列表包含所有字段并且顺序一致,则可以省略字段列表。</span><br><span class="line"> -- 可同时插入多条数据记录!</span><br><span class="line"> REPLACE 与 INSERT 完全一样,可互换。</span><br><span class="line"> INSERT [INTO] 表名 SET 字段名=值[, 字段名=值, ...]</span><br><span class="line">-- 查</span><br><span class="line"> SELECT 字段列表 FROM 表名[ 其他子句]</span><br><span class="line"> -- 可来自多个表的多个字段</span><br><span class="line"> -- 其他子句可以不使用</span><br><span class="line"> -- 字段列表可以用*代替,表示所有字段</span><br><span class="line">-- 删</span><br><span class="line"> DELETE FROM 表名[ 删除条件子句]</span><br><span class="line"> 没有条件子句,则会删除全部</span><br><span class="line">-- 改</span><br><span class="line"> UPDATE 表名 SET 字段名=新值[, 字段名=新值] [更新条件]</span><br></pre></td></tr></table></figure>
<h2 id="2-5-字符集编码"><a href="#2-5-字符集编码" class="headerlink" title="2.5 字符集编码"></a>2.5 字符集编码</h2><figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">/* 字符集编码 */ ------------------</span><br><span class="line">-- MySQL、数据库、表、字段均可设置编码</span><br><span class="line">-- 数据编码与客户端编码不需一致</span><br><span class="line">SHOW VARIABLES LIKE 'character_set_%' -- 查看所有字符集编码项</span><br><span class="line"> character_set_client 客户端向服务器发送数据时使用的编码</span><br><span class="line"> character_set_results 服务器端将结果返回给客户端所使用的编码</span><br><span class="line"> character_set_connection 连接层编码</span><br><span class="line">SET 变量名 = 变量值</span><br><span class="line"> SET character_set_client = gbk;</span><br><span class="line"> SET character_set_results = gbk;</span><br><span class="line"> SET character_set_connection = gbk;</span><br><span class="line">SET NAMES GBK; -- 相当于完成以上三个设置</span><br><span class="line">-- 校对集</span><br><span class="line"> 校对集用以排序</span><br><span class="line"> SHOW CHARACTER SET [LIKE 'pattern']/SHOW CHARSET [LIKE 'pattern'] 查看所有字符集</span><br><span class="line"> SHOW COLLATION [LIKE 'pattern'] 查看所有校对集</span><br><span class="line"> CHARSET 字符集编码 设置字符集编码</span><br><span class="line"> COLLATE 校对集编码 设置校对集编码</span><br></pre></td></tr></table></figure>
<h2 id="2-6-数据类型(列类型)"><a href="#2-6-数据类型(列类型)" class="headerlink" title="2.6 数据类型(列类型)"></a>2.6 数据类型(列类型)</h2><figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">/* 数据类型(列类型) */ ------------------</span><br><span class="line">1. 数值类型</span><br><span class="line">-- a. 整型 ----------</span><br><span class="line"> 类型 字节 范围(有符号位)</span><br><span class="line"> tinyint 1字节 -128 ~ 127 无符号位:0 ~ 255</span><br><span class="line"> smallint 2字节 -32768 ~ 32767</span><br><span class="line"> mediumint 3字节 -8388608 ~ 8388607</span><br><span class="line"> int 4字节</span><br><span class="line"> bigint 8字节</span><br><span class="line"> int(M) M表示总位数</span><br><span class="line"> - 默认存在符号位,unsigned 属性修改</span><br><span class="line"> - 显示宽度,如果某个数不够定义字段时设置的位数,则前面以0补填,zerofill 属性修改</span><br><span class="line"> 例:int(5) 插入一个数'123',补填后为'00123'</span><br><span class="line"> - 在满足要求的情况下,越小越好。</span><br><span class="line"> - 1表示bool值真,0表示bool值假。MySQL没有布尔类型,通过整型0和1表示。常用tinyint(1)表示布尔型。</span><br><span class="line">-- b. 浮点型 ----------</span><br><span class="line"> 类型 字节 范围</span><br><span class="line"> float(单精度) 4字节</span><br><span class="line"> double(双精度) 8字节</span><br><span class="line"> 浮点型既支持符号位 unsigned 属性,也支持显示宽度 zerofill 属性。</span><br><span class="line"> 不同于整型,前后均会补填0.</span><br><span class="line"> 定义浮点型时,需指定总位数和小数位数。</span><br><span class="line"> float(M, D) double(M, D)</span><br><span class="line"> M表示总位数,D表示小数位数。</span><br><span class="line"> M和D的大小会决定浮点数的范围。不同于整型的固定范围。</span><br><span class="line"> M既表示总位数(不包括小数点和正负号),也表示显示宽度(所有显示符号均包括)。</span><br><span class="line"> 支持科学计数法表示。</span><br><span class="line"> 浮点数表示近似值。</span><br><span class="line">-- c. 定点数 ----------</span><br><span class="line"> decimal -- 可变长度</span><br><span class="line"> decimal(M, D) M也表示总位数,D表示小数位数。</span><br><span class="line"> 保存一个精确的数值,不会发生数据的改变,不同于浮点数的四舍五入。</span><br><span class="line"> 将浮点数转换为字符串来保存,每9位数字保存为4个字节。</span><br><span class="line">2. 字符串类型</span><br><span class="line">-- a. char, varchar ----------</span><br><span class="line"> char 定长字符串,速度快,但浪费空间</span><br><span class="line"> varchar 变长字符串,速度慢,但节省空间</span><br><span class="line"> M表示能存储的最大长度,此长度是字符数,非字节数。</span><br><span class="line"> 不同的编码,所占用的空间不同。</span><br><span class="line"> char,最多255个字符,与编码无关。</span><br><span class="line"> varchar,最多65535字符,与编码有关。</span><br><span class="line"> 一条有效记录最大不能超过65535个字节。</span><br><span class="line"> utf8 最大为21844个字符,gbk 最大为32766个字符,latin1 最大为65532个字符</span><br><span class="line"> varchar 是变长的,需要利用存储空间保存 varchar 的长度,如果数据小于255个字节,则采用一个字节来保存长度,反之需要两个字节来保存。</span><br><span class="line"> varchar 的最大有效长度由最大行大小和使用的字符集确定。</span><br><span class="line"> 最大有效长度是65532字节,因为在varchar存字符串时,第一个字节是空的,不存在任何数据,然后还需两个字节来存放字符串的长度,所以有效长度是65535-1-2=65532字节。</span><br><span class="line"> 例:若一个表定义为 CREATE TABLE tb(c1 int, c2 char(30), c3 varchar(N)) charset=utf8; 问N的最大值是多少? 答:(65535-1-2-4-30*3)/3</span><br><span class="line">-- b. blob, text ----------</span><br><span class="line"> blob 二进制字符串(字节字符串)</span><br><span class="line"> tinyblob, blob, mediumblob, longblob</span><br><span class="line"> text 非二进制字符串(字符字符串)</span><br><span class="line"> tinytext, text, mediumtext, longtext</span><br><span class="line"> text 在定义时,不需要定义长度,也不会计算总长度。</span><br><span class="line"> text 类型在定义时,不可给default值</span><br><span class="line">-- c. binary, varbinary ----------</span><br><span class="line"> 类似于char和varchar,用于保存二进制字符串,也就是保存字节字符串而非字符字符串。</span><br><span class="line"> char, varchar, text 对应 binary, varbinary, blob.</span><br><span class="line">3. 日期时间类型</span><br><span class="line"> 一般用整型保存时间戳,因为PHP可以很方便的将时间戳进行格式化。</span><br><span class="line"> datetime 8字节 日期及时间 1000-01-01 00:00:00 到 9999-12-31 23:59:59</span><br><span class="line"> date 3字节 日期 1000-01-01 到 9999-12-31</span><br><span class="line"> timestamp 4字节 时间戳 19700101000000 到 2038-01-19 03:14:07</span><br><span class="line"> time 3字节 时间 -838:59:59 到 838:59:59</span><br><span class="line"> year 1字节 年份 1901 - 2155</span><br><span class="line">datetime YYYY-MM-DD hh:mm:ss</span><br><span class="line">timestamp YY-MM-DD hh:mm:ss</span><br><span class="line"> YYYYMMDDhhmmss</span><br><span class="line"> YYMMDDhhmmss</span><br><span class="line"> YYYYMMDDhhmmss</span><br><span class="line"> YYMMDDhhmmss</span><br><span class="line">date YYYY-MM-DD</span><br><span class="line"> YY-MM-DD</span><br><span class="line"> YYYYMMDD</span><br><span class="line"> YYMMDD</span><br><span class="line"> YYYYMMDD</span><br><span class="line"> YYMMDD</span><br><span class="line">time hh:mm:ss</span><br><span class="line"> hhmmss</span><br><span class="line"> hhmmss</span><br><span class="line">year YYYY</span><br><span class="line"> YY</span><br><span class="line"> YYYY</span><br><span class="line"> YY</span><br><span class="line">4. 枚举和集合</span><br><span class="line">-- 枚举(enum) ----------</span><br><span class="line">enum(val1, val2, val3...)</span><br><span class="line"> 在已知的值中进行单选。最大数量为65535.</span><br><span class="line"> 枚举值在保存时,以2个字节的整型(smallint)保存。每个枚举值,按保存的位置顺序,从1开始逐一递增。</span><br><span class="line"> 表现为字符串类型,存储却是整型。</span><br><span class="line"> NULL值的索引是NULL。</span><br><span class="line"> 空字符串错误值的索引值是0。</span><br><span class="line">-- 集合(set) ----------</span><br><span class="line">set(val1, val2, val3...)</span><br><span class="line"> create table tab ( gender set('男', '女', '无') );</span><br><span class="line"> insert into tab values ('男, 女');</span><br><span class="line"> 最多可以有64个不同的成员。以bigint存储,共8个字节。采取位运算的形式。</span><br><span class="line"> 当创建表时,SET成员值的尾部空格将自动被删除。</span><br></pre></td></tr></table></figure>
<h2 id="2-7-列属性(列约束)"><a href="#2-7-列属性(列约束)" class="headerlink" title="2.7 列属性(列约束)"></a>2.7 列属性(列约束)</h2><figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">/* 列属性(列约束) */ ------------------</span><br><span class="line">1. PRIMARY 主键</span><br><span class="line"> - 能唯一标识记录的字段,可以作为主键。</span><br><span class="line"> - 一个表只能有一个主键。</span><br><span class="line"> - 主键具有唯一性。</span><br><span class="line"> - 声明字段时,用 primary key 标识。</span><br><span class="line"> 也可以在字段列表之后声明</span><br><span class="line"> 例:create table tab ( id int, stu varchar(10), primary key (id));</span><br><span class="line"> - 主键字段的值不能为null。</span><br><span class="line"> - 主键可以由多个字段共同组成。此时需要在字段列表后声明的方法。</span><br><span class="line"> 例:create table tab ( id int, stu varchar(10), age int, primary key (stu, age));</span><br><span class="line">2. UNIQUE 唯一索引(唯一约束)</span><br><span class="line"> 使得某字段的值也不能重复。</span><br><span class="line">3. NULL 约束</span><br><span class="line"> null不是数据类型,是列的一个属性。</span><br><span class="line"> 表示当前列是否可以为null,表示什么都没有。</span><br><span class="line"> null, 允许为空。默认。</span><br><span class="line"> not null, 不允许为空。</span><br><span class="line"> insert into tab values (null, 'val');</span><br><span class="line"> -- 此时表示将第一个字段的值设为null, 取决于该字段是否允许为null</span><br><span class="line">4. DEFAULT 默认值属性</span><br><span class="line"> 当前字段的默认值。</span><br><span class="line"> insert into tab values (default, 'val'); -- 此时表示强制使用默认值。</span><br><span class="line"> create table tab ( add_time timestamp default current_timestamp );</span><br><span class="line"> -- 表示将当前时间的时间戳设为默认值。</span><br><span class="line"> current_date, current_time</span><br><span class="line">5. AUTO_INCREMENT 自动增长约束</span><br><span class="line"> 自动增长必须为索引(主键或unique)</span><br><span class="line"> 只能存在一个字段为自动增长。</span><br><span class="line"> 默认为1开始自动增长。可以通过表属性 auto_increment = x进行设置,或 alter table tbl auto_increment = x;</span><br><span class="line">6. COMMENT 注释</span><br><span class="line"> 例:create table tab ( id int ) comment '注释内容';</span><br><span class="line">7. FOREIGN KEY 外键约束</span><br><span class="line"> 用于限制主表与从表数据完整性。</span><br><span class="line"> alter table t1 add constraint `t1_t2_fk` foreign key (t1_id) references t2(id);</span><br><span class="line"> -- 将表t1的t1_id外键关联到表t2的id字段。</span><br><span class="line"> -- 每个外键都有一个名字,可以通过 constraint 指定</span><br><span class="line"> 存在外键的表,称之为从表(子表),外键指向的表,称之为主表(父表)。</span><br><span class="line"> 作用:保持数据一致性,完整性,主要目的是控制存储在外键表(从表)中的数据。</span><br><span class="line"> MySQL中,可以对InnoDB引擎使用外键约束:</span><br><span class="line"> 语法:</span><br><span class="line"> foreign key (外键字段) references 主表名 (关联字段) [主表记录删除时的动作] [主表记录更新时的动作]</span><br><span class="line"> 此时需要检测一个从表的外键需要约束为主表的已存在的值。外键在没有关联的情况下,可以设置为null.前提是该外键列,没有not null。</span><br><span class="line"> 可以不指定主表记录更改或更新时的动作,那么此时主表的操作被拒绝。</span><br><span class="line"> 如果指定了 on update 或 on delete:在删除或更新时,有如下几个操作可以选择:</span><br><span class="line"> 1. cascade,级联操作。主表数据被更新(主键值更新),从表也被更新(外键值更新)。主表记录被删除,从表相关记录也被删除。</span><br><span class="line"> 2. set null,设置为null。主表数据被更新(主键值更新),从表的外键被设置为null。主表记录被删除,从表相关记录外键被设置成null。但注意,要求该外键列,没有not null属性约束。</span><br><span class="line"> 3. restrict,拒绝父表删除和更新。</span><br><span class="line"> 注意,外键只被InnoDB存储引擎所支持。其他引擎是不支持的。</span><br></pre></td></tr></table></figure>
<h2 id="2-8-建表规范"><a href="#2-8-建表规范" class="headerlink" title="2.8 建表规范"></a>2.8 建表规范</h2><figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">/* 建表规范 */ ------------------</span><br><span class="line"> -- Normal Format, NF</span><br><span class="line"> - 每个表保存一个实体信息</span><br><span class="line"> - 每个具有一个ID字段作为主键</span><br><span class="line"> - ID主键 + 原子表</span><br><span class="line"> -- 1NF, 第一范式</span><br><span class="line"> 字段不能再分,就满足第一范式。</span><br><span class="line"> -- 2NF, 第二范式</span><br><span class="line"> 满足第一范式的前提下,不能出现部分依赖。</span><br><span class="line"> 消除复合主键就可以避免部分依赖。增加单列关键字。</span><br><span class="line"> -- 3NF, 第三范式</span><br><span class="line"> 满足第二范式的前提下,不能出现传递依赖。</span><br><span class="line"> 某个字段依赖于主键,而有其他字段依赖于该字段。这就是传递依赖。</span><br><span class="line"> 将一个实体信息的数据放在一个表内实现。</span><br></pre></td></tr></table></figure>
<h2 id="2-9-SELECT"><a href="#2-9-SELECT" class="headerlink" title="2.9 SELECT"></a>2.9 SELECT</h2><figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">/* SELECT */ ------------------</span><br><span class="line">SELECT [ALL|DISTINCT] select_expr FROM -> WHERE -> GROUP BY [合计函数] -> HAVING -> ORDER BY -> LIMIT</span><br><span class="line">a. select_expr</span><br><span class="line"> -- 可以用 * 表示所有字段。</span><br><span class="line"> select * from tb;</span><br><span class="line"> -- 可以使用表达式(计算公式、函数调用、字段也是个表达式)</span><br><span class="line"> select stu, 29+25, now() from tb;</span><br><span class="line"> -- 可以为每个列使用别名。适用于简化列标识,避免多个列标识符重复。</span><br><span class="line"> - 使用 as 关键字,也可省略 as.</span><br><span class="line"> select stu+10 as add10 from tb;</span><br><span class="line">b. FROM 子句</span><br><span class="line"> 用于标识查询来源。</span><br><span class="line"> -- 可以为表起别名。使用as关键字。</span><br><span class="line"> SELECT * FROM tb1 AS tt, tb2 AS bb;</span><br><span class="line"> -- from子句后,可以同时出现多个表。</span><br><span class="line"> -- 多个表会横向叠加到一起,而数据会形成一个笛卡尔积。</span><br><span class="line"> SELECT * FROM tb1, tb2;</span><br><span class="line"> -- 向优化符提示如何选择索引</span><br><span class="line"> USE INDEX、IGNORE INDEX、FORCE INDEX</span><br><span class="line"> SELECT * FROM table1 USE INDEX (key1,key2) WHERE key1=1 AND key2=2 AND key3=3;</span><br><span class="line"> SELECT * FROM table1 IGNORE INDEX (key3) WHERE key1=1 AND key2=2 AND key3=3;</span><br><span class="line">c. WHERE 子句</span><br><span class="line"> -- 从from获得的数据源中进行筛选。</span><br><span class="line"> -- 整型1表示真,0表示假。</span><br><span class="line"> -- 表达式由运算符和运算数组成。</span><br><span class="line"> -- 运算数:变量(字段)、值、函数返回值</span><br><span class="line"> -- 运算符:</span><br><span class="line"> =, <=>, <>, !=, <=, <, >=, >, !, &&, ||,</span><br><span class="line"> in (not) null, (not) like, (not) in, (not) between and, is (not), and, or, not, xor</span><br><span class="line"> is/is not 加上ture/false/unknown,检验某个值的真假</span><br><span class="line"> <=>与<>功能相同,<=>可用于null比较</span><br><span class="line">d. GROUP BY 子句, 分组子句</span><br><span class="line"> GROUP BY 字段/别名 [排序方式]</span><br><span class="line"> 分组后会进行排序。升序:ASC,降序:DESC</span><br><span class="line"> 以下[合计函数]需配合 GROUP BY 使用:</span><br><span class="line"> count 返回不同的非NULL值数目 count(*)、count(字段)</span><br><span class="line"> sum 求和</span><br><span class="line"> max 求最大值</span><br><span class="line"> min 求最小值</span><br><span class="line"> avg 求平均值</span><br><span class="line"> group_concat 返回带有来自一个组的连接的非NULL值的字符串结果。组内字符串连接。</span><br><span class="line">e. HAVING 子句,条件子句</span><br><span class="line"> 与 where 功能、用法相同,执行时机不同。</span><br><span class="line"> where 在开始时执行检测数据,对原数据进行过滤。</span><br><span class="line"> having 对筛选出的结果再次进行过滤。</span><br><span class="line"> having 字段必须是查询出来的,where 字段必须是数据表存在的。</span><br><span class="line"> where 不可以使用字段的别名,having 可以。因为执行WHERE代码时,可能尚未确定列值。</span><br><span class="line"> where 不可以使用合计函数。一般需用合计函数才会用 having</span><br><span class="line"> SQL标准要求HAVING必须引用GROUP BY子句中的列或用于合计函数中的列。</span><br><span class="line">f. ORDER BY 子句,排序子句</span><br><span class="line"> order by 排序字段/别名 排序方式 [,排序字段/别名 排序方式]...</span><br><span class="line"> 升序:ASC,降序:DESC</span><br><span class="line"> 支持多个字段的排序。</span><br><span class="line">g. LIMIT 子句,限制结果数量子句</span><br><span class="line"> 仅对处理好的结果进行数量限制。将处理好的结果的看作是一个集合,按照记录出现的顺序,索引从0开始。</span><br><span class="line"> limit 起始位置, 获取条数</span><br><span class="line"> 省略第一个参数,表示从索引0开始。limit 获取条数</span><br><span class="line">h. DISTINCT, ALL 选项</span><br><span class="line"> distinct 去除重复记录</span><br><span class="line"> 默认为 all, 全部记录</span><br></pre></td></tr></table></figure>
<h2 id="2-10-UNION"><a href="#2-10-UNION" class="headerlink" title="2.10 UNION"></a>2.10 UNION</h2><figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">/* UNION */ ------------------</span><br><span class="line"> 将多个select查询的结果组合成一个结果集合。</span><br><span class="line"> SELECT ... UNION [ALL|DISTINCT] SELECT ...</span><br><span class="line"> 默认 DISTINCT 方式,即所有返回的行都是唯一的</span><br><span class="line"> 建议,对每个SELECT查询加上小括号包裹。</span><br><span class="line"> ORDER BY 排序时,需加上 LIMIT 进行结合。</span><br><span class="line"> 需要各select查询的字段数量一样。</span><br><span class="line"> 每个select查询的字段列表(数量、类型)应一致,因为结果中的字段名以第一条select语句为准。</span><br></pre></td></tr></table></figure>
<h2 id="2-11-子查询"><a href="#2-11-子查询" class="headerlink" title="2.11 子查询"></a>2.11 子查询</h2><figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">/* 子查询 */ ------------------</span><br><span class="line"> - 子查询需用括号包裹。</span><br><span class="line">-- from型</span><br><span class="line"> from后要求是一个表,必须给子查询结果取个别名。</span><br><span class="line"> - 简化每个查询内的条件。</span><br><span class="line"> - from型需将结果生成一个临时表格,可用以原表的锁定的释放。</span><br><span class="line"> - 子查询返回一个表,表型子查询。</span><br><span class="line"> select * from (select * from tb where id>0) as subfrom where id>1;</span><br><span class="line">-- where型</span><br><span class="line"> - 子查询返回一个值,标量子查询。</span><br><span class="line"> - 不需要给子查询取别名。</span><br><span class="line"> - where子查询内的表,不能直接用以更新。</span><br><span class="line"> select * from tb where money = (select max(money) from tb);</span><br><span class="line"> -- 列子查询</span><br><span class="line"> 如果子查询结果返回的是一列。</span><br><span class="line"> 使用 in 或 not in 完成查询</span><br><span class="line"> exists 和 not exists 条件</span><br><span class="line"> 如果子查询返回数据,则返回1或0。常用于判断条件。</span><br><span class="line"> select column1 from t1 where exists (select * from t2);</span><br><span class="line"> -- 行子查询</span><br><span class="line"> 查询条件是一个行。</span><br><span class="line"> select * from t1 where (id, gender) in (select id, gender from t2);</span><br><span class="line"> 行构造符:(col1, col2, ...) 或 ROW(col1, col2, ...)</span><br><span class="line"> 行构造符通常用于与对能返回两个或两个以上列的子查询进行比较。</span><br><span class="line"> -- 特殊运算符</span><br><span class="line"> != all() 相当于 not in</span><br><span class="line"> = some() 相当于 in。any 是 some 的别名</span><br><span class="line"> != some() 不等同于 not in,不等于其中某一个。</span><br><span class="line"> all, some 可以配合其他运算符一起使用。</span><br></pre></td></tr></table></figure>
<h2 id="2-12-连接查询-join"><a href="#2-12-连接查询-join" class="headerlink" title="2.12 连接查询(join)"></a>2.12 连接查询(join)</h2><figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">/* 连接查询(join) */ ------------------</span><br><span class="line"> 将多个表的字段进行连接,可以指定连接条件。</span><br><span class="line">-- 内连接(inner join)</span><br><span class="line"> - 默认就是内连接,可省略inner。</span><br><span class="line"> - 只有数据存在时才能发送连接。即连接结果不能出现空行。</span><br><span class="line"> on 表示连接条件。其条件表达式与where类似。也可以省略条件(表示条件永远为真)</span><br><span class="line"> 也可用where表示连接条件。</span><br><span class="line"> 还有 using, 但需字段名相同。 using(字段名)</span><br><span class="line"> -- 交叉连接 cross join</span><br><span class="line"> 即,没有条件的内连接。</span><br><span class="line"> select * from tb1 cross join tb2;</span><br><span class="line">-- 外连接(outer join)</span><br><span class="line"> - 如果数据不存在,也会出现在连接结果中。</span><br><span class="line"> -- 左外连接 left join</span><br><span class="line"> 如果数据不存在,左表记录会出现,而右表为null填充</span><br><span class="line"> -- 右外连接 right join</span><br><span class="line"> 如果数据不存在,右表记录会出现,而左表为null填充</span><br><span class="line">-- 自然连接(natural join)</span><br><span class="line"> 自动判断连接条件完成连接。</span><br><span class="line"> 相当于省略了using,会自动查找相同字段名。</span><br><span class="line"> natural join</span><br><span class="line"> natural left join</span><br><span class="line"> natural right join</span><br><span class="line">select info.id, info.name, info.stu_num, extra_info.hobby, extra_info.sex from info, extra_info where info.stu_num = extra_info.stu_id;</span><br></pre></td></tr></table></figure>
<h2 id="2-13-TRUNCATE"><a href="#2-13-TRUNCATE" class="headerlink" title="2.13 TRUNCATE"></a>2.13 TRUNCATE</h2><figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">/* TRUNCATE */ ------------------</span><br><span class="line">TRUNCATE [TABLE] tbl_name</span><br><span class="line">清空数据</span><br><span class="line">删除重建表</span><br><span class="line">区别:</span><br><span class="line">1,truncate 是删除表再创建,delete 是逐条删除</span><br><span class="line">2,truncate 重置auto_increment的值。而delete不会</span><br><span class="line">3,truncate 不知道删除了几条,而delete知道。</span><br><span class="line">4,当被用于带分区的表时,truncate 会保留分区</span><br></pre></td></tr></table></figure>
<h2 id="2-14-备份与还原"><a href="#2-14-备份与还原" class="headerlink" title="2.14 备份与还原"></a>2.14 备份与还原</h2><figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">/* 备份与还原 */ ------------------</span><br><span class="line">备份,将数据的结构与表内数据保存起来。</span><br><span class="line">利用 mysqldump 指令完成。</span><br><span class="line">-- 导出</span><br><span class="line">mysqldump [options] db_name [tables]</span><br><span class="line">mysqldump [options] ---database DB1 [DB2 DB3...]</span><br><span class="line">mysqldump [options] --all--database</span><br><span class="line">1. 导出一张表</span><br><span class="line"> mysqldump -u用户名 -p密码 库名 表名 > 文件名(D:/a.sql)</span><br><span class="line">2. 导出多张表</span><br><span class="line"> mysqldump -u用户名 -p密码 库名 表1 表2 表3 > 文件名(D:/a.sql)</span><br><span class="line">3. 导出所有表</span><br><span class="line"> mysqldump -u用户名 -p密码 库名 > 文件名(D:/a.sql)</span><br><span class="line">4. 导出一个库</span><br><span class="line"> mysqldump -u用户名 -p密码 --lock-all-tables --database 库名 > 文件名(D:/a.sql)</span><br><span class="line">可以-w携带WHERE条件</span><br><span class="line">-- 导入</span><br><span class="line">1. 在登录mysql的情况下:</span><br><span class="line"> source 备份文件</span><br><span class="line">2. 在不登录的情况下</span><br><span class="line"> mysql -u用户名 -p密码 库名 < 备份文件</span><br></pre></td></tr></table></figure>
<h2 id="2-15-视图"><a href="#2-15-视图" class="headerlink" title="2.15 视图"></a>2.15 视图</h2><figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">什么是视图:</span><br><span class="line"> 视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。但是,视图并不在数据库中以存储的数据值集形式存在。行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。</span><br><span class="line"> 视图具有表结构文件,但不存在数据文件。</span><br><span class="line"> 对其中所引用的基础表来说,视图的作用类似于筛选。定义视图的筛选可以来自当前或其它数据库的一个或多个表,或者其它视图。通过视图进行查询没有任何限制,通过它们进行数据修改时的限制也很少。</span><br><span class="line"> 视图是存储在数据库中的查询的sql语句,它主要出于两种原因:安全原因,视图可以隐藏一些数据,如:社会保险基金表,可以用视图只显示姓名,地址,而不显示社会保险号和工资数等,另一原因是可使复杂的查询易于理解和使用。</span><br><span class="line">-- 创建视图</span><br><span class="line">CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}] VIEW view_name [(column_list)] AS select_statement</span><br><span class="line"> - 视图名必须唯一,同时不能与表重名。</span><br><span class="line"> - 视图可以使用select语句查询到的列名,也可以自己指定相应的列名。</span><br><span class="line"> - 可以指定视图执行的算法,通过ALGORITHM指定。</span><br><span class="line"> - column_list如果存在,则数目必须等于SELECT语句检索的列数</span><br><span class="line">-- 查看结构</span><br><span class="line"> SHOW CREATE VIEW view_name</span><br><span class="line">-- 删除视图</span><br><span class="line"> - 删除视图后,数据依然存在。</span><br><span class="line"> - 可同时删除多个视图。</span><br><span class="line"> DROP VIEW [IF EXISTS] view_name ...</span><br><span class="line">-- 修改视图结构</span><br><span class="line"> - 一般不修改视图,因为不是所有的更新视图都会映射到表上。</span><br><span class="line"> ALTER VIEW view_name [(column_list)] AS select_statement</span><br><span class="line">-- 视图作用</span><br><span class="line"> 1. 简化业务逻辑</span><br><span class="line"> 2. 对客户端隐藏真实的表结构</span><br><span class="line">-- 视图算法(ALGORITHM)</span><br><span class="line"> MERGE 合并</span><br><span class="line"> 将视图的查询语句,与外部查询需要先合并再执行!</span><br><span class="line"> TEMPTABLE 临时表</span><br><span class="line"> 将视图执行完毕后,形成临时表,再做外层查询!</span><br><span class="line"> UNDEFINED 未定义(默认),指的是MySQL自主去选择相应的算法。</span><br></pre></td></tr></table></figure>
<h2 id="2-16-事务"><a href="#2-16-事务" class="headerlink" title="2.16 事务"></a>2.16 事务</h2><figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">事务是指逻辑上的一组操作,组成这组操作的各个单元,要不全成功要不全失败。</span><br><span class="line"> - 支持连续SQL的集体成功或集体撤销。</span><br><span class="line"> - 事务是数据库在数据完整性方面的一个功能。</span><br><span class="line"> - 需要利用 InnoDB 或 BDB 存储引擎,对自动提交的特性支持完成。</span><br><span class="line"> - InnoDB被称为事务安全型引擎。</span><br><span class="line">-- 事务开启</span><br><span class="line"> START TRANSACTION; 或者 BEGIN;</span><br><span class="line"> 开启事务后,所有被执行的SQL语句均被认作当前事务内的SQL语句。</span><br><span class="line">-- 事务提交</span><br><span class="line"> COMMIT;</span><br><span class="line">-- 事务回滚</span><br><span class="line"> ROLLBACK;</span><br><span class="line"> 如果部分操作发生问题,映射到事务开启前。</span><br><span class="line">-- 事务的特性</span><br><span class="line"> 1. 原子性(Atomicity)</span><br><span class="line"> 事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。</span><br><span class="line"> 2. 一致性(Consistency)</span><br><span class="line"> 事务前后数据的完整性必须保持一致。</span><br><span class="line"> - 事务开始和结束时,外部数据一致</span><br><span class="line"> - 在整个事务过程中,操作是连续的</span><br><span class="line"> 3. 隔离性(Isolation)</span><br><span class="line"> 多个用户并发访问数据库时,一个用户的事务不能被其它用户的事物所干扰,多个并发事务之间的数据要相互隔离。</span><br><span class="line"> 4. 持久性(Durability)</span><br><span class="line"> 一个事务一旦被提交,它对数据库中的数据改变就是永久性的。</span><br><span class="line">-- 事务的实现</span><br><span class="line"> 1. 要求是事务支持的表类型</span><br><span class="line"> 2. 执行一组相关的操作前开启事务</span><br><span class="line"> 3. 整组操作完成后,都成功,则提交;如果存在失败,选择回滚,则会回到事务开始的备份点。</span><br><span class="line">-- 事务的原理</span><br><span class="line"> 利用InnoDB的自动提交(autocommit)特性完成。</span><br><span class="line"> 普通的MySQL执行语句后,当前的数据提交操作均可被其他客户端可见。</span><br><span class="line"> 而事务是暂时关闭“自动提交”机制,需要commit提交持久化数据操作。</span><br><span class="line">-- 注意</span><br><span class="line"> 1. 数据定义语言(DDL)语句不能被回滚,比如创建或取消数据库的语句,和创建、取消或更改表或存储的子程序的语句。</span><br><span class="line"> 2. 事务不能被嵌套</span><br><span class="line">-- 保存点</span><br><span class="line"> SAVEPOINT 保存点名称 -- 设置一个事务保存点</span><br><span class="line"> ROLLBACK TO SAVEPOINT 保存点名称 -- 回滚到保存点</span><br><span class="line"> RELEASE SAVEPOINT 保存点名称 -- 删除保存点</span><br><span class="line">-- InnoDB自动提交特性设置</span><br><span class="line"> SET autocommit = 0|1; 0表示关闭自动提交,1表示开启自动提交。</span><br><span class="line"> - 如果关闭了,那普通操作的结果对其他客户端也不可见,需要commit提交后才能持久化数据操作。</span><br><span class="line"> - 也可以关闭自动提交来开启事务。但与START TRANSACTION不同的是,</span><br><span class="line"> SET autocommit是永久改变服务器的设置,直到下次再次修改该设置。(针对当前连接)</span><br><span class="line"> 而START TRANSACTION记录开启前的状态,而一旦事务提交或回滚后就需要再次开启事务。(针对当前事务)</span><br></pre></td></tr></table></figure>
<h2 id="2-17-锁表"><a href="#2-17-锁表" class="headerlink" title="2.17 锁表"></a>2.17 锁表</h2><figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">* 锁表 */</span><br><span class="line">表锁定只用于防止其它客户端进行不正当地读取和写入</span><br><span class="line">MyISAM 支持表锁,InnoDB 支持行锁</span><br><span class="line">-- 锁定</span><br><span class="line"> LOCK TABLES tbl_name [AS alias]</span><br><span class="line">-- 解锁</span><br><span class="line"> UNLOCK TABLES</span><br></pre></td></tr></table></figure>
<h2 id="2-18-触发器"><a href="#2-18-触发器" class="headerlink" title="2.18 触发器"></a>2.18 触发器</h2><figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">/* 触发器 */ ------------------</span><br><span class="line"> 触发程序是与表有关的命名数据库对象,当该表出现特定事件时,将激活该对象</span><br><span class="line"> 监听:记录的增加、修改、删除。</span><br><span class="line">-- 创建触发器</span><br><span class="line">CREATE TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW trigger_stmt</span><br><span class="line"> 参数:</span><br><span class="line"> trigger_time是触发程序的动作时间。它可以是 before 或 after,以指明触发程序是在激活它的语句之前或之后触发。</span><br><span class="line"> trigger_event指明了激活触发程序的语句的类型</span><br><span class="line"> INSERT:将新行插入表时激活触发程序</span><br><span class="line"> UPDATE:更改某一行时激活触发程序</span><br><span class="line"> DELETE:从表中删除某一行时激活触发程序</span><br><span class="line"> tbl_name:监听的表,必须是永久性的表,不能将触发程序与TEMPORARY表或视图关联起来。</span><br><span class="line"> trigger_stmt:当触发程序激活时执行的语句。执行多个语句,可使用BEGIN...END复合语句结构</span><br><span class="line">-- 删除</span><br><span class="line">DROP TRIGGER [schema_name.]trigger_name</span><br><span class="line">可以使用old和new代替旧的和新的数据</span><br><span class="line"> 更新操作,更新前是old,更新后是new.</span><br><span class="line"> 删除操作,只有old.</span><br><span class="line"> 增加操作,只有new.</span><br><span class="line">-- 注意</span><br><span class="line"> 1. 对于具有相同触发程序动作时间和事件的给定表,不能有两个触发程序。</span><br><span class="line">-- 字符连接函数</span><br><span class="line">concat(str1,str2,...])</span><br><span class="line">concat_ws(separator,str1,str2,...)</span><br><span class="line">-- 分支语句</span><br><span class="line">if 条件 then</span><br><span class="line"> 执行语句</span><br><span class="line">elseif 条件 then</span><br><span class="line"> 执行语句</span><br><span class="line">else</span><br><span class="line"> 执行语句</span><br><span class="line">end if;</span><br><span class="line">-- 修改最外层语句结束符</span><br><span class="line">delimiter 自定义结束符号</span><br><span class="line"> SQL语句</span><br><span class="line">自定义结束符号</span><br><span class="line">delimiter ; -- 修改回原来的分号</span><br><span class="line">-- 语句块包裹</span><br><span class="line">begin</span><br><span class="line"> 语句块</span><br><span class="line">end</span><br><span class="line">-- 特殊的执行</span><br><span class="line">1. 只要添加记录,就会触发程序。</span><br><span class="line">2. Insert into on duplicate key update 语法会触发:</span><br><span class="line"> 如果没有重复记录,会触发 before insert, after insert;</span><br><span class="line"> 如果有重复记录并更新,会触发 before insert, before update, after update;</span><br><span class="line"> 如果有重复记录但是没有发生更新,则触发 before insert, before update</span><br><span class="line">3. Replace 语法 如果有记录,则执行 before insert, before delete, after delete, after insert</span><br></pre></td></tr></table></figure>
<h2 id="2-19-SQL编程"><a href="#2-19-SQL编程" class="headerlink" title="2.19 SQL编程"></a>2.19 SQL编程</h2><figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">/* SQL编程 */ ------------------</span><br><span class="line">--// 局部变量 ----------</span><br><span class="line">-- 变量声明</span><br><span class="line"> declare var_name[,...] type [default value]</span><br><span class="line"> 这个语句被用来声明局部变量。要给变量提供一个默认值,请包含一个default子句。值可以被指定为一个表达式,不需要为一个常数。如果没有default子句,初始值为null。</span><br><span class="line">-- 赋值</span><br><span class="line"> 使用 set 和 select into 语句为变量赋值。</span><br><span class="line"> - 注意:在函数内是可以使用全局变量(用户自定义的变量)</span><br><span class="line">--// 全局变量 ----------</span><br><span class="line">-- 定义、赋值</span><br><span class="line">set 语句可以定义并为变量赋值。</span><br><span class="line">set @var = value;</span><br><span class="line">也可以使用select into语句为变量初始化并赋值。这样要求select语句只能返回一行,但是可以是多个字段,就意味着同时为多个变量进行赋值,变量的数量需要与查询的列数一致。</span><br><span class="line">还可以把赋值语句看作一个表达式,通过select执行完成。此时为了避免=被当作关系运算符看待,使用:=代替。(set语句可以使用= 和 :=)。</span><br><span class="line">select @var:=20;</span><br><span class="line">select @v1:=id, @v2=name from t1 limit 1;</span><br><span class="line">select * from tbl_name where @var:=30;</span><br><span class="line">select into 可以将表中查询获得的数据赋给变量。</span><br><span class="line"> -| select max(height) into @max_height from tb;</span><br><span class="line">-- 自定义变量名</span><br><span class="line">为了避免select语句中,用户自定义的变量与系统标识符(通常是字段名)冲突,用户自定义变量在变量名前使用@作为开始符号。</span><br><span class="line">@var=10;</span><br><span class="line"> - 变量被定义后,在整个会话周期都有效(登录到退出)</span><br><span class="line">--// 控制结构 ----------</span><br><span class="line">-- if语句</span><br><span class="line">if search_condition then</span><br><span class="line"> statement_list </span><br><span class="line">[elseif search_condition then</span><br><span class="line"> statement_list]</span><br><span class="line">...</span><br><span class="line">[else</span><br><span class="line"> statement_list]</span><br><span class="line">end if;</span><br><span class="line">-- case语句</span><br><span class="line">CASE value WHEN [compare-value] THEN result</span><br><span class="line">[WHEN [compare-value] THEN result ...]</span><br><span class="line">[ELSE result]</span><br><span class="line">END</span><br><span class="line">-- while循环</span><br><span class="line">[begin_label:] while search_condition do</span><br><span class="line"> statement_list</span><br><span class="line">end while [end_label];</span><br><span class="line">- 如果需要在循环内提前终止 while循环,则需要使用标签;标签需要成对出现。</span><br><span class="line"> -- 退出循环</span><br><span class="line"> 退出整个循环 leave</span><br><span class="line"> 退出当前循环 iterate</span><br><span class="line"> 通过退出的标签决定退出哪个循环</span><br><span class="line">--// 内置函数 ----------</span><br><span class="line">-- 数值函数</span><br><span class="line">abs(x) -- 绝对值 abs(-10.9) = 10</span><br><span class="line">format(x, d) -- 格式化千分位数值 format(1234567.456, 2) = 1,234,567.46</span><br><span class="line">ceil(x) -- 向上取整 ceil(10.1) = 11</span><br><span class="line">floor(x) -- 向下取整 floor (10.1) = 10</span><br><span class="line">round(x) -- 四舍五入去整</span><br><span class="line">mod(m, n) -- m%n m mod n 求余 10%3=1</span><br><span class="line">pi() -- 获得圆周率</span><br><span class="line">pow(m, n) -- m^n</span><br><span class="line">sqrt(x) -- 算术平方根</span><br><span class="line">rand() -- 随机数</span><br><span class="line">truncate(x, d) -- 截取d位小数</span><br><span class="line">-- 时间日期函数</span><br><span class="line">now(), current_timestamp(); -- 当前日期时间</span><br><span class="line">current_date(); -- 当前日期</span><br><span class="line">current_time(); -- 当前时间</span><br><span class="line">date('yyyy-mm-dd hh:ii:ss'); -- 获取日期部分</span><br><span class="line">time('yyyy-mm-dd hh:ii:ss'); -- 获取时间部分</span><br><span class="line">date_format('yyyy-mm-dd hh:ii:ss', '%d %y %a %d %m %b %j'); -- 格式化时间</span><br><span class="line">unix_timestamp(); -- 获得unix时间戳</span><br><span class="line">from_unixtime(); -- 从时间戳获得时间</span><br><span class="line">-- 字符串函数</span><br><span class="line">length(string) -- string长度,字节</span><br><span class="line">char_length(string) -- string的字符个数</span><br><span class="line">substring(str, position [,length]) -- 从str的position开始,取length个字符</span><br><span class="line">replace(str ,search_str ,replace_str) -- 在str中用replace_str替换search_str</span><br><span class="line">instr(string ,substring) -- 返回substring首次在string中出现的位置</span><br><span class="line">concat(string [,...]) -- 连接字串</span><br><span class="line">charset(str) -- 返回字串字符集</span><br><span class="line">lcase(string) -- 转换成小写</span><br><span class="line">left(string, length) -- 从string2中的左边起取length个字符</span><br><span class="line">load_file(file_name) -- 从文件读取内容</span><br><span class="line">locate(substring, string [,start_position]) -- 同instr,但可指定开始位置</span><br><span class="line">lpad(string, length, pad) -- 重复用pad加在string开头,直到字串长度为length</span><br><span class="line">ltrim(string) -- 去除前端空格</span><br><span class="line">repeat(string, count) -- 重复count次</span><br><span class="line">rpad(string, length, pad) --在str后用pad补充,直到长度为length</span><br><span class="line">rtrim(string) -- 去除后端空格</span><br><span class="line">strcmp(string1 ,string2) -- 逐字符比较两字串大小</span><br><span class="line">-- 流程函数</span><br><span class="line">case when [condition] then result [when [condition] then result ...] [else result] end 多分支</span><br><span class="line">if(expr1,expr2,expr3) 双分支。</span><br><span class="line">-- 聚合函数</span><br><span class="line">count()</span><br><span class="line">sum();</span><br><span class="line">max();</span><br><span class="line">min();</span><br><span class="line">avg();</span><br><span class="line">group_concat()</span><br><span class="line">-- 其他常用函数</span><br><span class="line">md5();</span><br><span class="line">default();</span><br><span class="line">--// 存储函数,自定义函数 ----------</span><br><span class="line">-- 新建</span><br><span class="line"> CREATE FUNCTION function_name (参数列表) RETURNS 返回值类型</span><br><span class="line"> 函数体</span><br><span class="line"> - 函数名,应该合法的标识符,并且不应该与已有的关键字冲突。</span><br><span class="line"> - 一个函数应该属于某个数据库,可以使用db_name.funciton_name的形式执行当前函数所属数据库,否则为当前数据库。</span><br><span class="line"> - 参数部分,由"参数名"和"参数类型"组成。多个参数用逗号隔开。</span><br><span class="line"> - 函数体由多条可用的mysql语句,流程控制,变量声明等语句构成。</span><br><span class="line"> - 多条语句应该使用 begin...end 语句块包含。</span><br><span class="line"> - 一定要有 return 返回值语句。</span><br><span class="line">-- 删除</span><br><span class="line"> DROP FUNCTION [IF EXISTS] function_name;</span><br><span class="line">-- 查看</span><br><span class="line"> SHOW FUNCTION STATUS LIKE 'partten'</span><br><span class="line"> SHOW CREATE FUNCTION function_name;</span><br><span class="line">-- 修改</span><br><span class="line"> ALTER FUNCTION function_name 函数选项</span><br><span class="line">--// 存储过程,自定义功能 ----------</span><br><span class="line">-- 定义</span><br><span class="line">存储存储过程 是一段代码(过程),存储在数据库中的sql组成。</span><br><span class="line">一个存储过程通常用于完成一段业务逻辑,例如报名,交班费,订单入库等。</span><br><span class="line">而一个函数通常专注与某个功能,视为其他程序服务的,需要在其他语句中调用函数才可以,而存储过程不能被其他调用,是自己执行 通过call执行。</span><br><span class="line">-- 创建</span><br><span class="line">CREATE PROCEDURE sp_name (参数列表)</span><br><span class="line"> 过程体</span><br><span class="line">参数列表:不同于函数的参数列表,需要指明参数类型</span><br><span class="line">IN,表示输入型</span><br><span class="line">OUT,表示输出型</span><br><span class="line">INOUT,表示混合型</span><br><span class="line">注意,没有返回值。</span><br></pre></td></tr></table></figure>
<h2 id="2-10-存储过程"><a href="#2-10-存储过程" class="headerlink" title="2.10 存储过程"></a>2.10 存储过程</h2><figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">/* 存储过程 */ ------------------</span><br><span class="line">存储过程是一段可执行性代码的集合。相比函数,更偏向于业务逻辑。</span><br><span class="line">调用:CALL 过程名</span><br><span class="line">-- 注意</span><br><span class="line">- 没有返回值。</span><br><span class="line">- 只能单独调用,不可夹杂在其他语句中</span><br><span class="line">-- 参数</span><br><span class="line">IN|OUT|INOUT 参数名 数据类型</span><br><span class="line">IN 输入:在调用过程中,将数据输入到过程体内部的参数</span><br><span class="line">OUT 输出:在调用过程中,将过程体处理完的结果返回到客户端</span><br><span class="line">INOUT 输入输出:既可输入,也可输出</span><br><span class="line">-- 语法</span><br><span class="line">CREATE PROCEDURE 过程名 (参数列表)</span><br><span class="line">BEGIN</span><br><span class="line"> 过程体</span><br><span class="line">END</span><br></pre></td></tr></table></figure>
<h2 id="2-11-用户和权限管理"><a href="#2-11-用户和权限管理" class="headerlink" title="2.11 用户和权限管理"></a>2.11 用户和权限管理</h2><figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">/* 用户和权限管理 */ ------------------</span><br><span class="line">-- root密码重置</span><br><span class="line">1. 停止MySQL服务</span><br><span class="line">2. [Linux] /usr/local/mysql/bin/safe_mysqld --skip-grant-tables &</span><br><span class="line"> [Windows] mysqld --skip-grant-tables</span><br><span class="line">3. use mysql;</span><br><span class="line">4. UPDATE `user` SET PASSWORD=PASSWORD("密码") WHERE `user` = "root";</span><br><span class="line">5. FLUSH PRIVILEGES;</span><br><span class="line">用户信息表:mysql.user</span><br><span class="line">-- 刷新权限</span><br><span class="line">FLUSH PRIVILEGES;</span><br><span class="line">-- 增加用户</span><br><span class="line">CREATE USER 用户名 IDENTIFIED BY [PASSWORD] 密码(字符串)</span><br><span class="line"> - 必须拥有mysql数据库的全局CREATE USER权限,或拥有INSERT权限。</span><br><span class="line"> - 只能创建用户,不能赋予权限。</span><br><span class="line"> - 用户名,注意引号:如 'user_name'@'192.168.1.1'</span><br><span class="line"> - 密码也需引号,纯数字密码也要加引号</span><br><span class="line"> - 要在纯文本中指定密码,需忽略PASSWORD关键词。要把密码指定为由PASSWORD()函数返回的混编值,需包含关键字PASSWORD</span><br><span class="line">-- 重命名用户</span><br><span class="line">RENAME USER old_user TO new_user</span><br><span class="line">-- 设置密码</span><br><span class="line">SET PASSWORD = PASSWORD('密码') -- 为当前用户设置密码</span><br><span class="line">SET PASSWORD FOR 用户名 = PASSWORD('密码') -- 为指定用户设置密码</span><br><span class="line">-- 删除用户</span><br><span class="line">DROP USER 用户名</span><br><span class="line">-- 分配权限/添加用户</span><br><span class="line">GRANT 权限列表 ON 表名 TO 用户名 [IDENTIFIED BY [PASSWORD] 'password']</span><br><span class="line"> - all privileges 表示所有权限</span><br><span class="line"> - *.* 表示所有库的所有表</span><br><span class="line"> - 库名.表名 表示某库下面的某表</span><br><span class="line"> GRANT ALL PRIVILEGES ON `pms`.* TO 'pms'@'%' IDENTIFIED BY 'pms0817';</span><br><span class="line">-- 查看权限</span><br><span class="line">SHOW GRANTS FOR 用户名</span><br><span class="line"> -- 查看当前用户权限</span><br><span class="line"> SHOW GRANTS; 或 SHOW GRANTS FOR CURRENT_USER; 或 SHOW GRANTS FOR CURRENT_USER();</span><br><span class="line">-- 撤消权限</span><br><span class="line">REVOKE 权限列表 ON 表名 FROM 用户名</span><br><span class="line">REVOKE ALL PRIVILEGES, GRANT OPTION FROM 用户名 -- 撤销所有权限</span><br><span class="line">-- 权限层级</span><br><span class="line">-- 要使用GRANT或REVOKE,您必须拥有GRANT OPTION权限,并且您必须用于您正在授予或撤销的权限。</span><br><span class="line">全局层级:全局权限适用于一个给定服务器中的所有数据库,mysql.user</span><br><span class="line"> GRANT ALL ON *.*和 REVOKE ALL ON *.*只授予和撤销全局权限。</span><br><span class="line">数据库层级:数据库权限适用于一个给定数据库中的所有目标,mysql.db, mysql.host</span><br><span class="line"> GRANT ALL ON db_name.*和REVOKE ALL ON db_name.*只授予和撤销数据库权限。</span><br><span class="line">表层级:表权限适用于一个给定表中的所有列,mysql.talbes_priv</span><br><span class="line"> GRANT ALL ON db_name.tbl_name和REVOKE ALL ON db_name.tbl_name只授予和撤销表权限。</span><br><span class="line">列层级:列权限适用于一个给定表中的单一列,mysql.columns_priv</span><br><span class="line"> 当使用REVOKE时,您必须指定与被授权列相同的列。</span><br><span class="line">-- 权限列表</span><br><span class="line">ALL [PRIVILEGES] -- 设置除GRANT OPTION之外的所有简单权限</span><br><span class="line">ALTER -- 允许使用ALTER TABLE</span><br><span class="line">ALTER ROUTINE -- 更改或取消已存储的子程序</span><br><span class="line">CREATE -- 允许使用CREATE TABLE</span><br><span class="line">CREATE ROUTINE -- 创建已存储的子程序</span><br><span class="line">CREATE TEMPORARY TABLES -- 允许使用CREATE TEMPORARY TABLE</span><br><span class="line">CREATE USER -- 允许使用CREATE USER, DROP USER, RENAME USER和REVOKE ALL PRIVILEGES。</span><br><span class="line">CREATE VIEW -- 允许使用CREATE VIEW</span><br><span class="line">DELETE -- 允许使用DELETE</span><br><span class="line">DROP -- 允许使用DROP TABLE</span><br><span class="line">EXECUTE -- 允许用户运行已存储的子程序</span><br><span class="line">FILE -- 允许使用SELECT...INTO OUTFILE和LOAD DATA INFILE</span><br><span class="line">INDEX -- 允许使用CREATE INDEX和DROP INDEX</span><br><span class="line">INSERT -- 允许使用INSERT</span><br><span class="line">LOCK TABLES -- 允许对您拥有SELECT权限的表使用LOCK TABLES</span><br><span class="line">PROCESS -- 允许使用SHOW FULL PROCESSLIST</span><br><span class="line">REFERENCES -- 未被实施</span><br><span class="line">RELOAD -- 允许使用FLUSH</span><br><span class="line">REPLICATION CLIENT -- 允许用户询问从属服务器或主服务器的地址</span><br><span class="line">REPLICATION SLAVE -- 用于复制型从属服务器(从主服务器中读取二进制日志事件)</span><br><span class="line">SELECT -- 允许使用SELECT</span><br><span class="line">SHOW DATABASES -- 显示所有数据库</span><br><span class="line">SHOW VIEW -- 允许使用SHOW CREATE VIEW</span><br><span class="line">SHUTDOWN -- 允许使用mysqladmin shutdown</span><br><span class="line">SUPER -- 允许使用CHANGE MASTER, KILL, PURGE MASTER LOGS和SET GLOBAL语句,mysqladmin debug命令;允许您连接(一次),即使已达到max_connections。</span><br><span class="line">UPDATE -- 允许使用UPDATE</span><br><span class="line">USAGE -- “无权限”的同义词</span><br><span class="line">GRANT OPTION -- 允许授予权限</span><br></pre></td></tr></table></figure>
<h2 id="2-12-表维护"><a href="#2-12-表维护" class="headerlink" title="2.12 表维护"></a>2.12 表维护</h2><figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">/* 表维护 */</span><br><span class="line">-- 分析和存储表的关键字分布</span><br><span class="line">ANALYZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE 表名 ...</span><br><span class="line">-- 检查一个或多个表是否有错误</span><br><span class="line">CHECK TABLE tbl_name [, tbl_name] ... [option] ...</span><br><span class="line">option = {QUICK | FAST | MEDIUM | EXTENDED | CHANGED}</span><br><span class="line">-- 整理数据文件的碎片</span><br><span class="line">OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ...</span><br></pre></td></tr></table></figure>
<h2 id="2-13-杂项"><a href="#2-13-杂项" class="headerlink" title="2.13 杂项"></a>2.13 杂项</h2><figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">/* 杂项 */ ------------------</span><br><span class="line">1. 可用反引号(`)为标识符(库名、表名、字段名、索引、别名)包裹,以避免与关键字重名!中文也可以作为标识符!</span><br><span class="line">2. 每个库目录存在一个保存当前数据库的选项文件db.opt。</span><br><span class="line">3. 注释:</span><br><span class="line"> 单行注释 # 注释内容</span><br><span class="line"> 多行注释 /* 注释内容 */</span><br><span class="line"> 单行注释 -- 注释内容 (标准SQL注释风格,要求双破折号后加一空格符(空格、TAB、换行等))</span><br><span class="line">4. 模式通配符:</span><br><span class="line"> _ 任意单个字符</span><br><span class="line"> % 任意多个字符,甚至包括零字符</span><br><span class="line"> 单引号需要进行转义 \'</span><br><span class="line">5. CMD命令行内的语句结束符可以为 ";", "\G", "\g",仅影响显示结果。其他地方还是用分号结束。delimiter 可修改当前对话的语句结束符。</span><br><span class="line">6. SQL对大小写不敏感</span><br><span class="line">7. 清除已有语句:\c</span><br></pre></td></tr></table></figure>]]></content>
<categories>
<category>数据库</category>
</categories>
<tags>
<tag>数据库</tag>
</tags>
</entry>
<entry>
<title>计算机组成原理笔记(五):中央处理器</title>
<url>/2020/09/11/CO5/</url>
<content><![CDATA[<h1 id="1-CPU的组成和功能"><a href="#1-CPU的组成和功能" class="headerlink" title="1 CPU的组成和功能"></a>1 CPU的组成和功能</h1><p>CPU是整个计算机的核心主要包括运算器和控制器</p>
<p>CPU的主要功能:</p>
<p>(一)指令控制</p>
<p>保证机器按顺序执行程序是CPU的首要任务</p>
<a id="more"></a>
<p>(二)操作控制</p>
<p>管理并产生由内存的每条指令的操作信号</p>
<p>(三)时间控制</p>
<p>(四)数据加工</p>
<p>CPU的主要寄存器</p>
<ol>
<li>通用寄存器</li>
<li>专用寄存器<ul>
<li>指令寄存器(IR)</li>
<li>程序计数器(PC)</li>
<li>存储器数据寄存器(MDR) </li>
<li>存储器地址寄存器(MAR)</li>
<li>状态标志寄存器(PSWR)</li>
</ul>
</li>
</ol>
<h1 id="2-时序系统和控制方式"><a href="#2-时序系统和控制方式" class="headerlink" title="2 时序系统和控制方式"></a>2 时序系统和控制方式</h1><ol>
<li>机器周期</li>
<li>时钟周期:机器周期又包含若干个时钟周期</li>
</ol>
<p>现在计算机微操作命令序列的形成方法主要有两种:一种是组合逻辑设计方法,为硬件连线逻辑;另一种是微程序设计方法,为存储逻辑</p>
<p>通常不同微操作序列所采用的时序控制方式称为CU的控制方式。常见的控制方式有</p>
<ol>
<li>同步控制</li>
<li>异步控制</li>
<li>联合控制</li>
<li>人工控制</li>
</ol>
<h1 id="3-微程序设计"><a href="#3-微程序设计" class="headerlink" title="3 微程序设计"></a>3 微程序设计</h1><p>将程序设计技术和存储技术相结合,将操作控制信号按一定规则进行信息编码,形成微指令,存放在一个只读存储器中。</p>
<p>一条微命令由一组实现一定操作功能的微命令构成。这些微操作时计算机最基本的、不可再分解的操作</p>
<p>一条微指令通常由两部分信息:</p>
<ol>
<li>操作控制字段:用于产生某一步所需的微操作控制信号</li>
<li>顺序控制字段:用于产生下一条执行的微指令地址</li>
</ol>
<p>微程序控制的计算机涉及到两个层次</p>
<ol>
<li>机器层:机器指令、程序、主存储器</li>
<li>微程序层:微指令、微程序和控制存储器</li>
</ol>
<p>微指令编码法是指微指令的操作控制字段的编码方法,通常有以下三种方法</p>
<ol>
<li>直接编码法</li>
<li>字段编码法</li>
<li>最短编译法</li>
</ol>
<p>微指令有垂直和水平之分,水平型微指令有很好的并行性,垂直型功能简单,容易掌握和利用,编程实现简单</p>
<p>微地址的形成</p>
<ol>
<li>增量方式(计数器法)</li>
<li>断定方法(下地址字段法)</li>
</ol>
]]></content>
<categories>
<category>计算机组成原理</category>
</categories>
<tags>
<tag>计算机组成原理</tag>
</tags>
</entry>
<entry>
<title>数据库总结笔记(二):关系数据库安全性与完整性</title>
<url>/2020/09/27/DB2/</url>
<content><![CDATA[<h1 id="1-数据库的安全性"><a href="#1-数据库的安全性" class="headerlink" title="1 数据库的安全性"></a>1 数据库的安全性</h1><p>(一)用户识别和鉴别是系统提供最外层安全保护措施</p>
<ol>
<li>口令:DBMS分配的字符串序列</li>
<li>用户的个人特征</li>
<li>智能卡</li>
</ol>
<p>(二)访问控制是按用户身份及其归属定义来限制用户对某些信息项的访问</p>
<ol>
<li>数据访问的级别和类别</li>
<li>任意控制:SQL对自主存取控制,通过GRANT和REVOKE来实现</li>
</ol>
<a id="more"></a>
<p>(1)授权</p>
<p>1.语句格式</p>
<figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">GRANT <特权类型> TO <用户标志符> [INDENTIFIED <口令>]</span><br><span class="line"></span><br><span class="line">把新用户WANG注册为RESURECE用户,口令为W02XYZ</span><br><span class="line">GRANT RESOURCE TO WANG INDENTIFIED BY W02XY3</span><br></pre></td></tr></table></figure>
<p>(2)回收</p>
<p>1.语句格式</p>
<figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">REVOKE <特权类型清单> FROM <用户标识符></span><br></pre></td></tr></table></figure>
<p>强制控制是指系统为保证更高程度的安全性,按照TDI/TCSEC标准汇总安全策略的要求,所采取的强制存取检测手段</p>