这个文档是我在准备去年秋招银行国企面试时自己整理的材料,可能有错误,大家可以批评改正。 农行软开 招商北分 工行 人寿 北京银行 中国移动 中信 中行软开都用到的~希望可以帮助大家 数据库基础题 数据库共有3种类型,为关系数据库、非关系型数据库和键值数据库。 1、 视图和索引的区别 你说的视图是指view还是materialized view,如果是前者肯定会修改,因为view只是个sql,查询的还是基本表,后者需要定制刷新才会自动修改 视图:就是一张虚拟表,视图就是一个子查询!实际当中的数据依然存在实际的表里面,只不过取的时候是根据这个视图(也就是这个子查询)从实际当中的表里面取出来.优点:简化查询! 1)为用户集中数据,简化用户的数据查询和处理。有时用户所需要的数据分散在多个表中,定义视图可将它们集中在一起,从而方便用户的数据查询和处理。 2)屏蔽数据库的复杂性。用户不必了解复杂的数据库中的表结构,并且数据库表的更改也不影响用户对数据库的使用。 3)简化用户权限的管理。只需授予用户使用视图的权限,而不必指定用户只能使用表的特定列,也增加了安全性。 缺点: 1)性能差 sql server必须把视图查询转化成对基本表的查询,如果这个视图是由一个复杂的多表查询所定义,那么,即使是视图的一个简单查询,sql server也要把它变成一个复杂的结合体,需要花费一定的时间。 2)修改限制 当用户试图修改试图的某些信息时,数据库必须把它转化为对基本表的某些信息的修改,对于简单的试图来说,这是很方便的,但是,对于比较复杂的试图,可能是不可修改的。 索引:索引使数据库程序无须对整个表进行扫描,就可以在其中找到所需的数据。当进行数据检索时,系统先搜索索引,从中找到数据的指针,再直接通过指针从表中取数据!优点:查询快 1)大大加快数据的检索速度; 2)创建唯一性索引,保证数据库表中每一行数据的唯一性; 3)加速表和表之间的连接; 4)在使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间缺点: 1)占用存储空间 2)在表中执行insert、delete、update操作时,将有额外的操作来维护索引 3)过多的索引起反作用 2、删除数据的方式 在速度上,一般来说,drop> truncate > delete 1).DELETE语句执行删除的过程是每次从表中删除一行,并且同时将该行的删除操作作为事务记录。在日志中保存以便进行进行回滚操作。 DELETE FROM 表名 WHERE 条件表达式 2)TRUNCATE TABLE 则一次性地从表中删除所有的数据并不把单独的删除操作记录记入日志保存,删除行是不能恢复的。并且在删除的过程中不会激活与表有关的删除触发器。执行速度快。TRUNCATE 只能对TABLE;DELETE可以是table和view3)DROP则删除整个表(结构和数据)。 TRUNCATE 和DELETE只删除数据, DROP则删除整个表(结构和数据)。 3、DML DDL DML(data manipulation language)数据操纵语言:就是我们最经常用到的SELECT、UPDATE、INSERT、DELETE。 主要用来对数据库的数据进行一些操作。 DDL(data definition language)数据库定义语言:其实就是我们在创建表的时候用到的一些sql,比如说:CREATE、ALTER、DROP等。DDL主要是用在定义或改变表的结构,数据类型,表之间的链接和约束等初始化工作上。 4、三范式 1.1 第一范式(1NF)无重复的列 1.2 第二范式(2NF)属性完全依赖于主键 [ 消除部分子函数依赖 ] 1.3 第三范式(3NF)属性不依赖于其它非主属性 [ 消除传递依赖 ] 第一范式,第二范式和第三范式 是数据库数据间要求的约束条件 第一范式是 数据库最基本的要求,即属性不可分 第二范式 是数据库非主属性对码的部分函数依赖 第三范式 是非主属性对码的传递依赖 举个简单例子吧 一个学生表有学号,姓名,出生年月等属性 假设学号是由两个属性年级号和个人号两个组成,那么这就不是第一范式 假如主键是由学号和姓名联合组成的,出生年月有学号就可以确定,那么这就不是第二范式 假如主键只是学号,出生年月既可以由学号决定又可以由姓名决定,那么这就不是第三范式 5、说一下数事务的四大特性(ACID) 🍜事物就是必须原子地执行一组或多组数据库操作的集合。要么都执行,要不都不执行。 如果一个数据库声称支持事务的操作,那么该数据库必须要具备以下四个特性: 原子性(Atomicity) 原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。 一致性(Consistency) 一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。 拿转账来说,假设用户A和用户B两者的钱加起来一共是5000,那么不管A和B之间如何转账,转几次账,事务结束后两个用户的钱相加起来应该还得是5000,这就是事务的一致性。 隔离性(Isolation) 隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。 即要达到这么一种效果:对于任意两个并发的事务T1和T2,在事务T1看来,T2要么在T1开始之前就已经结束,要么在T1结束之后才开始,这样每个事务都感觉不到有其他事务在并发地执行。 持久性(Durability) 持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。 例如我们在使用JDBC操作数据库时,在提交事务方法后,提示用户事务操作完成,当我们程序执行完成直到看到提示后,就可以认定事务以及正确提交, 即使这时候数据库出现了问题,也必须要将我们的事务完全执行完成,否则就会造成我们看到提示事务处理完毕,但是数据库因为故障而没有执行事务的重大错误。 事务的隔离级别(默认事务级别为可重复读) 总的说,数据库事务无非就两种:读取事务(select)、修改事务(update,insert)。在没有事务隔离控制的时候,多个事务在同一时刻对同一数据的操作可能就会影响到最终期望的结果,通常有四种情况: (1) 两个更新事务同时修改一条数据时,很显然这种情况是最严重的了,程序中无论如何也不能出现这种情况,因为它会造成更新的丢失! (2) 一个更新事务更新一条数据时,另一个读取事务读取了还没提交的更新,这种情况下会出现读取到脏数据。 (3) 一个读取事务读取一条数据时,另一个更新事务修改了这条数据,这时就会出现不可重现的读取。 (4)一个读取事务读取时,另一个插入事务(注意此处时插入)插入了一条新数据,这样就可能多读出一条数据,出现幻读。 以上四种情况描述完毕,相信大家也发现规律了,前三种是对同一条数据的并发操作,对程序的结果可能产生致命影响,尤其是金融等实时性,准确性要求极高的系统,绝不容许这三中情况的出现, 相比第四种情况不会影响数据的真实性,在很多情况下是允许的,如社交论坛等实时性要求不高的系统! 综上四个情况,我们可以大致这样简单的理解(最初说的两种事务的自由组合2*2=4): A)修改时允许修改(丢失更新) B) 修改时允许读取(脏读) C)读取时允许修改(不可重复读) D)读取时允许插入(幻读) 从上到下问题越来越不严重,但所需的性能开销却越大。因为不同的系统允许不同级别的情况,所以就出现了事务隔离这么一个东东,来允许我们设定数据库的并发行为。 总结下如果不考虑事务的隔离性,会发生的几种问题: (1)脏读 脏读是指在一个事务处理过程里读取了另一个未提交的事务中的数据。 当一个事务正在多次修改某个数据,而在这个事务中这多次的修改都还未提交,这时一个并发的事务来访问该数据,就会造成两个事务得到的数据不一致。例如:用户A向用户B转账100元,对应SQL命令如下 update account set money=money+100 where name=’B’; (此时A通知B) update account set money=money - 100 where name=’A’; 当只执行第一条SQL时,A通知B查看账户,B发现确实钱已到账(此时即发生了脏读),而之后无论第二条SQL是否执行,只要该事务不提交,则所有操作都将回滚,那么当B以后再次查看账户时就会发现钱其实并没有转。 (2)不可重复读 不可重复读是指在对于数据库中的某个数据,一个事务范围内多次查询却返回了不同的数据值,这是由于在查询间隔,被另一个事务修改并提交了。 例如事务T1在读取某一数据,而事务T2立马修改了这个数据并且提交事务给数据库,事务T1再次读取该数据就得到了不同的结果,发送了不可重复读。 不可重复读和脏读的区别是,脏读是某一事务读取了另一个事务未提交的脏数据,而不可重复读则是读取了前一事务提交的数据。 在某些情况下,不可重复读并不是问题,比如我们多次查询某个数据当然以最后查询得到的结果为主。但在另一些情况下就有可能发生问题,例如对于同一个数据A和B依次查询就可能不同,A和B就可能打起来了…… (3)虚读(幻读) 幻读是事务非独立执行时发生的一种现象。例如事务T1对一个表中所有的行的某个数据项做了从“1”修改为“2”的操作,这时事务T2又对这个表中插入了一行数据项,而这个数据项的数值还是为“1”并且提交给数据库。而操作事务T1的用户如果再查看刚刚修改的数据,会发现还有一行没有修改,其实这行是从事务T2中添加的,就好像产生幻觉一样,这就是发生了幻读。 幻读和不可重复读都是读取了另一条已经提交的事务(这点就脏读不同),所不同的是不可重复读查询的都是同一个数据项,而幻读针对的是一批数据整体(比如数据的个数)。 脏读(Drity Read):某个事务已更新一份数据,另一个事务在此时读取了同一份数据,由于某些原因,前一个RollBack了操作,则后一个事务所读取的数据就会是不正确的。 不可重复读(Non-repeatable read):在一个事务的两次查询之中数据不一致,这可能是两次查询过程中间插入了一个事务更新的原有的数据。 幻读(Phantom Read):在一个事务的两次查询中数据笔数不一致,例如有一个事务查询了几列(Row)数据,而另一个事务却在此时插入了新的几列数据,先前的事务在接下来的查询中,就会发现有几列数据是它先前所没有的。 在MySQL中,实现了这四种隔离级别,分别有可能产生问题如下所示: ①Serializable (串行化):可避免脏读、不可重复读、幻读的发生。 ②Repeatable read (可重复读):可避免脏读、不可重复读的发生。 ③Read committed (读已提交):可避免脏读的发生。 ④Read uncommitted (读未提交):最低级别,任何情况都无法保证。 在MySQL数据库中,支持上面四种隔离级别,默认的为Repeatable read (可重复读);而在Oracle数据库中,只支持Serializable (串行化)级别和Read committed (读已提交)这两种级别,其中默认的为Read committed级别。 据库的隔离级别。 6、数据库连接是tcp的还是udp的? tcp http走的是tcp还是udp?ssh是tcp还是udp?两者都是TCP,SSH的TCP还经过加密 7、数据库char和varchar的区别 (1)char类型的长度是固定的,varchar的长度是可变的。 这就表示,存储字符串'abc',使用char(10),表示存储的字符将占10个字节(包括7个空字符);使用varchar2(10),,则表示只占3个字节,10是最大值,当存储的字符小于10时,按照实际的长度存储。 (2).char类型的效率比varchar的效率稍高 8、触发器 触发器(trigger)是SQL server 提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,当对一个表进行操作(insert,delete update)时就会激活它执行。触发器经常用于加强数据的完整性约束和业务规则等。 存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中。调用才能执行。 触发器和存储过程的区别:触发器与存储过程的区别是运行方式的不同,触发器不能执行语句调用,而是在用户执行Transact-SQL语句时自动触发执行。而存储过程需要显示调用执行。 触发器和约束的关系和区别:约束,是指对你的表,或表中的列等等,进行某些条件的限制。而触发器,是指在你进行一些操作时,比如DELETE UPDATE等操作时,引起的一些另外的操作。(你自己设定的) 1)一般来说,使用约束比使用触发器效率更高。 2)同时,触发器可以完成比CHECK约束更复杂的限制。 3)与CHECK约束不同,在触发器中可以引用其它的表。对于一个表不同的操作(INSERT、UPDATE、DELETE)可以采用不同的触发器,即使是对相同的语句也可以调用不同的触发器来完成不同的操作。 9、索引创建的规则 索引分四类: index ---- 普通索引,数据可以重复fulltext ---- 全文索引,用来对大表的文本域(char,varchar,text)进行索引unique ---- 唯一索引,要求所有记录都唯一primary key ---- 主键索引,也就是在唯一索引的基础上相应的列必须为主键 原则: 1)对于查询频率高的字段创建索引; 2) 对排序、分组、联合查询频率高的字段创建索引; 3) 索引的数目不宜太多 4)选择唯一性索引 唯一性索引的值是唯一的,可以更快速的通过该索引来确定某条记录。例如,学生表中学号是具有唯一性的字段。为该字段建立唯一性索引可以很快的确定某个学生的信息。如果使用姓名的话,可能存在同名现象,从而降低查询速度。 5)尽量使用数据量少的索引 如果索引的值很长,那么查询的速度会受到影响。例如,对一个CHAR(100)类型的字段进行全文检索需要的时间肯定要比对CHAR(10)类型的字段需要的时间要多。 10、内连接和外连接区别 (1)内联接(典型的联接运算,使用像= 或<> 之类的比较运算符)。包括相等联接和自然联接。 内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行。例如,检索students和courses表中学生标识号相同的所有行。 (2)外联接。外联接可以是左向外联接、右向外联接或完整外部联接。 在FROM子句中指定外联接时,可以由下列几组关键字中的一组指定: 1)LEFT JOIN或LEFT OUTER JOIN 左向外联接的结果集包括 LEFT OUTER子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值。 2)RIGHT JOIN 或RIGHT OUTER JOIN 右向外联接是左向外联接的反向联接。将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。 3)FULL JOIN 或FULL OUTER JOIN完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。 11、分布式数据库与集中式数据库 分布式数据库系统是相对于集中式数据库系统而言的,是将数据库技术与网络技术相结合的产物。 分布式数据库(Distributed DataBase,DDB)比较确切的定义是:分布式数据库是由一组数据组成的,这组数据分布在计算机网络的不同计算机上,网络中的每个结点具有独立处理的能力,成为场地自治,它可以执行局部应用,同时,每个结点也能通过网络通信子系统执行全局应用。负责分布式数据库的建立、查询、更新、复制、管理和维护的软件,称为分布式数据库管理系统。 分布式数据库系统的优点 分布式数据库系统是在冀中是数据库系统的基础上发展来的,比较分布式数据库系统与集中式数据库系统,可以发现分布是数据库系统具有下列优点:(1)更适合分布式的管理与控制。分布式数据库系统的结构更适合具有地理分布特性的组织或机构使用,允许分布在不同区域、不同级别的各个部门对其自身的数 据实行局部控制。例如:实现全局数据在本地录入、查询、维护,这时由于计算机资源靠近用户,可以降低通信代价,提高响应速度,而涉及其他场地数据库中的数 据只是少量的,从而可以大大减少网络上的信息传输量;同时,局部数据的安全性也可以做得更好。(2)具有灵活的体系结构。集中式数据库系统强调的是集中式控制,物理数据库是存放在一个场地上的,由一个DBMS集中管理。多个用户只可以通过近程或远 程终端在多用户操作系统支持下运行该DBMS来共享集中是数据库中的数据。而分布式数据库系统的场地局部DBMS的自治性,使得大部分的局部事务管理和控 制都能就地解决,只有在涉及其他场地的数据时才需要通过网络作为全局事务来管理。分布式DBMS可以设计成具有不同程度的自治性,从具有充分的场地自治到 几乎是完全集中式的控制。(3)系统经济,可靠性高,可用性好。与一个大型计算机支持一个大型的冀中是数据库在加一些进程和远程终端相比,由超级微型计算机或超级小型计算机支持的 分布式数据库系统往往具有更高的性价比和实施灵活性。分布式系统比集中式系统具有更高的可靠性和更好的可用性。如由于数据分布在多个场地并有许多复制数 据,在个别场地或个别通信链路发生故障时,不致于导致整个系统的崩溃,而且系统的局部故障不会引起全局失控。(4)在一定条件下响应速度加快。如果存取的数据在本地数据库中,那末就可以由用户所在的计算机来执行,速度就快。(5)可扩展性好,易于集成现有系统,也易于扩充。对于一个企业或组织,可以采用分布式数据库技术在以建立的若干数据库的基础上开发全局应用,对原有的局部数据库系统作某些改动,形成一个分布式系统。这比 重建一个大型数据库系统要简单,既省时间,又省财力、物力。也可以通过增加场地数的办法,迅速扩充已有的分布式数据库系统。 分布式数据库系统的缺点 (1)通信开销较大,故障率高。例如,在网络通信传输速度不高时,系统的响应速度慢,与通信县官的因素往往导致系统故障,同时系统本身的复杂性也容易导致较高的故障率。当故障发生后系统恢复也比较复杂,可靠性有待提高。(2)数据的存取结构复杂。一般来说,在分布时数据库中存取数据,比在集中时数据库中存取数据更复杂,开销更大。(3)数据的安全性和保密性较难控制。在具有高度场地自治的分布时数据库中,不同场地的局部数据库管理员可以采用不同的安全措施,但是无法保证全局数据都 是安全的。安全性问题式分布式系统固有的问题。因为分布式系统式通过通信网络来实现分布控制的,而通信网络本身却在保护数据的安全性和保密性方面存在弱点,数据很容易被窃取。 常见的分布式数据库目前业界最流行的分布式数据库有两类,一个是以Google Spanner为代表,一个是以AWS Auraro为代表。 (1)Spanner 是shared nothing 的架构,内部维护了自动分片、分布式事务、弹性扩展能力,数据存储还是需要sharding,plan 计算也需要涉及多台机器,也就涉及了分布式计算和分布式事务。主要产品代表为TiDB、CockroachDB、OceanBase等;这三个产品可以说目前话题量不相上下,TiDB属于国产PingCAP公司的、CockroachDB比TiDB早出来一年、OceanBase阿里团队的,2017年双11交出4200万/秒的处理能力。 (2)Auraro 主要思想是计算和存储分离架构,使用共享存储技术,这样就提高了容灾和总容量的扩展。但是在协议层,只要是不涉及到存储的部分,本质还是单机实例的MySQL,不涉及分布式存储和分布式计算,这样就和MySQL 兼容性非常高。主要产品代表为PolarDB 12、数据库分片、分区、分表、分库: 分区 就是把一张表的数据分成N个区块,在逻辑上看最终只是一张表,但底层是由N个物理区块组成的 分表 就是把一张表按一定的规则分解成N个具有独立存储空间的实体表。系统读写时需要根据定义好的规则得到对应的字表明,然后操作它。 分库 一旦分表,一个库中的表会越来越多 数据分区是一种物理数据库的设计技术,它的目的是为了在特定的SQL操作中减少数据读写的总量以缩减响应时间。 分区并不是生成新的数据表,而是将表的数据均衡分摊到不同的硬盘,系统或是不同服务器存储介子中,实际上还是一张表。另外,分区可以做到将表的数据均衡到不同的地方,提高数据检索的效率,降低数据库的频繁IO压力值,分区的优点如下: 1)、相对于单个文件系统或是硬盘,分区可以存储更多的数据; 2)、数据管理比较方便,比如要清理或废弃某年的数据,就可以直接删除该日期的分区数据即可; 3)、精准定位分区查询数据,不需要全表扫描查询,大大提高数据检索率; 4)、可跨多个分区磁盘查询,来提高查询的吞吐量; 5)、在涉及聚合函数查询时,可以很容易进行数据的合并; 分片:在分布式存储系统中,数据需要分散存储在多台设备上,数据分片就是用来确定数据在多台存储设备上分布的技术。数据分片要达到三个目的: 1) 分布均匀,即每台设备上的数据量要尽可能相近; 2) 负载均衡,即每台设备上的请求量要尽可能相近; 3) 扩缩容时产生的数据迁移尽可能少。 13、保持数据库一致性的方法: 1) 触发器 2) 约束 3) 自写业务逻辑 14数据库引擎 正式来说,数据库引擎是用于存储、处理和保护数据的核心服务。利用数据库引擎可以控制访问权限并快速处理事务,从而满足企业内大多数需要处理大量数据的应用程序的要求,这包括创建用于存储数据的表和用于查看、管理和保护数据安全的数据库对象(如索引、视图和存储过程)。 Myisam (1) 不支持事务 (2) 支持表级锁 (3) 不支持外键 (4) 查询速度快 优点:ISAM执行读取操作的速度很快,而且不占用大量的内存和存储资源。 缺点:它不支持事务处理、不支持外键、不能够容错、也不支持索引。 Innodb (1) 支持事务 (2) 支持行锁 (3) 支持外键 优点:可靠性要求比较高,支持事务;适合更新频繁的表。 缺点:(1)查询速度慢(2)需要更多的内存和存储。 建立时设立 create table mytbl(id int primary key,name varchar(50)) type=MyISAM 建表后更改 alter table mytbl2 type =InnoDB; 查看表 show engines 15 union all 和union 区别 union和union all的区别是,union会消除重复结果,而union all则将所有的结果全部显示出来,不管是不是重复。 16 sql语言功能有哪些? SQL包括了所有对数据库的操作,主要是由4个部分组成: (1) 数据定义(ddl):这一部分又称为“SQL DDL”,定义数据库的逻辑结构,包括定义数据库、基本表、视图和索引4部分。Drop create (2) 数据操纵(dml):这一部分又称为“SQL DML”,其中包括数据查询和数据更新两大类操作,其中数据更新又包括插入、删除和更新三种操作。Insert select (3) 数据控制(dcl):对用户访问数据的控制有基本表和视图的授权、完整性规则的描述,事务控制语句等。Grant授予权限revoke 收回权限 (4) 数据查询select 17.只一般数据库若出现日志满了,会出现什么情况,是否还能使用? 能执行查询等读操作,不能执行更改,备份等写操作,原因是任何写操作都要记录日志。也就是说基本上处于不能使用的状态。 18游标 结果集,结果集就是select查询之后返回的所有行数据的集合。游标则是处理结果集的一种机制吧,它可以定位到结果集中的某一行,多数据进行读写,也可以移动游标定位到你所需要的行中进行操作数据。 一般复杂的存储过程,都会有游标的出现,他的用处主要有: (1) 定位到结果集中的某一行。 (2) 对当前位置的数据进行读写。 (3) 可以对结果集中的数据单独操作,而不是整行执行相同的操作。 (4) 是面向集合的数据库管理系统和面向行的程序设计之间的桥梁。 一 、常用操作数据库的命令 1.show databases; 查看所有的数据库 2.create database test; 创建一个叫test的数据库 3.drop database test;删除一个叫test的数据库 5.show tables; 在选中的数据库之中查看所有的表 4.use test;选中库,在建表之前必须要选择数据库 8.drop table 表名; 删除表 6.create table 表名(字段1 类型, 字段2 类型); 7.desc表名;查看所在的表的字段 10.show create table 表名; 查看创建表的详细信息 9.show create databases 库名;查看创建库的详细信息 二、修改表的命令 1.修改字段类型alter table 表名modify 字段 字段类型; 2.添加新的字段alter table 表名add 字段 字段类型 3.添加字段并指定位置 alter table 表名add 字段 字段类型 after 字段; 4.删除表字段 alter table 表名drop 字段名; 5.修改指定的字段 alter table 表名change原字段名字 新的字段名字 字段类型 三、对数据的操作 1. 增加数据(insert)3种方式 insert into 表名values(值1,值2,...)(很少用) insert into 表名(字段1,字段2...) values(值1,值2,....);(较常用) insert into 表名(字段1,字段2...) values(值1,值2,....),(值1,值2,....),(值1,值2,....); 2.删除数据(delete) delete from 表名where 条件 注意:where条件必须加,否则数据会被全部删除 3.更新数据(update) update表名set字段1 = 值1, 字段2 = 值2 where 条件 3.筛选重复值的字段 select distinct 字段from 表名 注意:where 必须加,否则数据全部修改 4.查询数据(select) (1).查询表中的所有数据 select * from 表名 (2).指定数据查询 select 字段from 表名 集合id [not] in(1,2)模糊查询 :like '%a%'; 5.结果集排序 .根据条件查询出来的数据 select 字段from 表名where条件(最常用的) where条件后面跟的条件 关系:>,<,>=,<=,!= 逻辑:or, and 区间:id between 4 and 6 ;闭区间,包含边界 通过字段来排序 例如 :select * from star orser by money desc, age asc; 6.限制结果集 select字段from 表order by 字段 排序关键词(desc | asc) 排序关键词desc 降序asc 升序(默认) 多字段排序 select字段from 表order by 字段1 desc |asc,...字段n desc| asc; select 字段from 表limit 数量; 例如:select sum(id) from star 8.分组 select * from 表名 limit 偏移量,数量 说明: 1.不写偏移量的话就是默认的为0 2.实现分页的时候必须写偏移量 偏移量怎么计算?: limit (n-1)*数量,数量 7.常用的统计函数 sum,avg,count,max,min 只分组:select * from 表group by 字段 例子: select count(sex) as re,sex from star group by sex having re > 3; 分组统计: select count(sex) from star group by sex; 分组后结果集的过滤 多表联合查询 1,内连接 隐式内连接select username,name from user,goods where user,gid=gods,gid; 显示内连接 select username,from user inner join goods on user.gid=goods.gid; select * from user left join goods on user.gid=goods.gid; 2.外链接 左连接 包含所有的左边表中的记录以及右边表中没有和他匹配的记录 右连接 select * from user where gid in(select gid from goods); select * from user right jOin goods on user.gid=goods.gid; 子嵌套查询 数据联合查询 select * from user left join goods on user.gid=goods.gid union select * from user right join goods on user.gid=goods.gid; 两个表同时更新 update user u, goods g set u.gid=12,g.price=1 where u.id=2 and u.gid=g.gid; DCL数据控制语言 创建用户:create user'xiaoming'@'localhost' identified by '666666'; 授权用户:grant all on test.*to'xiaoming'@'localhost'; 刷新权限:flush privileges; 取消授权:revoke all on test.* from 'xiaoming'@'localhost'; 删除用户: drop user'xiaoming'@'localhost'; DTL数据事务语言 开启事务:set autocommit=0; 操作回滚:rollback;提交事务:commit; 设置约束 create table Student ( sno char(10) primary key, sfzh char(18) unique, cname varchar(16) not null, sex char(2) check(sex='男' or sex='女'), dept varchar(30) default'软件学院', birthday datetime, score float check(score between 0 and 100), polity char(8) check(polity='党员' or polity='团员' or polity='群众') )