本文是学习 Mysql必知必会 后的笔记
学习之前需要创建一个数据库,然后导入下面两个mysql脚本
当然了,连接上了,会显示一大串的英语什么的,这里就说到几个会用上的把
查看当前用户或指定用户的权限
*.* : 中第一个*是哪个数据库,如果为*指所有数据库,第二个*指选中库的哪个表,为*指所有表 WITH GRANT OPTION : 这个选项表示该用户可以将自己拥有的权限授权给别人查看用于创建数据库的命令
--\G: 垂直显示, 用于显示得更加清洗,可不加注意:除非你确实是需要表中的所有数据,否则最好不要使用 * 通配符, 使用 * 会检索出所有数据,这会降低检索的性能。当然了,使用 * 通配符也可以检索出来未知的列
当然了去掉重复的数据可以使用下面的命令
-- distinct不能多列使用,除非多列检测出来的一行或者多行的组合有重复,不然就都会显示出来
y : 开始位置后的行数 -- 这里x默认为0,即开始的 第0行 到即到它后面的 2行 -- 这里还有另外一种写法
这样做的目的是限制唯一的列名
排序的数据在很多场合可能都会用上,可以下面下面的方式进行检索排序
-- order by 同时也可以按照非检索的列名进行排序,通常不这样做只要满足其中的一种条件 |
-- 应为空值具有特殊含义, 所以这里用的是 is
-- 这里需要的注意的是在进行组合运算的时候添加个 () 不会有错的
-- 如果不添加 () ,下面的例子就会出现很奇怪的事
上面的句子其实是可以这么化简的
对上面的 vend_in 筛选的结果取反
或者我想搜索一个文本中包含什么的
通配符确实很好用,但是这个开销会比前面的检索方式慢太多
空格和制表(同[\\t]) |
任意数字(同[0-9]) |
任意小写字母(同[a-z]) |
任意大写字母(同[A-Z]) |
1个或多个匹配(等于 {1,}) |
0个或1个匹配(等于 {0,1}) |
n 是一个非负整数。匹配确定的 n 次 |
使用 concat() 函数用于把多个列拼接起来
上面输出的表抬头是不是感觉好丑,那么就可以使用 as
去掉字符串 s 开始和结尾处的空格 |
返回字符串 s 的前 n 个字符 |
将字符串 s 的所有字母变成小写字母 |
从字符串 s 中获取 s1 的开始位置 |
返回字符串 s 的后 n 个字符 |
去掉字符串 s 开始处的空格 |
去掉字符串 s 结尾处的空格 |
计算起始日期 d 加上 n 天的日期 |
n 是一个时间表达式,时间 t 加上时间表达式 n |
从日期或日期时间表达式中提取日期值 |
计算起始日期 d 加上一个时间段后的日期 |
按表达式 f的要求显示日期 d |
返回日期值 d 的日期部分 |
计算日期 d 是本月的第几天 |
日期 d 今天是星期几,1 星期日,2 星期一,以此类推 |
计算日期 d 是本年的第几天 |
返回日期d中的月份值,1 到 12 |
提取传入表达式的时间部分 |
求余弦值(参数是弧度) |
返回 x 除以 y 以后的余数 |
返回离 x 最近的整数 |
求正弦值(参数是弧度) |
求正切值(参数是弧度) |
聚集函数(aggregate function)运行在行组上,计算和返回单个值的函数
使用 with rollup 关键字,可以得到每个分组以及每个分组汇总级别的值
检索总订单价格大于50的订单号和总计订单价格在按照总计订单价格排序输出
子查询:即嵌套在其它查询中的查询
现在需要列出订购物品TNT2的所有客户
现在呢,我们就可以把这三个查询合并为一个查询
像上面的语句可能不是最有效率的方式,可以在后面参考(联结表)
假如需要显示customers表中每个客户的总订单数。 订单与相应的客户ID存储在orders表中
Mysql联结的表越多会导致性能的下降
如果上面的句子删除掉 where 就会出现 笛卡尔积,这并非是我们需要的数据
此联结与上面的等值接连一致,唯一不同的是这里使用关键子 inner join ... on 进行限定
11.0 中出现的问题 现在需要列出订购物品TNT2的所有客户 即可以通过下面的方式处理
这条语句和上面的查询结果一致,但使用了 别名
自联结: 同一张表的联结
许多联结将一个表中的行与另外一个表中的行进行关联。但有时会需要包含没有关联的那些行,这就用到了外联结
检索所有客户及客户所下的订单数
检索所有客户及客户所下的订单数,使用左外联结来包含所有客户,甚至包含那些没有下订单的客户
13.1 的例子中,如果两条语句单独查询共计显示9条数据,而使用union却只显示了8行,
这是因为union默认会去除掉重复的行,不然不祥去重,可以使用 union all
上面的查询看似只对第二条select语句进行排序,实则是对所有的select语句进行排序,
并不是所有的引擎都支持全文索引。两个最常使用的引擎为MyISAM和InnoDB,前者支持全文本索引,而后者不支持
前面所提到的 like 和 regexp 都能实现这个功能,但是会有如下的的限制
注意:不要在导入数据时使用 fulltext,可以先导入数据后在修改表
传递给Match()的值必须与fulltext定义中的相同,如果指定多个列,则必须列出它们(且次序正确)
Against() 指定要使用的搜索表达式 - 不区分大小写
查看全文搜索的排序如何工作的
查询扩展用来放宽所返回的文本搜索结果的范围
在使用查询扩展的时候Mysql对数据和索引进行两边扫描完成搜索
-- 在在上的例子中没有使用查询扩展的时候只能返回两行
-- 现在使用返回了6行
即使没有定义fulltext索引,也可以使用它哟
-- 匹配包含 heavy 但不包含任意一repo开始的词
将词分组成子表达式(允许将其包括,排除,排序等作为一个组) |
定义一个短语(与单个单词列表相反,整个短语匹配包含或排除) |
使用关键字 low_priority 降低insert语句降低优先级,提升查询性能
-- 不指定具体字段,默认把字段全部插一遍
-- 一次插入一条数据, 推荐使用
-- 一次插入多条数据, 推荐使用
-- 可以具体指定某个字段进行插入
-- 不加条件有风险,一改全改,一定加where
-- 删除所有数据,一删全删,一定加where
唯一值,加入唯一索引(索引相当于字典目录,索引的提出是为了加快速度,一味地乱加索引不会提高查询效率) |
常见mysql数据类型
固定长度非二进制字符串 | |
非常小的非二进制字符串 | |
中等大小的非二进制字符串 | |
枚举类型,只能有一个枚举字符串值 | 1或2个字节,取决于枚举值的数目 (最大值为65535) |
一个设置,字符串对象可以有零个或 多个SET成员 | 1、2、3、4或8个字节,取决于集合 成员的数量(最多64个成员) |
表级锁 : 只要有一个线程执行修改表中的相关操作,就会上锁,其他线程默认等待;
行级锁 : 针对于当前表中的这条记录,这一行进行上锁,其他数据仍然可以被其他线程修改,实现高并发,高可用;
事务处理: 执行sql语句时,必须所有的操作全部成功,才最终提交数据,有一条失败,直接回滚,恢复到先前状态
MEMORY: 同MyISAM,唯一不同的是把数据放在内存中,临时缓存;
一般用于同步主从数据库;(放在主数据库和从数据库之间的一台服务器;)
关于单片机的N多问题
HOLTEK各类单片机的使用手册下载地址:
第四阶段是依靠实验板,学习掌握单片机的组合语言指令系统和简单编程。同时和前面所学硬体知识结合组装,起到主学软体,巩固硬体的双重作用。开始时可用别人编的简单程式在实验板上进行验证、分析,主要是熟悉该学习方法,在应用方面主要针对单片机I/O各项介面的使用,如A/D,D/A,PWM输出口的应用,LCD与VFD的控制,以及如何规范各项串列输出入口的通讯协定等,对其所控制的各项元器件须先分析驱动能力,如电流电压问题等。
90. 用一个12M的晶振,怎么能实现480MB/S的数据传输率呢?
答:在集成了PLL的12MHz的晶体振荡器即可达到480MHz,相位锁定回(环)路(Phase Locked Loop,PLL)又被称为相锁回路或锁相回路,其原理是经由闭回路自动控制系统的反馈作用,驱使另一个动作不精准、频率变动量高的作用元件的动作频率,使其能快速且一直保持稳定地与正确的频率参考源达到同相甚至是同相又同频的状态,如此即是相位锁定(Phase Locked)的状态,我们若以电路外部精准、频率变动量极低的振荡频率源作为基准参考,来驱使电路内部精准、频率变动量极低的振荡频率源,使其达成相位锁定的状态,即可用来作为通讯系统的调变/解调电路。
一般480MB/S的数据传输率是运用在USB 2.0,当通用序列汇流排(Universal Serial Bus)规格于1996年1月发表时,代表业界成功研发出一套连结中低速频宽的周边元件与个人电脑之间的低成本串连管道,但是仍缺乏支援高速宽频的应用能力。于2000年4月,USB再度推出全新一代的USB 2.0版本的技术规格,可将讯号传输速度提升整整40倍,由原先USB 1。0的最高12MHz的速度至现今USB 2。0的高速480MHz,并扩增了更先进的功能,如新型的传输装置以提高频宽使用率与增加传输装置及主机控制器之间的附加功能。
针对实际上可供使用的频宽来说,资料的传输频宽速度由原先的1 Mbytes/sec左右提高至50 Mbytes/sec,这样一个大幅度的频宽增加主要归功于USB 2.0规格运用了微讯框(micro-frame)、可容纳更多资讯的传输封包、更频繁的传输次数、分割式传输处理(split transaction)、以及一些新的执照(token)等崭新技术。USB 2.0装置的架构同时增加了两项全新的描述元(descriptor),即装置认可(Device Qualifier)与其他的速度配置(Speed Configuration),可用来明确标示出资料传输装置在其它运作速度下的功能表现。
针对电子规格的变动:在主机与新型的高速控制器之间的连结则重新定义,以支援现今高达480MHz的传输效能表现。新的高速拓璞新的标准采用90W 的差分阻抗(differential characteristic impedance)搭配差分电流模式讯号(differential current mode signaling),并采用相同的NZRI编码机制(NZRI
91. 在单片机程序设计中遇,从被嵌套的高级中断中如何强行返回到主程序。子程序返回指令在恢复堆栈后可不可以用跳转指令替代返回到主程序中?
答:如果是51系列,那直接用POP指令就可以实现强行返回;如果是用RISC结构的单片机(HOLTEK 单片机是RISC结构的),那一般都是硬件堆栈,没有PUSH和POP指令,所以子程序调用和返回指令必须成对使用。
92. 对单片机的速度,有何要求?Holtek的单片机能符合该项应用吗?
答:目前HOLTEK的单片机速度最高为8MHz,一条指令执行时间为0。5us,以这样的速度,可以满足大多数项目的开发;不知你说的具体是什么项目。目前HOLTEK单片机主要有OTP和Mask两种,将来会推出Flash的单片机;但HOLTEK的开发系统很完善,在开发阶段,HOLTEK还可以适当提供免费样片,相对来说,开发成本并不会比用Flash来得高。
93. PSoC是一种功能灵活和强大的软硬件嵌入式开发系统,能否用PSoC代替部分单片机系统呢?
答:在一般在嵌入式系统的应用中,都可能需要使用几十种甚至是更多的类比或数位周边元器件。熟悉MCU开发的工程师们都知道,在MCU的开发过程中,最需要花时间和精力的就是元器件的选购,以及元器件相容性方面的考虑。目前在市场上有成千上万不同种周边元器件,设计人员要想从中寻找到适合自己应用的元器件是一件令人头痛的事情。因此,设计工程师的理想方案似乎是采用定制的SoC晶片,但是如果采用定制微控制器、ASIC和PLD器件,一方面价格比较昂贵,另一方面需要设计人员具有专门的设计技能。因此,研制一个高效率、周边元器件可嵌入配置的、低功耗的8位微控制器是很有必要的。
MicroSystems公司在最近推出的新一代功能强大的8位元可配置的嵌入式单片机。该系列单片机与传统单片机的根本区别在于其内部集成的数位和类比block模组,工程师可以根据不同设计要求调用不同的数位和类比block模组,完成晶片内部的功能设计;实现使用一块晶片就可以配置成具有多种不同周边元器件的微控制器,建立一种可配置嵌入式微控制器;用以实现从确定系统功能开始,到软/硬体划分,并完成设计的整个过程。因此,PSoC能够适应非常复杂的即时控制需求,使用它进行产品开发可以大大提高开发效率,降低系统开发的复杂性和费用,同时增强系统的要可靠性和抗干扰能力;因此,它特别适用于各种控制和自动化领域。所以PSoC的动态配置能力给开发者提供了快速方便的编程和开发方法,同时也为单片机的应用开拓了更大的空间。因此利用片内集成的闪速记忆体可以降低产品开发成本,缩短产品开发周期。因此,此MCU结构具有广阔的应用推广前景。
94. 单片机对modem要进行哪些初始化操作?
答:一般单片机的MODEM通讯必须要有两个背景知识,一个是AT命令集,另一个是通用非同步接收发送器(UART)。
下面介绍我通讯程式例子中涉及到的AT命令。
Dn:拨号命令。该命令使MODEM立即进入摘机状态,并拨出跟在后面的号码。D命令是基本的拨号命令,它受到其他命令的修饰可构成MODEM何时拨号以及如何拨号等操作。
T:音频拨号。例如,ATDT8886666,其中8886666为电话号码。
P:脉冲拨号。例如,ATDP8886666,其中8886666为电话号码。
,:标准暂停。我们常常碰到拨打外线电话时需要暂停一下,等听到二次拨号音(外线)之后才能再拨后续的号码。缺省时暂停时间为2s(秒),它由S8寄存器指定。
Sn:表示MODEM内部的寄存器。
S0:自动回应。如果要求MODEM具有自动回应特性,则应该预先将MODEM的S0寄存器设置为非0。
S8:逗号拨号修饰符的暂停时间。该寄存器决定了当MODEM在拨号中遇到逗号(,)时应该暂停的时间。
l 通用非同步接收发送器UART
深入理解UART内部结构以及内部寄存器各位的含义,详细了解资料发送和接收的过程,有助于编写出高效、稳定的程式。一般介绍编写基本通讯程式需要知道的寄存器。实际的ADDRESS由具体接线决定。
l 串列传输速率除数锁存器(LSB、MSB)
在通讯之前要进行一些参数初始化,串列传输速率是首先应该考虑的一项。该寄存器是一个16位的寄存器,分为低8位(LSB)和高8位(MSB)寄存器。
另外单片机访问的是串列传输速率除数锁存器LSB/MSB。一般常用的工作频率是1。8432MHz。这个频率除以16就是串列传输速率的时钟频率,用于控制发送和接收资料的速度。
下面给出串列传输速率除数锁存器值的计算公式:
串列传输速率除数锁存器值=工作频率/(16×期望串列传输速率)=1843200/(16×期望串列传输速率)
读操作单片机访问接收缓冲寄存器(RHR),写操作单片机访问发送保持寄存器(THR)。
资料发送和接收模式的选择。常用的两种模式:FIFO和DMA。其中DMA又有两种模式DMA的模式0、DMA的模式1可供选择。
我使用的单片机是AT89C51,试过用弹出指令强行返回中断的方法,确实能够返回主程序,具体做法是:首先将堆栈中的地址弹出,然后压入主程序中新的地址,最后执行RETI指令就可以返回到该地址了。如果弹出指令执行完后直接用跳转指令而不通过RETI指令也能返回到主程序,但下次中断来时将不能再次响应。请问是从被嵌套的高优先级中断程序中怎样返回主程序,是不是还必须得通过最低级中断才能返回。要是直接返回的话,是否下次中断还能够正常响应?
答:对于51系列的单片机而言,当中端响应发生时,会将相应的优先级有效触发器职位;当退出中断时,执行RETI,单片机又自动将优先级有效触发器清0。因此,如果直接使用跳转指令从中断子程序出来的话,单片机没有清0优先级有效触发器,下一次中断发生时就不能响应了。
如果要从高优先级中断程序返回主程序的话,必须执行两条RETI指令,才可以清除高/低优先级有效触发器。具体的程序可以是:
POP ACC ;将高优先级子程序返回地址出栈
POP ACC ;将低优先级子程序返回地址出栈
PUSH DPL ;将LABLE2,即需要返回的主程序地址入栈