谁能解释下这串代码中的for循环语句是怎么写出来的?

3.1、谈谈你对CSS布局的理解

3.2、请列举几种可以清除浮动的方法(至少两种)

浮动会漂浮于普通流之上,像浮云一样,但是只能左右浮动。正是这种特性,导致框内部由于不存在其他普通流元素了,表现出高度为0(高度塌陷)。

a. 添加额外标签,例如

b. 使用br标签和其自身的html属性,例如

e. 父元素也设置浮动

创建了BFC的元素就是一个独立的盒子,里面的子元素不会在布局上影响外面的元素,同时BFC仍然属于文档中的普通流。

IE6-7的显示引擎使用的是一个称为布局(layout)的内部概念。

3.3、请列举几种隐藏元素的方法

a. visibility: hidden;这个属性只是简单的隐藏某个元素,但是元素占用的空间任然存在。

c. position: absolute;使元素脱离文档流,处于普通文档之上,给它设置一个很大的left负值定位,使元素定位在可见区域之外。

d. display: none;元素会变得不可见,并且不会再占用文档的空间。

e. transform: scale(0);将一个元素设置为无限小,这个元素将不可见。这个元素原来所在的位置将被保留。

g. height: 0; overflow: hidden;将元素在垂直方向上收缩为0,使元素消失。只要元素没有可见的边框,该技术就可以正常工作。

h. filter: blur(0);将一个元素的模糊度设置为0,从而使这个元素“消失”在页面中。

3.4、如何让一段文本中的所有英文单词的首字母大写

3.5、请简述CSS样式表继承

CSS样式表继承指的是,特定的CSS属性向下传递到子孙元素。会被继承下去的属性如下:

3.6、请简述CSS的选择器

3.7、CSS伪类与CSS伪对象的区别

CSS 引入伪类和伪元素的概念是为了描述一些现有CSS无法描述的东西

根本区别在于:它们是否创造了新的元素(抽象)

伪类:一开始用来表示一些元素的动态状态,随后CSS2标准扩展了其概念范围,使其成为了所有逻辑上存在但在文档树中却无须标识的“幽灵”分类

伪对象:代表了某个元素的子元素,这个子元素虽然在逻辑上存在,但却并不实际存在于文档树中

3.8、请简述CSS的权重规则

一个行内样式+1000,一个id+100,一个属性选择器/class类/伪类选择器+10,一个元素名/伪对象选择器+1。

关系选择器将拆分为两个选择器再计算。参考《CSS权重》

3.9、请写出多种等高布局

a. 假等高列:使用背景图片,在列的父元素上使用这个背景图进行Y轴的铺放,从而实现一种等高列的假像

b. 给容器div使用单独的背景色(固定布局)(流体布局):用元素中的最大高度撑大其他的容器高度

c. 创建带边框的两列等高布局:用border-left来做,只能使用两列。

d. 使用正padding和负margin对冲实现多列布局方法:在所有列中使用正的上、下padding和负的上、下margin,并在所有列外面加上一个容器,设置overflow:hiden把溢出背景切掉

e. 使用边框和定位模拟列等高:但不能使用在多列

f. 模仿表格布局等高列效果:兼容性不好,在ie6-7无法正常运行

3.10、在CSS样式中常使用px、em,各有什么优劣,在表现上有什么区别?

px是相对长度单位,相对于显示器屏幕分辨率而言的。

em是相对长度单位,相对于当前对象内文本的字体尺寸。

px定义的字体,无法用浏览器字体放大功能。

em的值并不是固定的,会继承父级元素的字体大小,1 ÷ 父元素的font-size × 需要转换的像素值 = em值。

b. 页面被加载时,link会同时被加载,而@import引用的CSS会等到页面被加载完再加载

b. 让元素脱离普通流,不占据空间

c. 默认会覆盖到非定位元素上

absolute的”根元素“是可以设置的,而fixed的”根元素“固定为浏览器窗口。

当你滚动网页,fixed元素与浏览器窗口之间的距离是不变的。

absolute:生成绝对定位的元素,相对于 static 定位以外的第一个祖先元素进行定位

