HTML,CSS,MySql


HTML

介绍:

1.HTML编程语言是一种专门在浏览器编译与执行的编程语言
2.HTML编程语言学称:超文本标记式编程语言

作用:

  • HTML编程语言通知浏览器将接收的数据以指定方式在窗口展示 [前端工程师]。
  • 控制浏览器请求行为[前端工程师/服务端工程师] 【重点】。

HTML编程语言语法规范

  • HTML编程语言中所有命令都是声明在标签中,比如

  • HTML编程语言中所有命令都是预先定义好,不允许开发人员自行创建新的命令。

  • HTML编程语言中所有命令不区分英文字母大小写,比如

    1
    <BR><br><Br>
  • HTML编程语言中命令开发时主要通过对命令中属性进行赋值实现开发目的。

    属性赋值时内容可以包含一个""中,也可以包含在'',也可以省略双引号与单引号,此时属性之间必须采用空格进行隔离
    
    1
    2
    3
    <input type="text" name="one"/>
    <input type='text' name='one'/>
    <input type=text name=one/>
  • HTML编程语言中命令根据书写方式分为:双目标签命令与单目标签命令

    • 双目标签命令书写命令分别出现在开始标签与结束标签,比如

    • 双目标签命令在书写时结束标签是不能省略的,比如,由于没有书写结束标签因此是一个非法命令

    • 单目标签命令书写命令出现一个标签之内,比如:

    • 单目标签命令用于表示结束”/“可以省略不写,比如



常见HTML标签命令(了解)

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
//==================================================================================
<html>
<!--
在一个HTML文件中,所有的HTML标签命令
必须声明在<html></html>
-->
<!--
<html></html>包含了两个子标签
<head></head>: 设置基础参数信息
<body></body>: 负责通知浏览器将指定内容以指定方式在窗口展示
-->
<head>
<meta charset="GBK"/>
</head>
<body>
下午好!
</body>
</html>
//==================================================================================
无序列表标签
<html>
<body>
<ul>
<li>中国</li>
<li>德国</li>
<li>英国</li>
</ul>

</body>
</html>
//==================================================================================
有序列表标签
<html>
<body>
<ol>
<li>中国</li>
<li>德国</li>
<li>英国</li>
</ol>

</body>
</html>
//==================================================================================
列表标签嵌套使用
<html>
<body>
<ul>
<li>职员管理
<ol>
<li>职员注册</li>
<li>职员查询</li>
<li>职员删除</li>
<li>职员更新</li>
</ol>

</li>
<li>部门管理
<ol>
<li>部门注册</li>
<li>部门查询</li>
<li>部门删除</li>
<li>部门更新</li>
</ol>
</li>
</ul>
</body>
</html>
//==================================================================================
图片标签
<html>
<body>
<center>
<div>
<font style="font-size:50">怀念我的恩师</font>
</div>
<div style="border:1px solid black;width:500;height:500">
<img src="cuicui.jpg" title="崔手凉老师" width=300 height=300 style="margin:50"/>
<div>
</center>
</body>

</html>
//==================================================================================
段落标签
<html>
<head>
<meta charset="GBK"/>
</head>
<body>
<p>
蒙奇·D·路飞,日本漫画《航海王》及其衍生作品中的主角,外号“草帽”路飞,草帽一伙、草帽大船团船长,极恶的世代之一。橡胶果实能力者的橡胶人,悬赏金15亿贝里。梦想是找到传说中的One Piece,成为海贼王。
</p>
<p>
路飞性格积极乐观,爱憎分明,而且十分重视伙伴,不甘屈居于他人之下,对任何危险的事物都超感兴趣。和其他传统的海贼所不同的是,他并不会为了追求财富而杀戮,而是享受着身为海贼的冒险和自由</p>
</body>
</html>

//==================================================================================
标题标签
<html>
<body>
<h1>一级标题</h1>
<h2>一级标题</h2>
<h3>一级标题</h3>
<h4>一级标题</h4>
<h5>一级标题</h5>
<h6>一级标题</h6>

</body>
</html>

//==================================================================================
colspan属性
<html>

<body>

<table border=2 align="center">
<tr align="center">
<td rowspan="2">学员名称</td>
<td colspan="3">学习科目</td>
</tr>

<tr>
<td>数学</td>
<td>语文</td>
<td>英语</td>
</tr>

<tr>
<td>mike</td>
<td>96</td>
<td>89</td>
<td>100</td>
</tr>
<tr>
<td>jones</td>
<td>67</td>
<td>90</td>
<td>92</td>
</tr>
<tr>
<td>allen</td>
<td>78</td>
<td>70</td>
<td>78</td>
</tr>

</table>
</body>
</html>

//==================================================================================
rowspan属性
<html>

<body>
<table border="2" align="center">
<tr style="background-color:green">
<td>部门名称</td>
<td>职员编号</td>
<td>职员姓名</td>
<td>职员职位</td>
<td>职员工资</td>
</tr>

<tr align="center" style="background-color:yellow">
<td rowspan="3">金融事业部</td>
<td>10</td>
<td>smith</td>
<td>JAVA工程师</td>
<td>13000</td>
</tr>

<tr align="center" style="background-color:yellow">

<td>20</td>
<td>mike</td>
<td>中级JAVA工程师</td>
<td>35000</td>
</tr>

<tr align="center" style="background-color:yellow">

<td>30</td>
<td>allen</td>
<td>高级JAVA工程师</td>
<td>55000</td>
</tr>

<tr align="center" style="background-color:yellow">
<td>云仓库</td>
<td>40</td>
<td>king</td>
<td>架构师</td>
<td>85000</td>
</tr>
</table>

</body>
</html>
//==================================================================================
表格标签
<html>

<body>
<table border="2" align="center">
<tr style="background-color:green">
<td>职员编号</td>
<td>职员姓名</td>
<td>职员职位</td>
<td>职员工资</td>
</tr>

<tr align="center" style="background-color:yellow">
<td>10</td>
<td>smith</td>
<td>JAVA工程师</td>
<td>13000</td>
</tr>

<tr align="center" style="background-color:yellow">
<td>20</td>
<td>mike</td>
<td>中级JAVA工程师</td>
<td>35000</td>
</tr>

<tr align="center" style="background-color:yellow">
<td>30</td>
<td>allen</td>
<td>高级JAVA工程师</td>
<td>55000</td>
</tr>

<tr align="center" style="background-color:yellow">
<td>40</td>
<td>king</td>
<td>架构师</td>
<td>85000</td>
</tr>
</table>

</body>
</html>

浏览器发送

浏览器发送请求三要素

1.控制浏览器发送请求地址
2.控制浏览器发送请求采用请求方式
3.控制浏览器发送请求携带请求参数

