三十七、使用help来学习下面的数据类型(建立对应类型的列、插入数据、显示数据)
1、整数:int
2、非负数:unsigned无符号即非负数---e.g:int unsigned
3、小数:dec
4、浮点数以及科学计数法:float、double
如果FLOAT数据在插入的时候,要使用NeM(科学计数法)的方式插入时:
比如
5e2 就是5*10的2次方
5e-2就是5*10 的-2次方
4e-1+5.1e2 就是510.4
5、字符串:varchar
6、布尔:bool、boolean---synonyms(同义词):TINYINT(1)
7、位:bit
如何使用16进制常量:hex()
如何使用2进制常量:bin()
date类型以及STR_TO_DATE函数
time类型以及STR_TO_DATE函数
dateime数据类型以及标准写法、STR_TO_DATE函数
date和time显示方式以及date_format函数
三十八、时区
1、查看操作系统时区、数据库时区
查看操作系统时区:
shell> cat /etc/sysconfig/clock
ZONE="Asia/Shanghai"
shell> ls /usr/share/zoneinfo
……
MySQL> show variables like 'system_time%'; #查看MySQL系统时区
mysql> show variables like 'time_zone%'; #查看数据库时区
2、修改数据库时区为东八区,去掉数据库时区对os时区的依赖(查看官方文档)
加载系统时区:将Linux时区导入到数据库中
shell> mysql_tzinfo_to_sql /usr/share/zoneinfo |mysql -uroot -p123 mysql
mysql> set @@global.time_zone='Asia/Shanghai';
修改数据库时区为东八区,同时在参数文件中进行修改,永久保存
3、时区在什么时候有用:
如果数据库里面没有timestamp这个数据类型,那么时区参数没有意义!
你如何确认你的数据库里面是否有timestamp类型的列?
mysql> select table_name,column_name,data_type -> from information_schema.columns -> where data_type='timestamp';
……
时区原理描述:insert过程和select过程的描述:相对应的0时区的转换
4、时区的正确实践(timestamp)
insert以前:你的values对应的时间到底是哪个时区,然后设置set @@session.time_zone为对应的时区
select获取以前:你想得到什么时区的时间,就设置set @@session.time_zone为对应的时区
三十九、字符集
1、查看服务器的字符集
mysql> show variables like 'character_set_server';
2、查看数据库字符集
mysql> show variables like 'character_set_database';
一般在数据库实现字符集即可,表和列都默认采用数据库的字符集
gbk
utf8
3、查看表的字符集、查看列的字符集
mysql> show create table tbl_name;
4、字符集原理描述、字符集正确实践
对于insert过程描述、对于select过程描述
①对于insert来说,character_set_client、character_set_connection相同,而且正确反映客户端使用的字符集
②对于select来说,character_set_results正确反映客户端字符集
③数据库字符集取决于我们要存储的字符类型
④字符集转换最多发生一次,这就要求character_set_client、character_set_connection相同
⑤所有的字符集转换都发生在数据库端
总述:
1)建立数据库的时候注意字符集(gbk、utf8)
2)连接数据库以后,无论是执行dml还是select,只要涉及到varchar、char列,就需要设置正确的字符集参数:
character_set_client、character_set_connection、character_set_results
5、客户端字符集如何来理解?
取决于客户端工具
shell> mysql -uroot -p123456 -hserver_host -P3306
mysql工具本身没有字符集,因此客户端字符集取决于工具所在的os的字符集(windows:gbk、linux:utf8)
sqlyog工具本身带字符集,此时客户端os字符集就没有意义
6、如何判断字符集出现了问题?
所有设置都正确,但是查询到的还是乱码,这就是出现问题了
四十、如何识别变量参数、状态参数status var
show variables……
show status……
识别判断都是查看官方文档System Var、Status Var
四十一、如何识别动态参数、静态参数
动态参数dynamic:Yes
静态参数dynamic:No
四十二、对于动态参数如何设置,如何判断动态参数是否可以在全局级别或者会话级别修改
1、set
2、修改参数文件/etc/my.cnf:弊端是需要重启才能生效(很少用)
判断:参考官方文档Option/Variable Summary,通过Var scope来进行判断动态参数的全局global、both
四十三、对于静态参数如何修改
静态参数,在整个实例声明周期内都不得进行更改,就好似是只读的;
一般静态参数都是在配置文件中修改/etc/my.cnf,当然静态参数能否写入配置文件还要看官方文档对该参数的Option File的描述Yes与否。
四十四、掌握@@、@的区别
1、@@var_name表示的系统变量
根据系统变量的作用域可分:全局变量、会话变量
2、@var_name表示的用户变量
①用户变量和数据库连接有关,连接后声明变量,连接断开后,自动消失;
②select一个没有赋值的用户变量,返回NULL,也就是没有值;
Mysql的变量类似于动态语言,变量的值随所要赋的值的类型而改变。
四十五、set @@session.和set @@global.的生效时间
对于一个新建立的连接,只有全局变量,会话变量还不存在,这个时候会从全局变量拷贝过来。
1、set @@session.:只对当前连接起作用
2、set @@global.:对全局变量的修改会影响到整个服务器
注意:set系统变量时,不带作用域修饰,默认是指会话作用域;
(特别注意,有些系统变量不带作用域修饰,无法设置,因此最好都带上作用域设置系统变量)。
四十六、动态参数最佳实践
1、尽量先进行会话级别的设置set @@session,确认生效而且效果不错以后,再进行全局设置,如果需要马上生效,杀掉所有的会话:
mysql> select concat('kill ',conn_id,';') from sys.session;
2、确认没有问题以后,修改参数文件,下次系统启动一直生效。
四十七、select书写技巧
1、确认需要访问数据来自于哪几张表
from来自某张表或者某几张表
join添加某张表
on表连接条件
记住一点:每关联一个表就需要加上对应的on条件(on条件就是主外键条件)
2、通过where条件来过滤数据
3、确认需求里面是否有分组聚合的含义
分组:group by
聚合:聚合函数
聚合条件过滤:having
4、是否需要排序
order by
四十八、MySQL内置函数(将列出的常见的一些函数熟悉过一遍)
1、内置函数的多少是一个数据库是否成熟的标志
2、学会使用help Functions学习和使用函数(重点!!!!!!!!!!!)
3、常用函数要过一遍
①日期时间相关的函数
CURDATE、DATEDIFF、DATE_FORMAT、DAYOFWEEK、LAST_DAY、EXTRACT、STR_TO_DATE
②比较操作符要求都过一遍,help Comparison operators;
③流程控制行数help Control flow functions;
④加密函数help Encryption Functions;
只需要看看decode、password两个函数即可
⑤信息获取函数help Information Functions;
通过这些函数可以知道一些信息,过一遍即可
⑥逻辑操作符help Logical operators;
!、and、or,这些常用的要过一遍
⑦杂项函数help Miscellaneous Functions;
简单浏览一下里面的函数,对于名字有个印象即可
⑧数值函数help Numeric Functions;
使用数据库来进行数学运算的情况不多,常用的加减乘除、TRUNCATE、ROUND
⑨字符串函数help String Functions;
CONCAT、CONCAT_WS、CAST、FORMAT、LIKE、REGEXP、STRCMP、TRIM、SUBSTRING、UPPER,其它函数名字过一遍
4、聚合分组函数的使用了解
①select后面得列或者出现在group by中,或者加上聚合函数
select c1,c2,sum(c3),count(c4) from t1 group by c1,c2;
②help contents;
查看聚合函数help Functions and Modifiers for Use with GROUP BY;
AVG、MAX、MIN、SUM、COUNT、COUNT DISTINCT、GROUP_CONCAT、BIT_AND、BIT_OR、BIT_XOR
四十九、隐式类型转换,要避免隐式类型转换
1、最常用的几个数据类型:数字、字符串、日期时间
2、字符串里面可以存放数字和日期,但是在设计表的时候,要注意不要将日期和数字列设计成字符串列
3、对于字符串列的比较,一定要加上引号:
mysql> select * from t where name_phone='1301110001';
五十、limit使用很频繁,注意其使用方法
1、limit使用的场合
从结果集中选取最前面或最后面的几行
2、limit配合order by使用
3、MySQL5.7 doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'
五十一、in、not in、exists、not exists、left join、distinct join互相转换
1、in和exists可以互相转换
select * from players a where a.teamno in (select teamno from team where teamname='骑士队'); select * from players a where exists (select 1 from team b where a.teamno=b.teamno and b.teamname='骑士队');
2、not in和not exists可以互相转换
3、not in、not exists可以转换成left join
select * from 学生信息 a where a.stuno not in (select stuno from 选课信息表);
select * from 学生信息 a
left join 选课信息 b
on a.stuno=b.stuno
where b.成绩 is null;
4、in、exists可以转换成distinct join
select * from 学生信息 a where a.stuno in (select stuno from 选课信息表 b);
select * from 学生信息 a where exists (select 1 from 选课信息 b where a.stuno=b.stuno);
select distinct a.*
from 学生信息
join 选课信息 b
on a.stuno=b.stuno;
五十二、连接的具体使用含义
1、理解为什么会出现表连接:查询的列来自于多个表
select 列
from ..
where 列
group by 列
having 列
order by 列
limit x
2、理解表连接的书写方式
join一个表、on一个条件
3、理解表连接的注意条件
①两个表要连接一定要存在主外键关系(有可能需要第三张表协助关联)
实际上存在外键约束
存在外键列,但是没有外键约束
②防止扇形陷阱(两个表需要关联,但是没有直接主外键,借助第三个表进行关联,但是存在扇形问题,此时不能借助第三个表进行关联)
示例:学院表、专业表、学生表
学院实体和专业实体之间是一对多的联系;
学院实体和学生实体之间也是一对多的联系;
而学生和专业之间没有联系;
如果学生和专业通过学院表进行关联,就会出现扇形问题。
4、外连接:左外连接、右外连接
外连接是为了防止出现某一个表的数据被遗漏
开发人员非常喜欢使用外连接.
五十三、子查询
1、子查询可能出现的位置
①select from之间可能会出现子查询
②from后面
③join后面可能会出现子查询
④where后面可能会出现子查询
⑤having后面可能会出现子查询
2、尽最大程度的不要使用子查询
3、相关子查询、无关子查询
相关子查询特别容易出现在select from之间、where后面
相关子查询不能独立执行,子查询执行次数取决于父查询返回的行数
无关子查询可以独立执行,子查询执行一次
五十四、子查询出现的场合
1、where中出现的子查询,一般可使用表连接进行改写
①select 列(涉及到A表,没有涉及到B表)
②where 条件(涉及到B表)
2、from后面的子查询
①对于取出来的数据再次进行复杂的处理
例如分组聚合、having条件、where条件等
②对一个结果集再次进行复杂的查询
意味着我们取数据的这个过程中,对数据进行处理的力度很复杂
3、select from之间的子查询
对于返回的每一行数据,select和from之间的子查询都要执行一次
select后面的列要进行复杂的处理,如果这个处理涉及到另外一个表,若这个表很可能没有出现在from和join里面,则进行子查询:
示例:将每一个同学的成绩列出来,同时计算他的成绩和本组平均成绩的差距
select 学生成绩, 学生成绩-(select avg(成绩) from 选课表 a where a.组ID=b.组ID) from 选课表 b;