fixed:生成绝对定位的元素,相对于浏览器窗口进行定位。 (IE6不支持)

relative:生成相对定位的元素,相对于其在普通流中的位置进行定位

static:默认值。没有定位,元素出现在正常的流中

增加了更多的CSS选择器  多背景 rgba,在CSS3中唯一引入的伪元素是::selection,媒体查询,多栏布局

3.15、为什么要初始化CSS样式?

因为浏览器的兼容问题,不同浏览器对有些标签的默认值是不同的,如果没对CSS初始化往往会出现浏览器之间的页面显示差异。

当然,初始化样式会对SEO有一定的影响,但鱼和熊掌不可兼得,但力求影响最小的情况下初始化。

CSS Sprites其实就是把网页中一些背景图片整合到一张图片文件中,

c. 解决了网页设计师在图片命名上的困扰,只需对一张集合的图片上命名就可以了,不需要对每一个小元素进行命名

d. 更换风格方便,只需要在一张或少张图片上修改图片的颜色或样式,整个网页的风格就可以改变。

a. 在宽屏,高分辨率的屏幕下的自适应页面,你的图片如果不够宽,很容易出现背景断裂

b. CSS Sprites在开发的时候,要通过photoshop或其他工具测量计算每一个背景单元的精确位置

c. 在维护的时候比较麻烦,如果页面背景有少许改动,一般就要改这张合并的图片

3.17、解释下浮动和它的工作原理?

a. 浮动元素脱离文档流,不占据空间(引起“高度塌陷”现象)

b. 浮动元素碰到包含它的边框或者浮动元素的边框停留。

3.18、浮动元素引起的问题

a. 父元素的高度无法被撑开,影响与父元素同级的元素

b. 与浮动元素同级的非浮动元素会跟随其后

c. 若非第一个元素浮动,则该元素之前的元素也需要浮动,否则会影响页面显示的结构

3.19、什么是 FOUC(无样式内容闪烁)?你如何来避免 FOUC?

如果使用import方法对CSS进行导入,会导致某些页面在Windows下的IE出现一些奇怪的现象:

以无样式显示页面内容的瞬间闪烁,这种现象称之为文档样式短暂失效(Flash of Unstyled Content),简称为FOUC。

原理:当样式表晚于结构性html加载,当加载到此样式表时,页面将停止之前的渲染。此样式表被下载和解析后,将重新渲染页面,也就出现了短暂的花屏现象。

解决方法:使用LINK标签将样式表放在文档HEAD中。

3.20、line-height三种赋值方式有何区别?(带单位、纯数字、百分比)

带单位:px不用计算,em则会使元素以其父元素font-size值为参考来计算自己的行高

纯数字:把比例传递给后代,例如父级行高为1.5,子元素字体为18px,则子元素行高为1.5*18=27px

百分比:将计算后的值传递给后代

3.22、经常遇到的浏览器兼容性有哪些?如何解决?

c. 在ie6,ie7中元素高度超出自己设置高度。原因是IE8以前的浏览器中会给元素设置默认的行高的高度导致的

3.23、有哪项方式可以对一个DOM设置它的CSS样式?

a. 外部样式表:通过标签引入一个外部css文件

c. 内联样式:将css样式直接定义在 HTML 元素内部

3.24、什么是外边距重叠?重叠的结果是什么?

在CSS当中,相邻的两个盒子(可能是兄弟关系也可能是祖先关系)的外边距可以结合成一个单独的外边距。这种合并外边距的方式被称为折叠,并且因而所结合成的外边距称为折叠外边距。

折叠结果遵循下列计算规则:

a. 两个相邻的外边距都是正数时,折叠结果是它们两者之间较大的值。

b. 两个相邻的外边距都是负数时,折叠结果是两者绝对值的较大值。

c. 两个外边距一正一负时,折叠结果是两者的相加的和。

a. opacity作用于元素,以及元素内的所有内容的透明度,rgba()只作用于元素的颜色或其背景色。

b. 设置rgba透明的元素的子元素不会继承透明效果!