控制浏览器发送请求地址

超链接标签命令:
1
2
3
4
5
6
1)格式:  <a href="请求地址">提示信息</a>
2)工作原理:
超链接标签命令不会被浏览器自动执行。
在用户使用鼠标单击超链接标签命令时,
这个命令才会执行,执行要求浏览器
立刻按照href属性地址发送请求。
1
2
3
4
5
6
7
<html>

<body>
<a href="http://www.baidu.com">百度</a><br/>
<a href="图片标签.html">我的恩师</a>
</body>
</html>
表单标签命令
1
2
3
4
5
6
7
8
9
  1)格式:
<form action="请求地址">
<input type="submit"><!--提交按钮-->
</form>
2)工作原理:
表单标签命令不会被浏览器自动执行。
在用户单击提交按钮时,此时表单标签命令
被触发执行。执行时要求浏览器立刻按照
action属性地址发送请求。
1
2
3
4
5
6
7
8
<html>
<body>

<form action="http://www.sina.com">
<input type="submit" value="新浪"/>
</form>
</body>
</html>

显示:

  <form action="http://www.sina.com">
      <input type="submit" value="新浪"/>
  </form>

采用请求方式控制浏览器发送请求

1.请求方式:决定浏览器在发送请求后的行为特征。

2.浏览器可以选择请求方式:7种,目前为止只考虑【POST请求方式】和【GET请求方式】

GET请求方式
要求浏览器发送请求时:
  1. 携带的【请求参数数量】不能超过4K
  2. 必须在浏览器地址栏上将【请求参数信息】展示出来
  3. 必须将请求参数信息保存在Http请求协议包中【请求头】
  4. 要求浏览器在接收到服务器返回的资源文件内容后,必须将资源文件内容保存在浏览器的缓存
  5. 超链接标签命令在执行时,要求浏览器必须采用GET方式发送请求
  6. 表单标签存在一个method属性,通过这个属性可以要求浏览器采用对应请求方式发送请求
1
2
3
4
5
<form action="请求地址" method="get">
<form action="请求地址" method="post">
***method属性默认值是GET
<form action="请求地址">---->浏览器以GET方式发送请求
</form>
POST请求方式:
  1. 要求浏览器发送请求时,可以携带任意数量的【请求参数】
  2. 要求浏览器发送请求时,必须在浏览器地址栏上隐藏请求参数信息
  3. 要求浏览器发送请求时,必须将请求参数信息保存在Http请求协议包中【请求体】
  4. 禁止浏览器保存服务器返回的资源文件内容【阅后即焚】
请求方式适用场景【面试】
  • 考虑到POST请求方式,用户可以将【病毒文件内容】发送到服务器上进行攻击。因此绝大多数门户级网站拒绝接收POST请求,日常开发过程绝大多数请求都是GET。
  • 在某些特殊场景下必须使用POST:
  1. 文件上传,必须使用POST

  2. 发起登录验证请求,必须使用POST

  3. 索要服务器中实时变化数据时(股票价格,车票数量。。。)

携带请求参数控制浏览器发送请求

请求参数格式
1
请求地址?请求参数名1=值1&请求参数名2=值2
请求参数作用

比如用户通过浏览器访问服务端计算机动态资源文件.class,方法运行时需要实参,需要由用户通过浏览器以请求参数方式提供。

1
2
向浏览器发送请求时需要携带调用方法需要的实参(请求参数)
http://www.baidu.com?n1=100&n2=200 [n1=100&n2=200]就是浏览器发送请求参数
请求参数来源

通过超链接标签命令指定请求参数

1
<a href="http://www.baidu.com?userName=mike&password=123">百度</a>

通过表单域标签命令指定请求参数

表单域标签命令:
  • 一组声明在form标签内部的标签命令
  • 提示用户填写对应的【请求参数内容】,用于提供相对灵活的请求参数内容
  • 所有的表单域标签都拥有两个属性【name,value】
1
2
3
4
5
6
name属性声明【请求参数名】,value属性声明【请求参数内容】
<form action="http://www.baidu.com">
<input type="text" name="userName" value="mike"/>
<input type="submit">
</form>
当用户单击submit后,浏览器发送请求信息 http://www.baidu.com?userName=mike
表单域标签分类:
1
2
1)<input />
2)<select></select>
1
2
3
4
5
6
7
8
9
10
11
12
13
<html>
<center>
<form action="http://www.baidu.com">
籍贯:<select name="home">
<option value="bj">北京</option>
<option value="sh">上海</option>
<option value="tj">天津</option>
</select><br/>

<input type="submit"/><input type="reset"/>
</form>
</center>
</html>

显示:

1
2
3
4
5
6
7
<center>
<form action="http://www.baidu.com">
籍贯:<select name="home">
<option value="bj">北京</option>
<option value="sh">上海</option>
<option value="tj">天津</option>
</select><br/>
1
3)<textarea></textarea>文本框
1
2
<textarea name="abc">
</textarea rows=13 cols=27>

显示:

表单域标签value属性的默认值:
  1. 大多数表单域标签value属性默认值是空字符串 userName=’’
  2. 对于radio与checkbox来说,value属性默认值’on‘字符串
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
radio与checkbox的value属性默认值
<html>

<form action="http://www.baidu.com">
性别:<input type="radio" name="sex">
<input type="radio" name="sex"><br/>

爱好:<input type="checkbox" name='ck'/>JAVA<br/>
<input type="submit"/>

</form>

</html>
<form action="http://www.baidu.com">
性别:<input type="radio" name="sex">
<input type="radio" name="sex"><br/>
表单域标签作为请求参数条件:
  • 对于大多数表单域标签来说,只要同时满足以下两个条件,就可以作为请求参数
  1. 声明在form标签内部
  2. 声明name属性
  • 对于radio标签与checkbox标签来说在满足上述两个条件同时,还必须满足第三个条件:
    • 必须在【被选中】的情况下才可以作为请求参数
1
2
3
4
5
6
7
8
radio与checkbox作为请求参数条件
<html>
<form action="http://www.baidu.com">
性别:<input type="radio" name="sex" value="mam">MAN
<input type="radio" name="sex" value="womam">WOMAN<BR/>
<INPUT TYPE="SUBMIT">
</form>
</html>
readOnly与disabled区别:
  • readOnly要求当前标签中value属性只读不能被修改,readOnly不影响表单域标签作为请求参数。
  • disabled设置当前标签为不可用状态,此时标签中value属性内容不能被修改。disabled修饰的表单域标签都不能作为请求参数。
