1.从表 login 中选出 name 字段包含 admin 的前 10 条结果所有信息的 sql 语句
SELECT * FROM login WHERE name LIKE ‘%admin%’LIMIT 10;
2.表中有A B C三列,用SQL语句实现:当A列大于B列时选择A列,否则选择B列,当 B列大于C列时选择B列否则选择C列
SELECT CASE WHEN A > B THEN A ELSE B END,
CASE WHEN B > C THEN B ELSE C END
FROM table
3.取得最新一次添加记录(假设id为主键,并且是自增类型)所产生的id的函数是什么?
mysqli_insert_id();如果上一查询没有产生 AUTO_INCREMENT 的值,则 mysqli_insert_id() 返回 0。
4.在平常mysql优化方面,最基本的也是最重要的优化是
查询优化
5.简述在MySQL数据库中MyISAM和InnoDB的区别
区别于其他数据库的最重要的特点就是其插件式的表存储引擎。切记:存储引擎是基于表的,而不是数据库。
InnoDB与MyISAM的区别:
InnoDB存储引擎,主要面向OLTP(Online Transaction Processing,在线事务处理)方面的应用,是第一个完整支持ACID事务的存储引擎(BDB第一个支持事务的存储引擎,已经停止开发)。
特点:
行锁设计、支持外键;
支持类似于Oracle风格的一致性非锁定读(即:默认情况下读取操作不会产生锁);
InnoDB将数据放在一个逻辑的表空间中,由InnoDB自身进行管理。从MySQL4.1版本开始,可以将每个InnoDB存储引擎的表单独存放到一个独立的ibd文件中;
InnoDB通过使用MVCC(多版本并发控制:读不会阻塞写,写也不会阻塞读)来获得高并发性,并且实现了SQL标准的4种隔离级别(默认为REPEATABLE级别);
InnoDB还提供了插入缓冲(insert buffer)、二次写(double write)、自适应哈希索引(adaptive hash index)、预读(read ahead)等高性能和高可用的功能;
InnoDB采用了聚集(clustered)的方式来存储表中的数据,每张标的存储都按主键的顺序存放(如果没有显式的在建表时指定主键,InnoDB会为每一行生成一个6字节的ROWID,并以此作为主键);
InnoDB表会有三个隐藏字段:除了上面提到了6字节的DB_ROW_ID外,还有6字节的DB_TX_ID(事务ID)和7字节的DB_ROLL_PTR(指向对应回滚段的地址)。这个可以通过innodb monitor看到;
MyISAM存储引擎是MySQL官方提供的存储引擎,主要面向OLAP(Online Analytical Processing,在线分析处理)方面的应用。
特点:
不支持事务,支持表所和全文索引。操作速度快;
MyISAM存储引擎表由MYD和MYI组成,MYD用来存放数据文件,MYI用来存放索引文件。MySQL数据库只缓存其索引文件,数据文件的缓存交给操作系统本身来完成;
MySQL5.0版本开始,MyISAM默认支持256T的单表数据;
6.现在有下面一个查询语句 select * from tabname where id=2 and password='abc’如何判断它是现在是最优的。
可以使用 explain select * from tabname where id=2 and password='abc’来分析其执行情况。
7.谈一下对explain工具的理解,以及其中的一些参数的意义?
explain 是一个mysql的分析语句的一个小工具。
explain可以帮助开发人员分析SQL语句,用explain显示mysql如何使用索引来处理SQL语句连接表,处理表,以帮助开发人员写出更好的SQL语句,更高效的SQL语句。
你在查询的时候,如果你的SQL语句写出来来了,SQL解析引擎会决定如何进行处理,是否使用索引或者进行全表扫描。如果是全表扫描,那么你这个效率就非常。学习explain重点就是会查看对应的一引起信息。帮助我们分析如何写出更好的SQL语句,如果是非特殊情况,尽量不要出现全表扫描的情况。这样,效率太低了。
select_type
simple | 简单的select,不使用union |
primary | 最外面的select |
union | union中的第二个或者后面的select |
dependent union | union中引二个或者后面的select,取决于外面的查询 |
union result | union的结果 |
dependent subquery | 查询中的第一个select |
derived | 导出的select |
Extra和type详解
type在这里面是一个非常重要的指标,决定了它的扫描类型。
ALL | index | range | ref | eq_ref | const,system | null |
distinct: 一旦mysql找到了与行所匹配的行,就不再搜索了
not exists:mysql 优化了left join,一旦找到他left join所匹配的行,就不搜搜索
range checked for each record:没有找到理想的索引。
using filesort:查询就需要优化了。mysql需要进行更多额外的步骤,来对返回的内容进行排序。
using index:列数据仅仅从索引中进行读取。而没有真正的读取行,所返回的数据。你当前查的结果和查的字段都在索引。
where used:限制哪些行或者其他的表的数据返回给用户。
system:表示system表,这是const连接类型特殊情况。
const:表中的一个最大记录能够匹配这个查询,因为只有一行,所有这个值通常是个const常数。
eq_ref:MySQL在查询时,从前面的表中,对每一条记录联合读取。它使用索引为主键 或者为唯一索引时使用。
ref: 这个查询只查询使用了不是唯一或者主键时的查询发生。
range: 返回一个区间的查询。
ALL: 就尽量避免,因为全表扫描。
注意:
\1. 不要让索引字段参与了运算。
\2. 查询的时候使用有索引的字段
\3. 索引不是越多越好,索引太多会造成写入和修改速度变慢
\4. 少用or,因为用了容易全表扫描。
\5. 不要真实的删除数据,使用软删除删除数据
\6. 对于innodb表不要使用count进行查询总数,或者使用一个计数器去统计数量。
8.请问如何在Mysql操作中如何写入utf8格式数据
首先确保数据库中的表是基于utf8编码的,其次java文件是utf8编码,在执行mysql 操作之前,对于要操作的文本如果是utf8 编码,则可以直接操作,如果是其它编码,则可以使用函数将其转化为utf8编码,然后写入。
9.mysql 中 varchar的最大长度是多少?用什么类型的字段存储大文本?date 和 datetime和timestamp什么区别?怎么看数据库中有哪些sql正在执行?
varchar的最大有效长度由最大行大小和使用的字符集确定。整体最大长度是65532字节。在varchar存字符串的时候,第一个字节是空的,不存任何的数据,然后还需要两个字节来存放字符串的长度。所以有效长度就是 65535 - 1 - 2 = 65532。
由字符集来确定,字符集分单字节和多字节,如果是单字节,如 latin1,则最多可以存放65532个字符,如果是多字节,如GBK则可以存放32766个字符,UTF8则可以存放21844 个字符。
存储大文本可以使用text类型。
date表示日期,其范围为 1000-01-01 ~ 9999-12-31
datetime表示日期时间,其范围为 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59
timestamp 是 unix 时间戳的日期时间表示方式,其范围较小为 1970-01-01
00:00:00~2038-01-19 03:14:07 ,timestamp具备自动初始化和自动更新功能。
查看数据库中正在执行的 sql 语句可以使用日志,也可以使用 show processlist 命令。
10.对于关系型数据库而言,索引是相当重要的概念,请回答有关索引的几个问题
a)、索引的目的是什么?
1.快速访问数据表中的特定信息,提高检索速度
2.创建唯一性索引,保证数据库表中每一行数据的唯一性。
3.加速表和表之间的连接
4.使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间
b)、索引对数据库系统的负面影响是什么?
负面影响:创建索引和维护索引需要耗费时间,这个时间随着数据量的增加而增加;索引需要占用物理空间,不光是表需要占用数据空间,每个索引也需要占用物理空间;当对表进行增、删、改、的时候索引也要动态维护,这样就降低了数据的维护速度。
c)、为数据表建立索引的原则有哪些?
1、在最频繁使用的、用以缩小查询范围的字段上建立索引。
2、在频繁使用的、需要排序的字段上建立索引
d)、 什么情况下不宜建立索引?
1、对于查询中很少涉及的列或者重复值比较多的列,不宜建立索引。
2、对于一些特殊的数据类型,不宜建立索引,比如文本字段(text)等。