3.26、css属性content有什么作用?有什么应用?

可以配合自定义字体显示特殊符号。

4.1、请解释一下什么是闭包

闭包是一种特殊的对象。它由两部分构成:函数,以及创建该函数的环境。

可以把闭包简单理解成 "定义在一个函数内部的函数",闭包就是将函数内部和函数外部连接起来的一座桥梁。闭包有如下特性:

a. JavaScript允许你使用在当前函数以外定义的变量

b. 即使外部函数已经返回,当前函数仍然可以引用在外部函数所定义的变量

c. 闭包可以更新外部变量的值

d. 用闭包模拟私有方法

由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题

区别是从第二个参数起,call 需要把参数按顺序传递进去,而 apply 则是把参数放在数组里。

4.3、如何使用原生 Javascript 代码深度克隆一个对象(注意区分对象类型)

在网上找了个函数,用递归的方式做复制。传入的参数必须得是Array或Object。

jQuery内部使用Sizzle引擎,处理各种选择器。Sizzle引擎的选择顺序是从右到左,所以这条语句是先选.class,

第二个会直接过滤出div标签,而第一个就不会过滤了,将所有相关标签都列出。

4.5、实现输出document对象中所有成员的名称和类型

就是看到篇文章还会判断document.hasOwnProperty,然后再做打印,我测试了下这样的话打印不出来。

4.6、获得一个DOM元素的绝对位置

4.8、实现预加载一张图片,加载完成后显示在网页中并设定其高度为50px,宽度为50px

先new Image()获取一个图片对象,然后在图片对象的onload中设置宽度和高度。查看在线代码。

先是通过table.tBodies[0].rows获取到当前tbody中的行,接下来是两种方法处理。获取到的行没有reverse这个方法。

第一种是将这些行push到另外一个数组中

这里我有个疑问,就是在appendChild的时候,并不是在最后把列加上,而是做了替换操作?

先是在构造函数中定义一个数组,然后用push模拟add,splice模拟remove。

四个方法都放在了prototype上面。查看在线代码。

4.11、Ajax读取一个XML文档并进行解析的实例

a. 初始化一个HTTP请求,IE以ActiveX对象引入。 后来标准浏览器提供了XMLHttpRequest类,它支持ActiveX对象所提供的方法和属性

4.12、JS如何实现面向对象和继承机制?

c. 通过创建函数来生成对象

a. 构造函数绑定,使用call或apply方法,将父对象的构造函数绑定在子对象上

c. 直接继承函数的prototype属性,对b的一种改进

d. 利用空对象作为中介

f. 拷贝继承,把父对象的所有属性和方法,拷贝进子对象,实现继承。参考《JavaScript中的对象克隆》

4.13、JS模块的封装方法,比如怎样实现私有变量,不能直接赋值,只能通过公有方法

a. 通过json生成对象的原始模式,多写几个就会非常麻烦,也不能反映出它们是同一个原型对象的实例

b. 原始模式的改进,可以写一个函数,解决代码重复的问题。同样不能反映出它们是同一个原型对象的实例

c. 构造函数模式,就是一个普通函数,不过内部使用了this变量,但是存在一个浪费内存的问题。

d. Prototype模式,每一个构造函数都有一个prototype属性,指向另一个对象。这个对象的所有属性和方法,都会被构造函数的实例继承,可以把那些不变的属性和方法,直接定义在prototype对象上。Prototype模式的验证方法:isPrototypeOf()、hasOwnProperty()和in运算符。

4.14、对this指针的理解,可以列举几种使用情况?

this指的是:调用函数的那个对象。

a. 纯粹的函数调用,属于全局性调用,因此this就代表全局对象Global。

b. 作为对象方法的调用,这时this就指这个上级对象。

c. 作为构造函数调用,就是通过这个函数new一个新对象(object)。这时,this就指这个新对象。

d. apply与call的调用,它们的作用是改变函数的调用对象,它的第一个参数就表示改变后的调用这个函数的对象。

4.15、在JavaScript中,常用的绑定事件的方法有哪些?