1
2
3
4
5
6
7
8
<html>
<form action="http://www.baidu.com">
性别:<input type="text" name="sex" value="man" disabled>性别不能改<br/>
姓名:<input type="text" name="userName" value="mike" readOnly>姓名不能改<br/>
<input type="submit"/>
</form>

</html>

CSS【简单了解】

介绍:

1.是一种专门在浏览器编译并执行的编程语言.
2.用于定位浏览器中HTML标签并对定位的HTML标签中【样式属性】进行统一管理.

HTML标签属性分类

基本属性:

1
2
3
4
5
6
7
    大多数HTML标签都拥有属性,是一个非常庞大群体
比如 id属性,相当于身份证编号,用于区分HTML标签
<input type="text" id="one"/>
<input type="text" id="two"/>
比如 name属性,相当于人名字,允许一组标签拥有相同name
<input type="text" id="one" name="myText"/>
<input type="text" id="two" name="myText"/>

样式属性:

​ 是一个非常庞大群体,通知浏览器将HTML标签中数据在浏览器中以指定形态展示

1
<div style="background-color:red;color:green;width:300px;height:200px"></div>

工作状态属性:

1
2
3
4
5
只存在于【表单域标签】中,用于表示【表单域标签】状态.
checked:存在于radio与checkbox中,表示标签是否被选中
disabled:表示标签处于不可用状态
readOny:表示标签处于只读状态
seleteced:存在option标签,表示标签是否被选中

监听属性:

1
2
3
4
监听属性用户与HTML标签之间进行通信通道,监听属性
用于监听用户在何时对当前标签进行何种操作,当指定
操作产生时,监听属性将会通知浏览器调用对应JavaScript
方法处理当前请求

样式属性开发难度:

1.由于网页经常出现大量的HTML标签拥有相同的样式属性设置,因此导致前端工程师进行大量重复性开发操作.
2.当用户修改需求时,导致前端工程师进行大量重复维护工作

CSS编程语言作用:

1.通知浏览器将所有满足定位条件的HTML标签进行统一定位
2.通知浏览器对已经定位HTML标签中样式属性进行集中统一赋值管理

CSS选择器:

CSS选择器,实际上就是一组定位条件用于定位HTML标签。CSS选择器有9个大的分类。

CSS选择器语法格式:

1
2
3
4
5
6
7
8
9
10
11
12
<html>
<head>
<!--type='text/css',-->
<style type="text/css">
定位条件{
"样式属性1":"值1";
"样式属性2":"值2"
}
</style>

</head>
</html>

ID选择器:

根据HTML标签中ID属性的值进行定位

语法:

1
2
3
4
5
6
7
<style type="text/css">
#id编号{

"样式属性1":"值1";
"样式属性2":"值2"
}
</style>

标签类型选择器:

根据HTML标签类型进行定位

语法:

1
2
3
4
5
6
7
       <style type="text/css">
标签类型名{

"样式属性1":"值1";
"样式属性2":"值2"
}
</style>

层级选择器

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
 1.HTML标签之间关系:
父子关系,兄弟关系.
2.父子关系:
即为包含关系
<tr>
<td>
<input type="text">
</td>
</tr>

td标签是tr标签的子标签
input标签是td标签的子标签

3.兄弟关系:
一组标签拥有相同的父标签,并且彼此之间
没有任何包含关系,即为兄弟

<body>
<div>1</div> 大哥
<p>2</p> 二哥
<span>3</span> 三弟
</body>

4.层级选择器介绍:
根据标签之间父子关系或则兄弟关系进行定位
5.简单的层级选择器

<style type="text/css">
定位父标签条件 定位子标签条件{

}
找到指定父标签下满足条件的所有子标签

</style>

自定义选择器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
1.介绍:
如果一组HTML标签之间没有相同的特征,但是却需要
对指定属性赋值相同内容,此时将自定义选择器绑定
到对应标签上

2.语法:

<style type="text/css">
.自定义选择器名{
color:red;
}
</style>

<div class="自定义选择器名"></div>
<p class="自定义选择器名"></p>

MySql

表文件,数据库,数据库服务器

表文件:

  1. 表文件是以”.frm”结尾一种文件

  2. 存在于服务端计算机硬盘上

  3. 以数据行形式进行数据存储的文件

表文件结构:

1
2
3
4
5
6
7
student.frm

标题行 sid sname sex age home

数据行 10 mike 男 23 河南

20 allen 女 22 河北

数据库:

​ 开发人员将用于存放表文件的文件夹称为【数据库】

数据库服务器

​ 一种专门对表文件进行调用和管理的软件

数据库服务器分类

  1. 关系型数据库服务器
           管理的表文件彼此之间往往具有隶属关系特征,可以完整
       描述一段数据,但是在查询时由于涉及数据较多,因此查询
       速度并不理想
    

甲骨文公司: Oracle , MySql
微软公司 : SqlServer

  1. 非关系数据库服务器【HashMap(key-value)】
    管理表文件都是独立,无法描述一段完整的数据
    但是由于每次查询的大数据较少,因此查询速度非常快

MySql服务器命令

MySql服务器启动与关闭:

1
2
3
4
5
6
7
8
9
10
11
12
13
1.通过windows系统帮助启动与关闭MySql服务器

[开始]--->输入命令【services.msc】进入到windows系统服务器管理窗口

2.以【管理员身份】通过DOS窗口输入命令,要求MySql服务器启动与关闭

***如果需要在DOS窗口中向mysql服务器发送命令,必须配置path环境变量
path= C:\Program Files (x86)\MySQL\MySQL Server 5.5\bin

***配置完毕后
DOS窗口: net start mysql 启动mysql服务器
net stop mysql 关闭mysql服务器
****如果不是以管理员身份来输入上述命令,此时得到【错误5】提示

SQL命令:

作用

用户通过SQL命令向数据库服务器发送请求,用于对表文件进行调用管理

特点

SQL语法结构与中国人日常用语结构非常相似,包含主谓宾

登录MySql服务器命令

1
1.命令格式:  mysql -u用户名  -p密码

数据库管理

1
2
3
4
5
6
7
1.MySql服务器管理数据库位置:C:\ProgramData\MySQL\MySQL Server 5.5\data

2.查看所有的数据库名 show databases;

3.创建一个数据库 create database 数据库名;

4.删除一个数据库 drop database 数据库名;

表文件管理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
   1. 查看指定的数据库下所有的表文件名
USE 数据库名;
show tables;

2.在指定的数据库下创建表文件
use 数据库;
create table 表文件名(
字段名 数据类型名,
字段名 数据类型名 #最后一个字段不要以","

);

3.删除一个表文件
drop table 表文件名;

4.查看表文件字段信息
show create table 表文件名;

5.为表文件添加字段
alter table 表文件名 add 新字段名 数据类型名;

