1、如何创建和删除数据库?
创建数据库 CREATE DATABASE 数据库名;
删除数据库 drop database 数据库名;
2、MyISAM与InnoDB的区别?
1)事务:MyISAM 不支持事务 InnoDB 支持
2)行锁/表锁:MyISAM 支持表级锁 InnoDB 支持行锁和表锁
3)MVCC(多版本并发控制):InnoDB 支持 MyISAM 不支持
4)外键:MyISAM 不支持 InnoDB支持
5)全文索引:MyISAM 支持,InnoDB后期版本支持(5.7 版本及以后支持)
6)行数:InnoDB 不保存表的总行数,执行 select count(*) from table 时 需要全表扫描;MyISAM支持,用一个变量保存表的总行数,查总行数速度很快
7)索引:InnoDB 是聚集索引,数据文件是和索引绑在一起的,必须要有主键,通过主键索引效率很高。辅助索引需要两次查询,先查询 到主键,再通过主键查询到数据。MyISAM 是非聚集索引,数据文件是分离的,索引保存的是数据文件的指针,主键索引和辅助索引是独立的
3、char与varchar的区别
char 是一种固定长度的字符串类型
varchar 是一种可变长度的字符串类型
4、建表语句中varchar(50)中50的指是什么?
字段最多存放 50 个字符 如 varchar(50) 和 varchar(200) 存储 “ConstXiong” 字符串所占空间是一样的,后者在排序时会消耗更多内存
5、int(10)中10指什么?
INT[(M)] [UNSIGNED] [ZEROFILL] M 默认为11
10 就是上述语句里的 M,指最大显示宽度,最大值为 255 最大显示宽度意思是,如果是 int(10),字段存的值是 10,则,显示会自动
在之前补 8 个 0,显示为 0000000010 int 类型在数据库里面存储占 4 个字节的长度
有符号的整型范围是 -2147483648 ~ 2147483647 无符号的整型范围是 0 ~ 4294967295
6、DELETE和TRUNCATE的区别是什么?
DELETE 命令从一个表中删除某一行或多行数据
TRUNCATE 命令永久地从表中删除每一行数据
7、MySQL如何获取当前日期?
SELECT CURRENT_DATE();
8、如何获取MySQL的版本?
SELECT VERSION();
9、什么是触发器,MySQL都有哪些触发器?
触发器是指一段代码,当触发某个事件时,自动执行这些代码
MySQL 数据库中有六种触发器:
Before Insert
After Insert
Before Update
After Update
Before Delete
After Delete
2)使用场景:
可以通过数据库中的相关表实现级联更改
实时监控表中字段的更改做出相应处理
注意:滥用会造成数据库及应用程序的维护困难
3)mysql触发器介绍和使用
触发器是mysql数据库针对某张表发生增删改操时自动执行的一段语句集合,它是跟某张表关联绑定的,不像存储过程那种需要被动调用。触发器可以用来检验数据完整性,日志跟踪记录等。注意:不能在mysql本身系统数据库的表上创建触发器,要在其他数据库的表上
创建。
4)创建触发器的结构:
create trigger trigger_name
before/after insert/update/delete
on table_name
for each row #行级触发器
begin
具体语句…
end
5)触发器针对的是数据库中表的每一行记录
每行数据在操作前后都会有一个对应的状态,触发器将没有操作之前的状态保存到 old 关键字中,将操作后的状态保存到 new 中
语法:old/new.字段名
需要注意的是,old 和 new 不是所有触发器都有
触发器类型 new和old的使用
INSERT型触发器 没有 old,只有 new,new 表示将要(插入前)或者已经增加(插入后)的数据
UPDATE型触发器 既有 old 也有 new,old 表示更新之前的数据,new 表示更新之后的数据
DELETE型触发器 没有 new,只有 old,old 表示将要(删除前)或者已经被删除(删除后)的数据
举例说明,在mysql里testdb数据库下的两个表,person以及person_log(是记录每次在person表里修改操作的日志)
mysql> use testdb;
mysql> show create table person\G;
*************************** 1. row ***************************
Table: person
Create Table: CREATE TABLE `person` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` text CHARACTER SET utf8,
`addr` text CHARACTER SET utf8,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
ERROR:
No query specified
mysql> show create table person_log\G;
*************************** 1. row ***************************
Table: person_log
Create Table: CREATE TABLE `person_log` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`operation` varchar(20) NOT NULL,
`optime` datetime NOT NULL,
`opinfo` varchar(100) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8
1 row in set (0.01 sec)
先创建一个在delete操作后,发生的触发器person_delaft_trigger。这个触发器的作用,就是当在person表里删除记录后,在日志表person_log里插入一条记录,把删除的信息输入。
mysql> delimiter $
mysql> create trigger person_delaft_trigger after delete on person for each row insert into person_log(operation,optime,opinfo) values(‘delete’,now(),concat('delrow: ‘,old.name,’ ',old.addr))$ #这里是delete操作,只有old关键字,记录的是删除的记录数据
刚开始的表数据:
当我们进行一个删除操作后:
10、MySQL显示表前 50 行
SELECT * FROM tablename LIMIT 0,50;
11、如何连接MySQL服务端、关闭连接?
连接:使用指令 mysql -u -p -h -P (-u:指定用户名 -p:指定密码 -h:主机 -P:端口) 连接 MySQL 服务端
关闭:使用指令 exit 或 quit
12、int(10)、char(16)、varchar(16)、datetime、text的意义?
int(10) 表示字段是 INT 类型,显示长度是 10
char(16)表示字段是固定长度字符串,长度为 16
varchar(16) 表示字段是可变长度字符串,长度为 16
datetime 表示字段是时间类型
text 表示字段是字符串类型,能存储大字符串,最多存储 65535 字节数据
13、说说你知道的MySQL存储引擎
InnoDB
默认事务型引擎,被广泛使用的存储引擎
数据存储在共享表空间,即多个表和索引都存储在一个表空间中,可通过配置文件修改
主键查询的性能高于其他类型的存储引擎
内部做了很多优化,如:从磁盘读取数据时会自动构建hash索引,插入数据时自动构建插入缓冲区
通过一些机制和工具支持真正的热备份
支持崩溃后的安全恢复
支持行级锁
支持外键
MyISAM
拥有全文索引、压缩、空间函数
不支持事务和行级锁、不支持崩溃后的安全恢复
表存储在两个文件:MYD 和 MYI
设计简单,某些场景下性能很好,例如获取整个表有多少条数据,性能很高
其他表引擎:Archive、Blackhole、CSV、Memory
25 索引的种类有哪些?
普通索引:最基本的索引,没有任何约束限制。
唯一索引:和普通索引类似,但是具有唯一性约束,可以有 null
主键索引:特殊的唯一索引,不允许有 null,一张表最多一个主键索引
组合索引:多列值组成一个索引,用于组合搜索,效率大于索引合并
全文索引:对文本的内容进行分词、搜索
覆盖索引:查询列要被所建的索引覆盖,不必读取数据行
26 MyISAM索引与InnoDB索引的区别?
InnoDB 索引是聚簇索引,MyISAM 索引是非聚簇索引
InnoDB 的主键索引的叶子节点存储着行数据,主键索引非常高效
MyISAM 索引的叶子节点存储的是行数据地址,需要再寻址一次才能得到数据
InnoDB 非主键索引的叶子节点存储的是主键和其他带索引的列数据,因此查询时做到覆盖索引会非常高效
27 MySQL有哪些常用函数?
字符串函数
LENGTH:返回字符串的字节长度
CONCAT:合并字符串,返回结果为连接参数产生的字符串,参数可以使一个或多个
INSERT:替换字符串
LOWER:将字符串中的字母转换为小写
UPPER:将字符串中的字母转换为大写
LEFT:从左侧字截取符串,返回字符串左边的若干个字符
RIGHT:从右侧字截取符串,返回字符串右边的若干个字符
TRIM:删除字符串左右两侧的空格
REPLACE:字符串替换,返回替换后的新字符串
SUBSTRING:截取字符串,返回从指定位置开始的指定长度的字符换
REVERSE:字符串反转,返回与原始字符串顺序相反的字符串
日期和时间函数
CURDATE、CURRENT_DATE:返回当前系统的日期值
CURTIME、CURRENT_TIME:返回当前系统的时间值
NOW、SYSDATE:返回当前系统的日期和时间值
UNIX_TIMESTAMP:获取 UNIX 时间戳函数,返回一个以 UNIX 时间戳为基础的无符号整数
FROM_UNIXTIME:将 UNIX 时间戳转换为时间格式
MONTH:获取指定日期中的月份
MONTHNAME:获取指定日期中的月份英文名称
DAYNAME:获取指定曰期对应的星期几的英文名称
DAYOFWEEK:获取指定日期对应的一周的索引位置值
WEEK:获取指定日期是一年中的第几周
DAYOFYEAR:获取指定曰期是一年中的第几天,返回值 1~366
DAYOFMONTH:获取指定日期是一个月中是第几天,返回值 1~31
YEAR:获取年份
TIME_TO_SEC:将时间参数转换为秒数
SEC_TO_TIME:将秒数转换为时间
DATE_ADD、ADDDATE:向日期添加指定的时间间隔
DATE_SUB、SUBDATE:向日期减去指定的时间间隔
ADDTIME:时间加法运算,在原始时间上添加指定的时间
SUBTIME:时间减法运算,在原始时间上减去指定的时间
DATEDIFF:获取两个日期之间间隔,返回参数 1 减去参数 2 的值
DATE_FORMAT:格式化指定的日期,根据参数返回指定格式的值
WEEKDAY:获取指定日期在一周内的对应的工作日索引
聚合函数
MAX:查询指定列的最大值
MIN:查询指定列的最小值
COUNT:统计查询结果的行数
SUM:求和,返回指定列的总和
AVG:求平均值,返回指定列数据的平均值
流程控制函数
IF:判断是否为 true
IFNULL:判断是否为空
CASE:分支判断
28 与Oracle相比,Mysql有什么优势?
Mysql 是开源软件、无需付费
操作简单、部署方便,用户可以根据应用的需求去定制数据库
Mysql 的引擎是插件式
29 LIKE 后的%和_代表什么?
% 代表 0 或更多字符
_ 代表 1 个字符
8以下三条sql 如何只建一条索引?
WHERE a=1 AND b=1
WHERE b=1
WHERE b=1 ORDER BY time DESC
参考答案
以顺序 b,a,time 建立联合索引,CREATE INDEX idx_b_a_time ON table(b,a,time)。
新 MySQL 版本会优化 WHERE 子句后面的列顺序,以匹配联合索引顺序
30 以下语句是否会使用索引?
SELECT FROM user WHERE YEAR(cdate) < 2007;
不会,因为列涉及到运算,不会使用索引
31 列值为NULL时,查询是否会用到索引?
MySQL 中存在 NULL 值的列也是走索引的
计划对列进行索引,应尽量避免把它设置为可空,因为这会让 MySQL 难以优化引用了可空列的查询,同时增加了引擎的复杂度
32 创建MySQL联合索引应该注意什么?
联合索引要遵从最左前缀原则,否则不会用到索引
Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分。
如索引是 index (a,b,c),可以支持 a 或 a,b 或 a,b,c 3种组合进行查找,但不支持 b,c 进行查找
33 MySQL创建和使用索引的注意事项?
适合创建索引的列是出现在 WHERE 或 ON 子句中的列,而不是出现在 SELECT 关键字后的列
索引列的基数越大,数据区分度越高,索引的效果越好
对字符串列进行索引,可制定一个前缀长度,节省索引空间
避免创建过多的索引,索引会额外占用磁盘空间,降低写操作效率
主键尽可能选择较短的数据类型,可减少索引的磁盘占用,提高查询效率
联合索引遵循前缀原则
LIKE 查询,%在前不到索引,可考虑使用 ElasticSearch、Lucene 等搜索引擎
MySQL 在数据量较小的情况可能会不使用索引,因为全表扫描比使用索引速度更快
关键词 or 前面的条件中的列有索引,后面的没有,所有列的索引都不会被用到
列类型是字符串,查询时一定要给值加引号,否则索引失效
联合索引要遵从最左前缀原则,否则不会用到索引
34 索引对性能有哪些影响?
优点:
减少数据库服务器需要扫描的数据量
帮助数据库服务器避免排序和临时表
将随机 I/O 变顺序I/O
提高查询速度
唯一索引,能保证数据的唯一性
缺点:
索引的创建和维护耗时随着数据量的增加而增加
对表中数据进行增删改时,索引也要动态维护,降低了数据的维护速度
增大磁盘占用
35 索引如何创建与删除?
创建单个字段索引的语法:CREATE INDEX 索引名 on 表名(字段名)
创建联合索引的语法:CREATE INDEX 索引名 on 表名(字段名1,字段名2)
索引命名格式一般可以这样:idx_表名_字段名。注意有长度限制
删除索引:DROP INDEX 索引名 ON 表名
如:
给 id 创建索引:CREATE INDEX idx_t1_id on t1(id);
给 username 和 password 创建联合索引:CREATE index idx_t1_username_password ON t1(username,password)index 替换成 unique 或 primary key,分别代表唯一索引和主键索引
36 使用过MySQL的存储过程吗?介绍一下
存储过程(Stored Procedure)是数据库中一种存储复杂程序,供外部程序调用的一种数据库对象
是一段 SQL 语句集,被编译保存在数据库中
可命名并传入参数来调用执行
可在存储过程中加入业务逻辑和流程
可在存储过程中创建表,更新数据,删除数据等
可通过把 SQL 语句封装在容易使用的单元中,简化复杂的操作
什么是存储过程
简单的说,就是一组SQL语句集,功能强大,可以实现一些比较复杂的逻辑功能,类似于JAVA语言中的方法;
ps:存储过程跟触发器有点类似,都是一组SQL集,但是存储过程是主动调用的,且功能比触发器更加强大,触发器是某件事触发后自动调用;
有哪些特性
有输入输出参数,可以声明变量,有if/else, case,while等控制语句,通过编写存储过程,可以实现复杂的逻辑功能;
函数的普遍特性:模块化,封装,代码复用;
速度快,只有首次执行需经过编译和优化步骤,后续被调用可以直接执行,省去以上步骤;
创建一个简单的存储过程
存储过程proc_adder功能很简单,两个整型输入参数a和b,一个整型输出参数sum,功能就是计算输入参数a和b的结果,赋值给输出参数sum;
几点说明:
DELIMITER ;;:之前说过了,把默认的输入的结束符;替换成;;。
DEFINER:创建者;
DROP PROCEDURE IF EXISTS `proc_adder`;
DELIMITER ;;
CREATE DEFINER=`root`@`localhost` PROCEDURE `proc_adder`(IN a int, IN b int, OUT sum int)
BEGIN
#Routine body goes here...
DECLARE c int;
if a is null then set a = 0;
end if;
if b is null then set b = 0;
end if;
set sum = a + b;
END
;;
DELIMITER ;
执行以上存储结果,验证是否正确,如下图,结果OK:
set @b=5;
call proc_adder(2,@b,@s);
select @s as sum;