a. Netscape主张元素1的事件首先发生,这种事件发生顺序被称为捕获型

b. 微软则保持元素3具有优先权,这种事件顺序被称为冒泡型

c. W3C选择了一个择中的方案。任何发生在w3c事件模型中的事件,首是进入捕获阶段,直到达到目标元素,再进入冒泡阶段

事件监听函数addEventListener()的第三个参数就是控制方法是捕获还是冒泡

a. 一款轻量级的js库

b. 丰富快速的DOM选择器

d. 事件、样式、动画等特效支持

e. Ajax操作封装,支持跨域

4.18、Ajax有哪些好处和弊端?

b. 异步与服务器通信

c. 前端和后端负载平衡

d. 基于标准被广泛支持

c. 对搜索引擎支持较弱

d. 违背URL和资源定位的初衷

参考《AJAX工作原理及其优缺点》

a. null是一个表示"无"的对象,转为数值时为0

b. null表示"没有对象",即该处不应该有值。

a. undefined是一个表示"无"的原始值,转为数值时为NaN。

b. undefined表示"缺少值",就是此处应该有一个值,但是还没有定义。

4.20、new操作符具体干了什么呢?

a. 一个新对象被创建。它继承自函数原型

b. 构造函数被执行。执行的时候,相应的传参会被传入

c. 上下文(this)会被指定为这个新实例

d. 如果构造函数返回了一个“对象”,那么这个对象会取代整个new出来的结果

4.21、js延迟加载的方式有哪些?

a. 将script节点放置在最后之前

b. 使用script标签的defer和async属性,defer属性为延迟加载,是在页面渲染完成之后再进行加载的,而async属性则是和文档并行加载

4.22、如何解决跨域问题?

d. 通过设置img的src属性,进行跨域请求

4.24、哪些操作会造成内存泄漏?

a. 当页面中元素被移除或替换时,若元素绑定的事件仍没被移除,在IE中不会作出恰当处理,此时要先手工移除事件,不然会存在内存泄露。

b. 在IE中,如果循环引用中的任何对象是 DOM 节点或者 ActiveX 对象,垃圾收集系统则不会处理。

c. 闭包可以维持函数内局部变量,使其得不到释放。

d. 在销毁对象的时候,要遍历属性中属性,依次删除,否则会泄漏。

函数声明和变量声明总是被JavaScript解释器隐式地提升到包含他们的作用域的最顶端。

函数表达式中只会提升名称,函数体只有在执行到赋值语句时才会被赋值。

4.26、如何判断当前脚本运行在浏览器还是node环境中?

通过判断Global对象是否为window,如果是window,当前脚本运行在浏览器中

设立"严格模式"的目的,主要有以下几个:

a. 消除Javascript语法的一些不合理、不严谨之处,减少一些怪异行为;

b. 消除代码运行的一些不安全之处,保证代码运行的安全;

c. 提高编译器效率,增加运行速度;

注:经过测试IE6,7,8,9均不支持严格模式

eval()函数可计算某个字符串,并执行其中的的 JavaScript 代码。

eval()是一个顶级函数并且跟任何对象无关。

如果字符串表示了一个表达式,eval()会对表达式求值。如果参数表示了一个或多个JavaScript声明, 那么eval()会执行声明。

a. 原型是一个对象,其他对象可以通过它实现属性继承。

a. 因为每个对象和原型都有一个原型(注:原型也是一个对象),对象的原型指向对象的父,而父的原型又指向父的父,我们把这种通过原型层层连接起来的关系撑为原型链。

b. 这条链的末端一般总是默认的对象原型。

4.30、画出此对象的内存图

jQuery是一个js库,主要提供的功能是选择器,属性修改和事件绑定等等。

jQuery UI则是在jQuery的基础上,利用jQuery的扩展性,设计的插件。提供了一些常用的界面元素,诸如对话框、拖动行为、改变大小行为等等

4.32、jQuery的源码看过吗?能不能简单说一下它的实现原理?

一个强悍的dom元素查找器($),插件式编程接口(jQuery.fn),以及插件初始化的”配置”对象思想