6.删除表文件字段
alter table 表文件名 drop 字段名;

表文件数据行管理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
      1.插入命令: 负责要求MySql服务器向指定的表文件添加数据行

insert into 表文件名(字段名1,字段名2,字段名3)
values(值1,值2,'值3');
2.查询命令: 负责要求MySql服务器将指定的表文件数据行展示

select * from 表文件名;

3.删除命令:负责要求MySql服务器将指定的表文件数据行删除

delete from 表文件名; #删除表文件中所有的数据行

delete from 表文件名 where 判断条件; #将满足条件的数据行进行删除

4.更新命令:负责要求MySql服务器将指定的表文件数据行更新

update 表文件名 set 字段名=值,字段名2=值 ;将所有数据行指定字段的值赋值新值

update 表文件名 set 字段名=值,字段名2=值 where 判断条件; 将满足条件的数据行字段信息更新

高级插入命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
    1.一次性向表文件插入多行数据
INSERT INTO 表文件名(字段1,字段2,字段3)
values
(值1,值2,值3),
(值10,值20,值30);

2.简化版插入命令。如果插入数据时每一个字段都能赋值,此时插入命令不需要指定
字段名,插入值顺序此时需要与表文件字段顺序保持一致

insert into 表文件名 values(值1,值2,值3);

3.数据行备份命令:可以将表A中数据行复制到表B,(表A与表B字段结构完全一致)

insert into B select * from A;

表文件备份命令

将表文件A进行一份备份,备份生成的表文件B

1
create table B select * from A;

临时表

定义:

由查询命令在执行时,在内存中生成的表文件。

作用:

每一个查询命令在执行时,实际上操作都是上一个查询命令生成的临时表。

生命周期:

​ 在当前查询命令执行完毕后,MySql服务器自动将上一个查询命令生成的临时表从内存中销毁。导致用户最终看到的临时表为最后一个查询生成的临时表

七个查询命令与临时表之间关系:
  1. 七个查询命令中,只有FROM命令不需要操作临时表,FROM负责将硬盘上表文件加载到内存中生成第一个临时表,剩下的六个查询命令操作的都是上一个查询命令生成的临时表。

  2. 七个查询命令中,只有GROUP BY命令在执行完毕后,才有机会在内存中生成多个临时表。其他五个查询命令在执行完毕后,只能在内存中生成一个临时表。

  3. 七个查询命令中,只有HAVING命令在执行完毕后,不会生成新临时表。负责将GROUP BY生成的临时表中不满足条件的临时表从内存中进行删除处理。

FROM

  1. 执行顺序:mysql共有七个查询命令,FROM命令永远是第一个执行的查询命令

  2. 执行作用:

​ FROM命令相当于一个读取流;负责将硬盘上表文件加载到内存中生成一个【临时表】,供后续查询命令使用。临时表名称与硬盘上表文件名称保持一致。

​ 由于查询命令对临时表数据进行操作,因此查询命令执行时,不会修改表文件原有的数据

SELECT

  1. select由于在FROM之后执行,因此操作由FROM在内存中生成的临时表。

  2. select将指定字段下所有的数据读取出来,在内存中将读取数据组成一个全新的临时表。

硬盘上EMP.frm
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
7369 SMITH CLERK 7902 1980/12/17 800 NULL 20
7499 ALLEN SALESMAN 7698 1981/2/20 1600 300 30
7521 WARD SALESMAN 7698 1981/2/22 1250 500 30
7566 JONES MANAGER 7839 1981/4/2 2975 NULL 20
7654 MARTIN SALESMAN 7698 1981/9/28 1250 1400 30
7698 BLAKE MANAGER 7839 1981/5/1 2850 NULL 30
7782 CLARK MANAGER 7839 1981/6/9 2450 NULL 10
7788 SCOTT ANALYST 7566 1987/4/19 3000 NULL 20
7839 KING PRESIDENT 1981/11/17 5000 NULL 10
7844 TURNER SALESMAN 7698 1981/9/8 1500 0 30
7876 ADAMS CLERK 7788 1987/5/23 1100 NULL 20
7900 JAMES CLERK 7698 1981/12/3 950 NULL 30
7902 FORD ANALYST 7566 1981/12/3 3000 NULL 20
7934 MILLER CLERK 7782 1982/1/23 1300 NULL 10

需求:查询所有职员姓名,职位,工资

1
2
SELECT  ENAME,JOB,SAL  FROM EMP
SELECT * FROM EMP #'*'是一个通配符,表示临时表中所有字段
第二个临时表
ENAME JOB SAL
SMITH CLERK 800
ALLEN SALESMAN 1600
WARD SALESMAN 1250
JONES MANAGER 2975
MARTIN SALESMAN 1250
BLAKE MANAGER 2850
CLARK MANAGER 2450
SCOTT ANALYST 3000
KING PRESIDENT 5000
TURNER SALESMAN 1500
ADAMS CLERK 1100
JAMES CLERK 950
FORD ANALYST 3000
MILLER CLERK 1300

WHERE

执行顺序

FROM–>WHERE–>SELECT

书写顺序

​ SELECT 字段名,函数, 子查询
​ FROM 表文件
​ WHERE 关系运算/逻辑运算

作用

循环遍历临时表所有的数据行,每次得到一个数据行,根据数据行信息判断数据行是否需要被定位。
在循环完毕后,where命令将所有定位的数据行读取出来在内存生成一个临时表进行保存。

运算语法

1
2
3
4
5
6
7
8
9
select ename, job, sal from emp where  job = 'clerk'
#关系运算:= != > >= < <=
select ename, job, sal from emp where sal< 1500
#逻辑运算 and(类似&&) or(类似||)
select * from emp where job='salesman'
# between...and...
select * from emp where sal>=1500 and sal<=2000
等价于
select * from emp where sal between 1500 and 2000

in

1
2
3
4
5
6
7
#where 字段名 in (值1,...)
select * from emp where job='salesman' or job='clerk'
等价于
select * from emp where job in ('salesman' ,'clerk')
#where 字段名 not in (值1,...)
select * from emp where job!='salesman' and job!='clerk'
select * from emp where job not in ('salesman' ,'clerk')

null

1
2
3
4
5
6
7
8
9
# MySql中null值,不表示空含义,表示一个不确定的值,这个值既然是不确定因此无法进行任何运算
# is null
#查询所有补助为null的职员信息
# select ename ,comm from emp where comm = null 无法得到真实数据
select ename,comm from emp where comm is null
# is not null
#查询所有补助不为null的职员信息
# select ename,comm from emp where comm != null 无法得到真实数据
select ename,comm from emp where comm is not null

like

