#第九章主要内容```1、数据库介绍、类型、特性数据库库即存放数据的仓库,而且数据是按一定的格式存放的;数据库是长期存放在计算机内、有组织、可共享的数据集合。数据库中的数据按一定的数据模型组织、描述和储存,具有较小的冗余度、较高的数据独立性和易扩展性,并可为各种用户共享。常见的数据库模型分为关系型数据库(MySQL、Oracle、SQLServer....)和非关系型数据库(文档存储数据库MongoDB;键值存储数据库Redis、Memcached、列存储数据库HBase、图形数据库Neo4J)
2、MySQL中char和varchar的区别,varchar(50)和char(50)分别代表什么意思?char和varchar都是字符串类型,char(50):定长,字符的长度为50,浪费空间,存取速度快,数据不足时,会往右填充空格来满足长度。varchar(50):变长,字符的长度为50,节省空间,存取速度慢,存储数据的真实内容,不会填充空格,且会在真实数据前加1-2bytes,表示真实数据的bytes字节数。
3、MySQL中int类型存储多少个字节?int存储4字节,最小值-2147483648,最大值21477483647
4、主键具有什么特征?唯一且非空
5、简述你对innerjoin、leftjoin、rightjoin、fulljoin的理解;多表连接查询:innerjoin:内连接,只连接匹配的行,找两张表共有的部分;leftjoin:外连接之左连接,优先显示左表全部记录,在内连接的基础上增加左表有右表没有的结果;rightjoin:外连接之右连接,优先显示右表全部记录,在内连接的基础上增加右表有左表没有的结果;fulljoin:=leftjoinonunionrightjoinon...mysql不支持fulljoin但是可以用union...全外连接,显示左右两个表全部记录,在内连接的基础上增加左表有右表没有和右表有左表没有的结果;
6、concat,group_concat函数的作用是什么?定义显示格式:concat()用于连接字符串eg:selectconcat('姓名:',name,'年薪:',salasy*12)asannual_salaryfromemployee;concat_ws()第一个参数为分隔符eg:selectconcat_ws(':',name,salary*12)asannual_salaryfromemployee;groupby与group_concat()函数一起使用selectpost,group_concat(name)asemp_membersfromemployeegroupbypost;
7、请介绍事务的实现原理;事务:用于将某些操作的多个sql作为原子性操作,一旦有某一个出现错误,即可回滚到原来的状态,从而保证数据库数据的完整性。原子性:一堆sql语句,要么同时执行成功,要么同时失败!
8、索引的本质是什么?索引有什么优点,缺点是什么?索引是帮助MySQL高效获取数据的数据结构。因此,索引的本质是一种数据结构。在数据之外,数据库系统还可以维护满足特定查找算法的数据结构,这些数据结构以某种方式指向真实数据,这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。优点:1、提高数据检索效率,降低数据库的IO成本;2、通过索引对数据进行排序,降低了数据排序的成本,降低了CPU的利用率;缺点:1、索引实际上也是一张表,索引会占用一定的存储空间;2、更新数据表的数据时,需要同时维护索引表,因此,会降低insert、update、delete的速度;
9、哪些情况下需要创建索引,哪些情况下不需要创建索引?1、主键自动创建唯一非空索引;2、频繁作为查询条件的字段应该创建索引;3、频繁更新的字段不适合简历索引,因为每次更新不仅仅更新数据表同时还会更新索引表;4、查询中经常排序的字段,可以考虑创建索引;5、如果某个字段的重复数据较多,不适合创建普通索引;
10、请分别介绍ACID代表的意思,什么业务场景需要支持事务,什么业务场景不需要支持事务?ACID,指数据库事务正确执行的四个基本要素的缩写。包含:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。一个支持事务(Transaction)的数据库,必须要具有这四种特性,否则在事务过程(Transactionprocessing)当中无法保证数据的正确性。使用场景:银行的交易系统eg:starttransaction;updateusersetbalance=900wherename='wsb';#买支付100元updateusersetbalance=1010wherename='egon';#中介拿走10元uppdateusersetbalance=1090wherename='ysb';#卖家拿到90元,出现异常没有拿到rollback;commit;
11、什么是触发器,请简述触发器的使用场景?使用触发器可以定制用户对表进行【增、删、改】操作时前后的行为,注意:没有查询。触发器无法由用户直接调用,而知由于对表的【增/删/改】操作被动引发的。eg:createtriggertri_before_insert_tb1beforeinsertontb1foreachrowbegin...end
12、什么是存储过程,存储过程的作用是什么?存储过程包含了一系列可执行的sql语句,存储过程存放于MySQL中,通过调用它的名字可以执行其内部的一堆sql。优点:1.用于替代程序写的SQL语句,实现程序与sql解耦2.基于网络传输,传别名的数据量小,而直接传sql数据量大缺点:1.程序员扩展功能不方便
13、什么是视图,简单介绍视图的作用和使用场景?视图是一个虚拟表(非真实存在),其本质是【根据SQL语句获取动态的数据集,并为其命名】,用户使用时只需使用【名称】即可获取结果集,可以将该结果集当做表来使用。视图取代复杂的sql语句,方便用来查询。eg:createviewteacher_viewasselecttidfromteacherwheretname='李平老师';
17、请介绍*select*语句的执行顺序;fromwheregroupbyhavingselectdistinctorderbylimit说明:1.找到表:from2.拿着where指定的约束条件,去文件/表中取出一条条记录3.将取出的一条条记录进行分组groupby,如果没有groupby,则整体作为一组4.将分组的结果进行having过滤5.执行select6.去重7.将结果按条件排序:orderby8.限制结果的显示条数
19、请举出MySQL中常用的几种数据类型;mysql常用数据类型:1.数值类型:整数类型:tinyintsmallintintbigint浮点型:floatdoubledecimalfloat:在位数比较短的情况下不精准(一般float得精确度也够用了)double:在位数比较长的情况下不精准0.000001230123123123存成:0.000001230000decimal:(如果用小数,则推荐使用decimal)精准内部原理是以字符串形式去存2.日期类型:最常用:datetimeyeardatetimedatetimetimestamp3.字符串类型:char(6)varchar(6)char(10):简单粗暴,浪费空间,存取速度快,定长;root存成root000000varchar:精准,节省空间,存取速度慢,变长;sql优化:创建表时,定长的类型往前放,变长的往后放比如性别比如地址或描述信息>255个字符,超了就把文件路径存放到数据库中。比如图片,视频等找一个文件服务器,数据库中只存路径或url。4.枚举类型与集合类型:enum('male','female')set('play','music','read','study')
20、什么情况下会产生笛卡尔乘积,如何避免?交叉连接:不适用任何匹配条件。生成笛卡尔积;select*fromemployee,department;避免:selectemployee.id,employee.name,employee.age,employee.sex,department.namefromemployee,departmentwhereemployee.dep_id=department.id;
21、请列举MySQL中常用的函数;聚合函数:聚合函数聚合的是组的内容,若是没有分组,则默认一组;count()、max()、min()、avg()、sum()
22、请说明groupby的使用场景;1、首先明确一点:分组发生在where之后,即分组是基于where之后得到的记录而进行的2、分组指的是:将所有记录按照某个相同字段进行归类,比如针对员工信息表的职位分组,或者按照性别进行分组等3、为何要分组呢?取每个部门的最高工资取每个部门的员工数取男人数和女人数
小窍门:‘每’这个字后面的字段,就是我们分组的依据4、大前提:可以按照任意字段分组,但是分组完毕后,比如groupbypost,只能查看post字段,如果想查看组内信息,需要借助于聚合函数
###二、编程题1、创建一个表student,包含ID(学生学号),sname(学生姓名),gender(性别),credit(信用卡号),四个字段,要求:ID是主键,且值自动递增,sname是可变长字符类型,gender是枚举类型,credit是可变长字符类型;createtablestudent(IDintprimarykeyauto_increment,snamevarchar(16)notnull,genderenum('male','female')notnulldefault'female',creditvarchar(32));
2、在上面的student表中增加一个名为class_id的外键,外键引用class表的cid字段;CREATEtableclass(cidintNOTNULLPRIMARYKEYauto_increment,cnameVARCHAR(5));ALTERtablestudentADDclass_idINTUNIQUE;ALTERtablestudentADDFOREIGNKEY(class_id)REFERENCESclass(cid)ONDELETECASCADEONUPDATECASCADE;
3、向该表新增一条数据,ID为1,学生姓名为alex,性别女,修改ID为1的学生姓名为wupeiqi,删除该数据;insertintoclass(cname)values(('一班'));INSERTINTOstudent(sname,gender)VALUES('alex','女');UPDATEstudentSETsname='wupeiqi'whereID=1;DELETEfromstudentwhereID=1;
4、查询student表中,每个班级的学生数;SELECTc.cname,count(ID)fromstudentsLEFTJOINclasscONc.cid=s.class_idGROUPBYID;
5、修改credit字段为unique属性;alterTABLEstudentmodifycreditVARCHAR(18)UNIQUE;
6、请使用命令在你本地数据库中增加一个用户,并给该用户授予创建表的权限;grantCREATEON*.*TO'panda@localhost'identifiedby'123';
7、请使用pymsql模块连接你本地数据库,并向student表中插入一条数据;importpymysqlconn=pymysql.connect(host='127.0.0.1',port=3306,user='root',password='123456',db='db6',charset='utf8')cursor=conn.cursor()sql="insertintostudentvalues(13,'park','男','123456',1)"rows=cursor.execute(sql)conn.commit()cursor.close()conn.close()
8、请使用mysqldump命令备份student表;cdC:\ProgramFiles\MySQL\MySQLServer5.7\binmysqldump-uroot-p123456db6student>student1.sql
9、创建一张名为*student_insert_log*的表,要求每次插入一条新数据到*student*表时,都向*student_insert_log*表中插入一条记录,记录*student_id*,*insert_time*;cdC:\ProgramFiles\MySQL\MySQLServer5.7\binmysqldump-uroot-p123456db6student>student1.sql