如果当前浏览器支持window.JSON,那就直接调用这个对象中的方法。

b. msg出现了声明提升,可以查看4.25的例子

c. next中出现了隐式的类型转换

4.35、请说明下下面代码的执行过程

a. JavaScript引擎是单线程运行的,浏览器无论在什么时候都只且只有一个线程在运行JavaScript程序

b. setTimeout是异步线程,需要等待js引擎处理完同步代码(while语句)之后才会执行,while语句直接是个死循环,js引擎没有空闲,不会执行下面的alert,也不会插入setTimeout。我在chrome中执行在线代码,最后浏览器是终止死循环执行alert。

c. JavaScript的工作机制是:当线程中没有执行任何同步代码的前提下才会执行异步代码,setTimeout是异步代码,所以setTimeout只能等js空闲才会执行,但死循环是永远不会空闲的,所以setTimeout也永远不会执行。

4.36、输出今天的日期,以YYYY-MM-DD的方式,比如今天是2014年9月26日,则输出

Function.caller返回一个对函数的引用,该函数调用了当前函数。

}

7.1 一个案例引发的多表连接

7.1.1 笛卡尔积(或交叉连接)的理解

笛卡尔乘积是一个数学运算。

假设我有两个集合 X 和 Y,那么 X 和 Y 的笛卡尔积就是 X 和 Y 的所有可能组合,也就是第一个对象来自于 X,第二个对象来自于 Y 的所有可能。组合的个数即为两个集合中元素个数的乘积数。

#查询员工姓名和所在部门名称 
  • 笛卡尔积的错误会在下面条件下产生
    • 省略多个表的连接条件(或关联条件)
    • 连接条件(或关联条件)无效
    • 所有表中的所有行互相连接
  • 为了避免笛卡尔积, 可以在WHERE加入有效的连接条件。

7.2 多表查询分类讲解

分类1:等值连接vs非等值连接

拓展1:区分重复的列名

  • 多个表中有相同列时,必须在列名之前加上表名前缀。
  • 使用别名可以简化查询。
  • 列名前使用表名前缀可以提高查询效率。

需要注意的是,如果我们使用了表的别名,在查询字段中、过滤条件中就只能使用别名进行代替,不能使用原有的表名,否则就会报错。

  • 连接n个表,至少需要n-1个连接条件。

分类2:自连接vs非自连接

#练习:查询员工id,员工姓名及其管理者的id和姓名

分类3:内连接 vs 外连接

  • 内连接: 合并具有同一列的两个以上的表的行, 结果集中不包含一个表与另一个表不匹配的行

  • 外连接: 两个表在连接过程中除了返回满足连接条件的行以外还返回左(或右)表中不满足条件的行 ,这种连接称为左(或右) 外连接。没有匹配的行时, 结果表中相应的列为空(NULL)。

    • 如果是左外连接,则连接条件中左边的表也称为主表,右边的表称为从表
    • 如果是右外连接,则连接条件中右边的表也称为主表,左边的表称为从表

  • 使用JOIN...ON子句创建连接的语法结构:

利用Union关键字,可以给出多条SELECT语句,并将它们的结果组合成单个结果集。合并时,两个表对应的列数
和数据类型必须相同,并且相互对应。各个SELECT语句之间使用UNION或UNION ALL关键字分隔。

UNION 操作符返回两个查询的结果集的并集,去除重复记录。

UNION ALL操作符返回两个查询的结果集的并集。对于两个结果集的重复部分,不去重。

如果明确知道合并数据后的结果数据不存在重复数据,或者不需要去除重复的数据,则尽量使用UNION ALL语句,以提高数据查询的效率。

#实现查询结果是A∪B

# NATURAL JOIN : 它会帮你自动查询两张连接表中`所有相同的字段`,然后进行`等值连接`。
# 指定数据表里的同名字段进行等值连接,只能配合JOIN一起使用。

【强制】超过三个表禁止 join。需要 join 的字段,数据类型保持绝对一致;多表关联查询时,保证被关联的字段需要有索引。