1
2
3
4
5
6
7
8
9
10
11
# like  模糊查询
# 查询所有名称以S开头的职员信息【前置条件模糊查询】
select * from emp where ename like 's%' # %是一个通配符,表示一个长度任意字符串
#查询所有名称以S结尾的职员信息【后置条件模糊查询】
select * from emp where ename like '%s'
#查询所有名称【包含】S的职员信息
select ename from emp where ename like '%s%'
#查询名字中第二个字母是A的人
select * from emp where ename like '_A%' # 下划线是通配符,表示一个任意字符
#查询名字中第三个字母是A的人
select * from emp where ename like '__A%'

聚合函数

用于对临时表指定字段下【所有内容】进行统计的函数
分类: max(字段),min(字段),sum(字段),avg(字段),count(字段)

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
# max(字段): 返回指定字段下最大值
#查询部门20下最高工资
select max(sal) from emp where deptno=20

#min(字段):返回指定字段下最小值
#销售岗位最低工资
select min(sal) from emp where job='salesman'

#sum(字段):返回指定字段下所有数据相加之和
#部门10所有职员工资总和
select sum(sal) from emp where deptno=10

#avg(字段):返回指定下所有数据平均值
#部门30下所有销售人员平均工资
select avg(sal) from emp where deptno=30 and job='salesman'

#count(字段):返回指定字段下内容不等于null的数据个数
#查询有具体补助人数
select count(comm) from emp
#查询有具体工资人数
select count(sal) from emp

# count(*): 统计临时表下所有数据行个数,不考虑数据行是否存在null
#查询部门20下职员人数
select count(*) from emp where deptno =20
#查询所有职员人数
select count(*) from emp

Group by

1
2
3
4
5
6
#查询各个部门下人数
select deptno,count(*) from emp group by deptno
#查询部门30下各个职位人数
select job,count(*) from emp where deptno =30 group by job
#查询各个部门下各个职位信息
select deptno,job,count(*) from emp group by deptno,job

group by : 分组查询命令

执行顺序:

​ FROM–>WHERE–>GROUP BY–>SELECT

书写顺序:

​ SELECT 字段名,函数,子查询
​ FROM 表名
​ WHERE 定位数据行条件
​ GROUP BY 分组字段
注意:如果同时出现WHERE与GROUP BY;GROUP BY应该在where之后

执行原理:

​ GROUP BY 执行时,首先根据分组字段数据种类,将临时表数据行进行分类。然后将具有相同特征的数据行读取出来保存到一个全新临时表

案例1
1
2
#查询部门30下各个职位人数
select job,count(*) from emp where deptno =30 group by job

需求:查询部门30下所有职位的人数

SQL:
SELECT JOB , COUNT(*)
FROM EMP
WHERE DEPTNO =30
GROUP BY JOB

第一步: FROM EMP

第二步:WHERE DEPTNO=30

EMP 第二个临时表
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
7499 ALLEN SALESMAN 7698 1981/2/20 1600 300 30
7521 WARD SALESMAN 7698 1981/2/22 1250 500 30
7654 MARTIN SALESMAN 7698 1981/9/28 1250 1400 30
7698 BLAKE MANAGER 7839 1981/5/1 2850 NULL 30
7844 TURNER SALESMAN 7698 1981/9/8 1500 0 30
7900 JAMES CLERK 7698 1981/12/3 950 NULL 30

第三步: GROUP BY JOB
1. 统计JOB字段下数据种类
2. 将具有相同特征的数据行保存到同一个临时表

第三个临时表
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
7499 ALLEN SALESMAN 7698 1981/2/20 1600 300 30
7521 WARD SALESMAN 7698 1981/2/22 1250 500 30
7654 MARTIN SALESMAN 7698 1981/9/28 1250 1400 30
7844 TURNER SALESMAN 7698 1981/9/8 1500 0 30
第四个临时表
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
7698 BLAKE MANAGER 7839 1981/5/1 2850 NULL 30
第五个临时表
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
7900 JAMES CLERK 7698 1981/12/3 950 NULL 30

第四步: SELECT JOB,COUNT(*)

SELECT 执行原理:
  1. SELECT执行特征与提供临时表的命令有关
  2. 如果临时表由【FROM】或则【WHERE】提供,此时SELECT面对只有一个临时表。此时SELECT将指定字段下所有内容读取出来生成一个全新的临时表
  3. 如果临时表由【group by】提供,此时SELECT可能面对多个临时表。
    1)SELECT将依次操作每一个临时表
    2)SELECT在操作某个临时表时,只会读取【指定字段下第一个数据】
    3)SELECT将从多个临时表读取数据合成一列保存到一个全新的临时表
第六个临时表
JOB count(*)
SALESMAN 4
MANAGER 1
CLERK 1
SELECT与group by联合使用,读取字段

SELECT与GROUP BY联合使用时,只会读取当前临时表下指定字段下【第一个数据】。此时SELECT抓取数据应该是当前临时表所有数据行【公有的特征】,所以此时select抓取的字段,应是GROUP BY进行分组的字段。所以SELECT与GROUP BY字段应保持一致。

1
select ename,count(*)   from  emp where deptno=30  group by job

上面这条SQL语句,得到信息给用户一个错误答案

ENAME count(*)
ALLEN 4
BLAKE 1
JAMES 1
案例2:多字段分组
1
2
#查询各个部门下各个职位信息
select deptno,job,count(*) from emp group by deptno,job
多字段分组规则:
  1. 多字段分组时,分组字段出现顺序对于最终查询结果没有任何影响。Group by deptno,job 与 group by job,deptno给出的最终结果一致。

  2. 多字段分组时,GROUP By一次只能根据一个分组字段进行分组。GROUP BY DEPTNO,JOB ,此时GORUP BY需要执行两次。

  3. 多字段分组时,从第二个分组字段开始,操作的是上一个分组字段生成的临时表。GROUP BY DEPTNO,JOB.当执行group by job时,操作临时表由Group by deptno来生成。

需求:查询各个部门下各个职位人数

SQL: SELECT DEPTNO,JOB,COUNT(*)
FROM EMP
GROUP BY DEPTNO,JOB #多字段分组

第一步:FROM EMP

第二步:GROUP BY DEPTNO

mysql表1

第三步:GROUP BY JOB

操作第二步生成三个临时表,需要依次对三个临时表进行拆分

mysql表2

第四步:SELECT DEPTNO,JOB,COUNT(*)

mysql表3

having

1
2
3
4
5
#查看各个部门下人数
select deptno,count(*) from emp group by deptno
#查看人数在5人以上的部门
select deptno,count(*) from emp group by deptno HAVING count(*) >= 5

执行顺序:

FROM–>WHERE–>GROUP BY–>HAVING–>SELECT

书写顺序:

HAVING命令不能独立出现在查询语句。只能出现在GROUP BY 后面

SELECT 字段名,函数名,子查询
FROM   表名
WHERE  数据行定位判断
GROUP BY  分组字段1,分组字段2
HAVING  通过统计临时表信息决定是否删除临时表
执行原理:

having命令在group by之后执行的。负责将GROUP BY生成临时表中不满足条件的临时表从内存中删除掉。

需求:查看人数在5人以上部门
SQL:

​ select deptno,count()
​ from emp
​ group by deptno
​ HAVING count(
) >=5

第一步: FROM EMP

第二步:group by deptno

mysql4

第三步:HAVING count(*) >=5

第四步 select deptno,count(*)

DEPTNO count(*)
20 5
30 6

order by

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 查询部门20下所有职员信息
select deptno,ename,job,sal from emp where deptno=20
#查询部门20下所有职员信息,按照工资升序排列
select deptno,ename,job,sal from emp where deptno=20 order by sal asc
#降序排列
select deptno,ename,job,sal from emp where deptno=20 order by sal desc
# order by 不仅仅可以写字段名,也可以写字段在【当前临时表位置】
select deptno,ename,job,sal from emp where deptno=20 order by 4 desc
#多字段排序
#查询职员信息,根据部门编号进行升序
#同一个部门下职员按照工资进行降序
#同一个部门下工资相同职员按照入职先后顺序(升序)
select *
from emp
order by deptno asc , sal desc , hiredate asc

limit

执行顺序:

FROM–>WHERE–>GROUP BY–>HAVING–>SELECT–>ORDER BY–>LIMIT

书写顺序:

SELECT 字段,函数,子查询
FROM 表
WHERE 定位数据行条件【关系运算/逻辑运算/特殊运算符】
GROUP BY 分组字段1,分组字段2
HAVING 对临时表进行删除判断条件
ORDER BY 排序字段1,排序字段2
Limit 起始行位置,从起始行开始向下截取行数

执行原理:

从临时表指定位置的数据行开始,向下截取指定数量的数据行。将截取出来的数据行保存到一个全新的临时表。

1
2
3
4
#查询工资排在第一名的职员信息
select * from emp order by sal desc limit 0,1
#查询销售人员工资排在前两名的职员信息
select * from emp where job='salesman' order by sal desc limit 0,2

注意:MySql服务器中,表文件字段位置从1开始计算,表文件数据行位置从0开始计算

表文件隶属关系

MySql服务器被称之为关系型数据库服务器,原因在于通过表文件数据关系来描述现实生活中【隶属关系】。

隶属关系划分:

一方: 拥有资源的一方
多方:依附于一方的资源

例子: 一个部门拥有拥有多个职员。【部门】 就是一方,【职员】 就是多方

一方表: 用于存放一方数据的表就是一方表,比如DEPT

多方表: 用于存放多方数据的表就是多方表,比如EMP

表文件字段分类

表文件字段分类:

1.主键字段:用于存放主键编号的字段就是主键字段。每一个表都应该存在一个主键字段。主键编号相当于身份证编号,用于对表文件中数据行身份进行确认。
注意:主键字段中既不能出现null值,也不能出现重复值

2.非主键字段:描述主键编号。

3.外键字段: 外键字段只存在于【多方表】,描述多方数据与一方数据之间依赖关系。外键字段的值应该来自于一方表中主键值。

mysql6

多表查询

多表查询本质:

​ 将多张表数据行合并到同一个临时表,然后使用除from外六个查询命令根据需求对临时表数据行进行定位分组排序等操作,最终为用户提供需要的数据的查询过程。

多张表中数据行合并方案:

  1. 连接查询合并方案:[最常见]

    1)首先确保两张表之间存在隶属关系,才可以使用连接查询合并方案。

    2)将两张表中数据行沿水平方向进行拼接,最终得到一个拥有【完整隶属关系】新数据行。

  2. 联合查询合并方案:

    1)不需要两张表之间存在了隶属关系。
    2)将两张表中数据行沿垂直方向进行堆砌。

mysql7

连接查询合并方案

1
2
3
4
5
6
7
# 查询各个【部门名称】及其部门下【职员名称】
# 数据来源: 【部门名称】---Dept.dname
# 【职员名称】---Emp.ename
# 确认表之间关系: Dept与Emp之间形成【隶属关系】
# 确认表之间角色: Dept 是一方表; Emp是多方表
SELECT *
FROM DEPT JOIN EMP #连接查询合并方案

JOIN命令

将两个表文件数据行沿水平方向进行拼接,拼接后数据行存在内存的一个临时表。

命令格式
1
2
FROM  一方表    JOIN  多方表
FROM 多方表 JOIN 一方表
  • JOIN两边出现表位置,对于最终查询结果没有任何影响
  • JOIN生成临时表字段由一方表字段与多方表字段相加而来
  • JOIN生成临时表字段名由“表名.字段名”组成,防止在同一个临时表出现同名字段问题
  • JOIN生成临时表数据行由一方表每一个数据行与多方表所有数据行拼接而成
  • JOIN生成临时表必然存在【脏数据行】,可以达到50%以上。【脏数据行】对后续统计分析带来巨大错误,因此在JOIN工作完毕后,必须要将【合法数据行】从当前临时表读取出来存放一个全新临时表,为后续操作做准备。

需求:查询所有部门名称和部门下职员名称

SQL:

SELECT DEPT.DNAME,EMP.ENAME

FROM DEPT JOIN EMP # join,就是连接合并方案

ON DEPT.DEPTNO = EMP.DEPTNO # 定位合法数据行条件【ON ,连接查询过滤方案】

mysql8

mysql9

连接查询过滤方案

​ JOIN生成临时表必然存在【脏数据行】,【脏数据行】对后续操作带来巨大影响。因此在JOIN生成临时表之后,必须要做的一件事将【合法数据行】与【脏数据行】进行剥离。这个行为称之为【连接查询过滤方案】。

分类

  1. 内连接过滤方案

  2. 外连接过滤方案

命令格式

1
2
FROM  一方表   JOIN  多方表
ON 定位合法数据行条件 【连接查询过滤方案】

合法数据行与脏数据行区分原则

1.如果表文件存在了明显的【外键字段】

1
ON 当前数据行来自于一方表主键字段值  =  当前数据行来自于多方外键字段值

2.如果表文件没有存在明显的【外键字段】

ON 根据实际隶属关系进行判断

内连接过滤方案

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
# 查询各个部门名称极其部门下最高工资,根据部门编号升序
select dept.deptno,dept.dname ,max(sal)
from dept join emp
on dept.deptno = emp.DEPTNO
group by dept.dname
order by 1 asc
# 查询各个部门名称及其部门下clerk的人数
select dept.dname,count(*)
from dept join emp
on dept.deptno = emp.deptno
where emp.JOB='clerk'
group by dept.dname