说明:即使双表 join 也要注意表索引、SQL 性能。

返回X的符号。正数返回1,负数返回-1,0返回0
返回大于或等于某个值的最小整数
返回小于或等于某个值的最大整数
返回0~1的随机值,其中x的值用作种子值,相同的X值会产生相同的随机
返回一个对x的值进行四舍五入后,最接近于X的整数
返回一个对x的值进行四舍五入后最接近X的值,并保留到小数点后面Y位
返回数字x截断为y位小数的结果
返回x的平方根。当X的值为负数时,返回NULL

将角度转化为弧度,其中,参数x为角度值
将弧度转化为角度,其中,参数x为弧度值

返回x的正弦值,其中,参数x为弧度值
返回x的反正弦值,即获取正弦为x的值。如果x的值不在-1到1之间,则返回NULL
返回x的余弦值,其中,参数x为弧度值
返回x的反余弦值,即获取余弦为x的值。如果x的值不在-1到1之间,则返回NULL
返回x的正切值,其中,参数x为弧度值
返回x的反正切值,即返回正切值为x的值
返回两个参数的反正切值
返回x的余切值,其中,X为弧度值

返回e的X次方,其中e是一个常数,2.045
返回以e为底的X的对数,当X <= 0 时,返回的结果为NULL
返回以10为底的X的对数,当X <= 0 时,返回的结果为NULL

返回f1进制数变成f2进制数

返回字符串S中的第一个字符的ASCII码值
返回字符串s的字节数,和字符集有关
将字符串str从第idx位置开始,len个字符长的子串替换为字符串replacestr
用字符串b替换字符串str中所有出现的字符串a
将字符串s的所有字母转成大写字母
将字符串s的所有字母转成小写字母
返回字符串str最左边的n个字符
返回字符串str最右边的n个字符
用字符串pad对str最左边进行填充,直到str的长度为len个字符,实现右对齐效果
用字符串pad对str最右边进行填充,直到str的长度为len个字符,实现左对齐效果
去掉字符串s左侧的空格
去掉字符串s右侧的空格
去掉字符串s开始与结尾的空格
去掉字符串s开始与结尾的s1
去掉字符串s开始处的s1
去掉字符串s结尾处的s1
返回str重复n次的结果
比较字符串s1,s2的ASCII码值的大小
返回指定位置的字符串,如果m=1,则返回s1,如果m=2,则返回s2,如果m=n,则返回sn
返回字符串s在字符串列表中第一次出现的位置
返回字符串s1在字符串s2中出现的位置。其中,字符串s2是一个以逗号分隔的字符串

注意:MySQL中,字符串的位置是从1开始的。

8.3 日期和时间函数

8.3.1 获取日期、时间

返回当前日期,只包含年、月、日
返回当前时间,只包含时、分、秒
返回当前系统日期和时间
返回UTC(世界标准时间)日期
返回UTC(世界标准时间)时间

8.3.2 日期与时间戳的转换

将时间date以UNIX时间戳的形式返回。
将UNIX时间戳的时间转换为普通格式的时间

8.3.3 获取月份、星期、星期数、天数等函数

返回周几,注意,周1是0,周2是1,。。。周日是6
返回日期对应的季度,范围为1~4
返回日期是一年中的第几天
返回日期位于所在月份的第几天
返回周几,注意:周日是1,周一是2,。。。周六是7

8.3.4 日期的操作函数

返回指定日期中特定的部分,type指定返回的值
返回日期在一年中的第几个星期
返回日期在一年中的第几个月
返回日期在一年中的第几个季度

8.3.5 时间和秒钟转换的函数

将 time 转化为秒并返回结果值。转化的公式为: 小时*3600+分钟*60+秒
将 seconds 描述转化为包含小时、分钟和秒的时间

8.3.6 计算日期和时间的函数

返回与给定日期时间相差INTERVAL时间段的日期时间

上述函数中type的取值:

返回time1加上time2的时间。当time2为一个数字时,代表的是秒 ,可以为负数
返回time1减去time2后的时间。当time2为一个数字时,代表的是秒,可以为负数
返回从0000年1月1日起,N天以后的日期
返回日期date距离0000年1月1日的天数
返回date所在月份的最后一天的日期
针对给定年份与所在年份中的天数返回一个日期
将给定的小时、分钟和秒组合成时间并返回
返回time加上n后的时间

8.3.7 日期的格式化与解析

按照字符串fmt格式化日期date值
按照字符串fmt格式化时间time值
返回日期字符串的显示格式
按照字符串fmt对str进行解析,解析为一个日期

上述非GET_FORMAT函数中fmt参数常用的格式符:

两位数字表示月份(01,02,03。。。)
两位数字表示月中的天数(01,02...)
两位数字表示小数,24小时制(01,02..) 两位数字表示小时,12小时制(01,02..)
数字形式的小时,24小时制(1,2,3) 数字形式表示小时,12小时制(1,2,3,4....)
两位数字表示分钟(00,01,02)
一周中的星期名称(Sunday...)
以数字表示年中的第几周,(1,2,3。。)其中Sunday为周中第一天
以数字表示年中的第几周,(1,2,3。。)其中Monday为周中第一天

8.5 加密与解密函数

返回字符串str的加密版本,41位长的字符串。加密结果不可逆,常用于用户的密码加密。在mysql8.0中已弃用。
返回字符串str的md5加密后的值,也是一种加密方式。若参数为NULL,则会返回NULL
从原明文密码str计算并返回加密后的密码字符串,当参数为NULL时,返回NULL。 SHA加密算法比MD5更加安全 。

返回当前MySQL的版本号
返回当前MySQL服务器的连接数
返回MySQL命令行当前所在的数据库
返回当前连接MySQL的用户名,返回结果格式为“主机名@用户名”
返回字符串value自变量的字符集
返回字符串value的比较规则

返回对数字value进行格式化后的结果数据。n表示四舍五入后保留到小数点后n位
将value的值进行不同进制之间的转换
将以点分隔的IP地址转化为一个数字
将数字形式的IP地址转化为以点分隔的IP地址
将表达式expr重复执行n次。用于测试MySQL处理expr表达式所耗费的时间

可以对数值型数据使用AVG 和 SUM 函数。

可以对任意数据类型的数据使用 MIN 和 MAX 函数。

  • COUNT(*)返回表中记录总数,适用于任意数据类型

其实,对于MyISAM引擎的表是没有区别的。这种引擎内部有一计数器在维护着行数。

可以使用GROUP BY子句将表中的数据分成若干组

在SELECT列表中所有未包含在组函数中的列都应该包含在GROUP BY子句中

9.2.2 使用多个列分组

使用WITH ROLLUP关键字之后,在所有查询出的分组记录之后增加一条记录,该记录计算查询出的所有记录的总和,即统计记录数量。

当使用ROLLUP时,不能同时使用ORDER BY子句进行结果排序,即ROLLUP和ORDER BY是互相排斥的。

  • 非法使用聚合函数 : 不能在 WHERE 子句中使用聚合函数。

当过滤条件中有聚合函数时,则此过滤条件必须声明在HAVING中。

当过滤条件中没有聚合函数时,则此过滤条件声明在WHERE中或HAVING中都可以。但是,建议大家声明在WHERE中。

先筛选数据再关联,执行效率高 不能使用分组中的计算函数进行筛选
可以使用分组中的计算函数 在最后的结果集中进行筛选,执行效率较低

WHERE 多表的连接条件 AND 不包含组函数的过滤条件 HAVING 包含组函数的过滤条件 WHERE 不包含组函数的过滤条件 AND/OR 不包含组函数的过滤条件 HAVING 包含组函数的过滤条件 #(1)from:从哪些表中筛选 #(2)on:关联多表查询时,去除笛卡尔积 #(3)where:从表中筛选的条件 #(5)having:在统计结果中再次筛选

你需要记住 SELECT 查询时的两个顺序:

1. 关键字的顺序是不能颠倒的:

在 SELECT 语句执行这些步骤的时候,每个步骤都会产生一个虚拟表,然后将这个虚拟表传入下一个步骤中作为输入。