# 查询各个部门名称及其部门下人数
select dept.dname,count(*)
from dept join emp
on dept.DEPTNO= emp.deptno
group by dept.dname
#查询各个部门名称及其部门下人数,仅显示人数在5人以上部门
select dept.dname,count(*)
from dept join emp
on dept.DEPTNO= emp.deptno
group by dept.dname
having count(*) >=5

# 查询各个部门名称及其部门下人数,仅显示人数在5人以上部门,要求根据部门人数进行降序
select dept.dname,count(*)
from dept join emp
on dept.DEPTNO= emp.deptno
group by dept.dname
having count(*) >=5
order by count(*) desc #此处不是调用聚合函数,是select生成临时表字段名
# order by 对select 生成的临时表数据进行排序
# order by 使用排序字段只能来自于select生成的临时表

#查询所有职员工资及其工资等级,ON 根据实际隶属关系进行判断
select emp.ename,emp.sal,salgrade.losal,salgrade.hisal,salgrade.grade
from salgrade join emp
on emp.sal between salgrade.losal and salgrade.hisal

外连接过滤方案

表文件角色划分:

​ 1.需要被帮助表
​ 2.不要被帮助表

执行原理:

如果【需要被帮助表】中某行数据与【不要被帮助表】所有的数据行都无法拼接为合法数据。此时已然将这个数据行作为一个独立的数据行存入到新的临时表。

命令格式:
左外连接过滤方案/左外连接查询
1
2
FROM   需要被帮助表  LEFT  JOIN   不需要被帮助表
ON 合法数据行定位条件
右外连接过滤方案/右外连接查询
1
2
FROM   不需要被帮助表  RIGHT JOIN  需要被帮助表
ON 合法数据行定位条件

需求:查询所有部门名称及其部门下人数【无论这个部门是否有人,都要展示出来】

1
2
3
4
5
6
SQL:
# SELECT DEPT.DNAME,COUNT(*)
SELECT DEPT.DNAME, COUNT(EMP.EMPNO)
FROM dept Left JOIN emp #做外链接查询
ON dept.deptno = emp.deptno
GROUP BY DEPT.DNAME

第一步: FROM DEPT LEFT JOIN EMP

mysql10

第二步: ON dept.deptno = emp.deptno

第三步: GROUP BY DEPT.DNAME

mysql12

第四步:SELECT DEPT.DNAME,COUNT(*)

mysql11

联合查询合并方案

  1. 要求参与合并的两个临时表的字段结构必须保持一致【字段个数,字段类型顺序】

  2. 将两个临时表数据行沿垂直方向堆砌到同一个临时表。

  3. 联合查询生成临时表的字段只能来自于第一个临时表字段

  4. UNION命令在执行时,自动将两个临时表内容相同数据行进行过滤,类似于Java中Set集合

  5. UNION ALL命令在执行时,不会将临时表重复的数据进行过滤。

需求: 将部门编号,部门名称,职员编号,职员名称展示出来

1
2
3
SQL:    select deptno,dname      from  dept   #第一个临时表
UNION #联合查询合并方案
select empno,ename from emp #第二个临时表

第一步:在内存中生成第一个临时表

    select deptno,dname      from  dept

第二步:生成第二个临时表

      select  empno,ename from emp

mysql13

第三步:通过UNION命令,将两个临时表数据行沿着垂直方向,堆砌到同一个临时表

mysql14

子查询

查询时无法从当前临时表得到需要的数据,此时MySql服务器允许开发人员通过【完整查询语句】从别处得到数据,从而保证查询正常执行,这个起到帮助作用【完整查询语句】在技术上被称为【子查询】。

子查询可以使用的情况

1
2
3
4
5
6
7
8
9
10
SELECT 字段,函数,子查询

FROM 将硬盘上表文件加载到内存中生成一个临时表
指向在内存中已经存在的临时表,此时可以借助于子查询提供这个临时表

WHERE 可以通过子查询得到进行判断的数据

HAVING 可以通过子查询得到删除临时表时需要判断数据

Limit 起始行位置,向下截取行数

例:

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
#查询工资高于公司平均工资的职员信息
select *
FROM EMP
where sal > 公司平均工资
#公司平均工资
select avg(sal) from emp

#综合:
select ename,sal
FROM EMP
where sal > (select avg(sal) from emp) #2073

#子查询在Select之后使用
# 查询职员姓名,工资,以及公司的平均工资
SELECT ENAME, SAL,(SELECT AVG(SAL) FROM EMP)
FROM EMP
#子查询生成临时表,交给FROM定位
select t1.deptno,t1.dname,t1.ename
from(
select dept.deptno,dept.dname,emp.ename,emp.job,emp.sal
from emp join dept
on dept.deptno = emp.deptno
) as t1
#子查询在HAVING之后提供数据
#查询出部门平均工资高于公司平均工资的部门信息
select deptno,avg(sal)
from emp
group by deptno
having avg(sal) > (select avg(sal) from emp)

字符串类型

分类: varchar 与 char

区别:【面试】

varchar(m): 定长可变字符串

  • 定长: 当前字段可以存储的字符个数是固定的
1
ename  varchar(3)  # 3表示ename字段可以存储3个英文字符或则3个中文
  • 可变: ename字段在硬盘上存储字符空间可以根据实际情况进行【缩小】
1
2
3
  ename varchar(3)
insert into test1 values('abc') #硬盘 【a】【b】【c】
insert into test1 values('ef') #硬盘 【e】【f】

char(m): 定长不可变字符串

  • 定长: 当前字段可以存储的字符个数是固定的
1
sex char(1)    #1表示sex字段可以存储1个英文字母或则1个中文
  • 不可变:
              sex字段在硬盘上存储字符空间是固定的
    
1
2
3
sex char(3)
insert into test1 values('abc') 【a】 【b】 【c】
insert into test1 values('ef') 【e】 【f】 【空格】

注意:针对char类型字段进行数据读取时,MySql服务器自动去掉字符串中结尾处空格。如果插入字符串以空格结尾,不要添加到由char类型修饰的字段。

约束(了解)