需要注意的是,这些步骤隐含在 SQL 的执行过程中,对于我们来说是不可见的。

SELECT 是先执行 FROM 这一步的。在这个阶段,如果是多张表联查,还会经历下面的几个步骤:

  1. 通过 ON 进行筛选,在虚拟表 vt1-1 的基础上进行筛选,得到虚拟表 vt1-2;

  2. 添加外部行。如果我们使用的是左连接、右连接或者全连接,就会涉及到外部行,也就是在虚拟表 vt1-2 的基础上增加外部行,得到虚拟表 vt1-3。

当然如果我们操作的是两张以上的表,还会重复上面的步骤,直到所有表都被处理完为止。这个过程得到是我们的原始数据。

当我们拿到了查询数据表的原始数据,也就是最终的虚拟表vt1,就可以在此基础上再进行WHERE阶段 。在这个阶段中,会根据 vt1 表的结果进行筛选过滤,得到虚拟表vt2

然后进入第三步和第四步,也就是GROUPHAVING阶段 。在这个阶段中,实际上是在虚拟表 vt2 的基础上进行分组和分组过滤,得到中间的虚拟表vt3vt4

当我们完成了条件筛选部分之后,就可以筛选表中提取的字段,也就是进入到SELECTDISTINCT阶段 。

首先在 SELECT 阶段会提取想要的字段,然后在 DISTINCT 阶段过滤掉重复的行,分别得到中间的虚拟表vt5-1vt5-2

当我们提取了想要的字段数据之后,就可以按照指定的字段进行排序,也就是ORDER BY阶段 ,得到虚拟表vt6

最后在 vt6 的基础上,取出指定行的记录,也就是LIMIT阶段 ,得到最终的结果,对应的是虚拟表vt7

当然我们在写 SELECT 语句的时候,不一定存在所有的关键字,相应的阶段就会省略。

同时因为 SQL 是一门类似英语的结构化查询语言,所以我们在写 SELECT 语句的时候,还要注意相应的关键字顺序,所谓底层运行的原理,就是我们刚才讲到的执行顺序。

10.1 需求分析与问题解决

题目:谁的工资比Abel高?

10.1.2 子查询的基本使用

  • 子查询(内查询)在主查询之前一次执行完成。
  • 子查询的结果被主查询(外查询)使用 。
  • 将子查询放在比较条件的右侧
  • 单行操作符对应单行子查询,多行操作符对应多行子查询

我们按内查询的结果返回一条还是多条记录,将子查询分为单行子查询多行子查询

我们按内查询是否被执行多次,将子查询划分为相关(或关联)子查询不相关(或非关联)子查询

题目:查询最低工资大于50号部门最低工资的部门id和其最低工资

10.2.5 子查询中的空值问题

需要和单行比较操作符一起使用,和子查询返回的某一个值比较
需要和单行比较操作符一起使用,和子查询返回的所有值比较
实际上是ANY的别名,作用相同,一般常使用ANY

题目:查询平均工资最低的部门id

MySQL中聚合函数是不能嵌套使用的。

10.4.1 相关子查询执行流程

如果子查询的执行依赖于外部查询,通常情况下都是因为子查询中的表用到了外部的表,并进行了条件关联,因此每执行一次外部查询,子查询都要重新计算一次,这样的子查询就称之为关联子查询

方式二:在 FROM 中使用子查询

结论:在SELECT中,除了GROUP BY 和 LIMIT之外,其他位置都可以声明子查询!

  • 关联子查询通常也会和 EXISTS操作符一起来使用,用来检查在子查询中是否存在满足条件的行。
  • 如果在子查询中不存在满足条件的行:
  • 如果在子查询中存在满足条件的行:
  • NOT EXISTS关键字表示如果不存在某种条件,则返回TRUE,否则返回FALSE。

题目中可以使用子查询,也可以使用自连接。一般情况建议你使用自连接,因为在许多 DBMS 的处理过程中,对于自连接的处理速度要比子查询快得多。

}

我要回帖

更多关于 代码名词解释 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信