分类:

  1. 非空约束: 要求管理的字段不能存储null值

  2. 唯一性约束: 要求管理的字段存储值不能有重复,但是可以存储null值

  3. 主键约束: 管理主键字段,要求主键字段内容不能为null同时也不能出现重复值。

  4. 外键约束: 管理外键字段,要求外键字段的值应该来自于关联的一方表中主键字段的值,可以存储null值

    • ALTER TABLE 多方表
      ADD CONSTRAINT  外键约束对象名  foreign key(外键字段名)
      REFERENCES  一方表(主键字段)
      
      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

      例:

      ```mysql
      CREATE TABLE TEST1(
      SID INT,
      SNAME VARCHAR(10) NOT NULL # 为sname字段添加非空约束

      )
      insert into test1(sid,sname) values(1,'mike')
      insert into test1(sid,sname) values(2,null)
      insert into test1(sid) values(3)

      create table test2(
      sid int,
      sname varchar(10),
      email varchar(50) unique # 为email字段添加唯一性约束
      )
      insert into test2 values(1,'mike','mike@163.com')
      insert into test2 values(2,'allen','mike@163.com') # Duplicate entry 重复数据冲突
      insert into test2 values(3,'smith',null)
      insert into test2 values(4,'tom',null)
      select * from test2

      CREATE TABLE TEST3(
      SID INT PRIMARY KEY, # 为sid字段添加主键约束
      SNAME VARCHAR(20)
      )
      insert into test3(sid,sname) values(1,'mike')
      insert into test3(sid,sname) values(1,'allen') #Dupliate entry
      insert into test3(sid,sname) values(null,'tom')

索引(index)

作用

在表文件数据行增加时候,不会大幅度降低查询语句执行效率

工作原理:

索引事先将字段中内容进行排序,在WHERE命令进行定位时,避免对表中所有的数据行进行遍历,提升查询速度。

索引管理:

  1. 将字段内容交给某个索引进行管理
1
create index 索引名  on 表名(字段)
  1. 查询表文件关联的索引
1
show index from 表名

注意:在为表文件绑定【主键约束】,【唯一性约束】,【外键约束】时,mysql服务器自动将当前字段数据进行排序并交给指定索引管理。

  1. 删除表文件指定索引
    1
    DROP INDEX 索引名 ON 表名

执行计划(explain)

命令格式

1
explain  查询语句

命令作用

  • 展示当前查询得到结果是否通过索引来进行定位
  • DBA通过执行计划了解在本次查询过程,是否使用预先创建好的索引

执行计划对于查询语句执行效率判断(了解)

  1. 在执行计划中,通过type属性展示查询语句执行效率

  2. 执行效率分类:[慢—-快]

all

WHERE对表文件所有数据行进行遍历,才得到了查询结果。这种级别查询语句,随着数据行增加导致执行速度大幅度降低(DBA来说,极力避免这种级别查询)。

type

WHERE对表文件所有数据行进行遍历,只不过在SELECT抓取字段内容时,从索引中抓取。这种级别虽然在抓取数据速度有所提升,但是随着数据行增加执行速度大幅度降低(DBA来说,极力避免这种级别查询)。

1
2
3
select * from emp ;    # all
create index ename_index on emp(ename)
select ename from emp; #type,此时对于查询速度提升是非常微小

range

WHERE不会对表文件数据行进行遍历,而是直接从索引得到定位的数据行行数,大幅度提升查询效率。这是DBA进行SQL优化时要保证最低级别。但是这种级别存在[不稳定性]。当字段内容发生变化时,导致索引失效。

1
2
3
4
5
explain select * from emp where sal<=1000  # all         14
create index sal_index on emp(sal)
explain select * from emp where sal<=1000 # range 2
****mysql服务器如果发现从索引得到数据行行数达到了表文件总行数1/3(老版本)时,此时考虑运行成本问题此时放弃使用索引。
explain select * from emp where sal<=1250 # all 14

ref

WHERE不会对表文件数据行进行遍历,而是直接从索引得到定位的数据行行数,同时在这种情况根据定位条件一次只能得到一个数据行,属于比较稳定执行效率。DBA努力达到的优化程度。

const

根据主键字段上索引进行定位,是执行效率最快的。但是在实际使用过程中,几乎不会被用到。

视图

定义

​ 是MySql服务器中一个对象,用于存储查询语句。目的提供查询语句使用效率,避免在多处地方重复开发相同查询语句。

命令

  1. 将查询语句交给一个视图对象管理
1
CREATE VIEW  视图对象名  AS  查询语句
  1. 通过视图对象调用管理查询语句
1
select *  from 视图对象名

额外功能

视图对象存储一个查询语句,同时视图对象拥有对当前查询语句关联的表文件操作能力

  1. 通过视图对象对关联表文件数据行进行插入
  2. 通过视图对象对关联表文件数据行进行删除
  3. 通过视图对象对关联表文件数据行进行更新
1
2
3
4
create view  view_1  as select * from emp where empno=7369
select * from view_1
insert into view_1(empno,ename,job) values(2000,'emp2000','clerk')
update view_1 set ename='老崔' where empno=7788

视图作用【面试】

  1. 提高了查询语句复用性,避免了在多处地方重复进行查询语句开发行为。
  2. 隐藏业务中涉及表关系,开发人员通过视图进行操作时不会知道其具体操作的表。

存储引擎

定义:

是MySql服务器对应表文件内容管理方式。目前MySql服务器主要采用INNODB,MyIsam

管理命令:

1)查看MySql服务器支持存储引擎种类

1
show engines;

2)修改MySql服务器默认存储引擎

在mysql根目录my.ini文件中对default-storage-engine 进行修改如myIsam

3)设置表文件依赖存储引擎

1
2
show create table 表名;
alter table 表名 engine=存储引擎

MyIsam存储引擎

  1. 在对表文件内容进行修改时,不会进行备份操作。提高操作执行效率,但是在操作完毕后无法取消本次操作

  2. MyIsam存储引擎 使用三个文件存储表文件信息

  • .frm : 存储表文件字段信息
  • .myd : 存储表文件数据行信息
  • .myi : 存储表文件字段关联的索引信息

INNODB存储引擎

  1. 在对表文件内容进行修改时,首先进行一次备份。在进行操作,因此执行效率相对较慢。但是在执行完毕后,由于有备份存在,可以使用备份取消当前操作,增加数据安全性。

  2. INNODB存储引擎,使用一个文件存储表文件信息

  • .frm: 存储表文件字段信息、表文件数据行信息和表文件字段关联的索引信息。

事务(transaction)

事务是MySql服务器提供一个管理对象,用于对当前表文件备份进行管理。

语法

1
2
3
4
5
start transaction; #通知MySql服务器提供一个事务对象,这个事务对象对接下来操作产生所有备份进行管理
delete from emp where deptno=30 # 生成emp.bak
delete from dept where deptno=30 #声明dept.bak
rollback; #通知mysql服务器将本次操作中所有备份信息覆盖到表文件,来取消本次操作
commit; #通知mysql服务器将本次操作中生成所有备份信息进行删除,称之为提交操作