sql语句分类按功能(定义、操纵、控制、查询)分类
DDL 数据定义语言,定义表、库、视图
DML 对数据表记录增加、修改和删除操作
DCL 授权、事务控制、条件判断
常见的面试题:
1.如何删除表:
drop table table_name;
2.创建索引:
对于查询占主要的应用来说,索引显的尤为重要。很多时候性能问题就是因为我们没有添加索引或者更为有效的索引。如何不添加索引的话,那么查询所有哪怕只是查询一条特定的数据都会进行全表扫描。如果一张表的数据量比较大而且符合条件的结果又很少,那么不加索引会引起致命的性能下降。但是也不是什么情况都非得建立索引不可,比如性别就只有两个值,建索引不仅没什么优势,还会影响到跟新速度,这被称为过度索引。
3.复合索引:
比如一条sql语句: select * from user where area='beijing' and age='male';
如果我们在area和age上分别创建单个索引的话,由于mysql查询每次只能使用一个索引,所以虽然这样做已经比全表扫描效率提高了不少,但索引的功能不仅仅如此,如我们在area和age上建立复合索引的话,查询速度就会大大提高。如果我们创建了(area, age, salary)的复合索引,那么其实相当于创建了(area,age,salary)、 (area,age)、(area)三个索引,这被称为最佳左前缀特性。因此我们在创建复合索引时应该将最常用作限制条件的列放在最左边,依次递减。
4.索引不会包含有NULL值的列:
只要列中包含有null值都将不会被包含在索引中 ,复合索引只要有一列含有null值,那么这一列对此复合索引是无效的。所以我们在设计数据库是尽量不要让字段的默认值为null。
5.使用短索引:
对串列进行索引,如果有可能应该指定一个前缀长度,例如有一个长度char(255)的列,如果在前10或20个字符内,多数值是唯一的,那么就不要对这个列进行索引。短索引不仅可以提高查询效率而且可以提高I/O效率和减少内存占用。
6.排序的索引问题:
mysql查询只使用一个索引,如果where语句中已经使用了索引,那么order by 后的字段将不会加索引。 因此数据库默认排序可以符合要求的情况下不要使用排序操作,尽量不要使用含多个列的排序如果需要请给这些列加上复合索引。
7.LIKE语句操作:
一般情况下不建议使用like操作,如果必须,如何使用也是一个技术,如(like %aaa%)不会使用索引,而(like aaa%)会使用索引。
8.Mysql数据库设置数据类型时应注意什么:
① varchar 和 char 类型,varchar是变长的,需要额外1-2个字节存储,能节约空间,可能对性能有帮助。但由于是变长的,可能会发生碎片,如更新数据。
② 使用ENUM(Mysql枚举类)代替字符串类型,数据实际存储为整型。
③ 尽量不要使用字符串类型来作为标识符,因为它们占了很多内存而且通常比整数型要慢,
9.Mysql的几种备份方式:
①、 逻辑备份:使用mysql自带的mysqldump工具进行备份。备份成sql文件形式。
优点:最大好处是能够与正在运行的mysql自动协同工作,在运行期间可以确保备份是当时的点,它会自动将对应操作的表锁定,不允许其他用户修改(只能访问)。可能会阻止修改操作。sql文件通用方便移植。
缺点:备份的速度比较慢。如果是数据量很多的时候。就很耗时间。如果数据库服务器处在提供给用户服务状态,在这段长时间操作过程中,意味着要锁定表(一般是读锁定,只能读不能写入数据)。那么服务就会影响的。
②、物理备份:直接拷贝mysql的数据目录。
直接拷贝只适用于myisam类型的表。这种类型的表是与机器独立的。但实际情况是,你设计数据库的时候不可能全部使用myisam类型表。你也不可能因为myisam类型表与机器独立,方便移植,于是就选择这种表,这并不是选择它的理由。
缺点:你不能去操作正在运行的mysql服务器(在拷贝的过程中有用户通过应用程序访问更新数据,这样就无法备份当时的数据)可能无法移植到其他机器上去。
③、双机热备份。
mysql数据库没有增量备份的机制。当数据量太大的时候备份是一个很大的问题。还好mysql数据库提供了一种主从备份的机制(也就是双机热备)
优点:适合数据量大的时候。现在明白了。大的互联网公司对于mysql数据备份,都是采用热机备份。搭建多台数据库服务器,进行主从复制
10.Mysql添加索引
普通索引 添加INDEX
alter table table_name add index index_name ('column'); ----- alter table user add index age_search ('age');
主键索引 添加 primary key
alter table table_name add primary key ('column');
唯一索引 添加 unique
alter table table_name add unique ('column');
全文索引 添加 fulltext
alter table table_name add fulltext ('column');
多列索引
alter table table_name add index ('column1','column2','column3');
11. 什么情况下添加索引:
表的主关键词
表的字段唯一约束
直接条件查询的字段
查询中与它表关联的字段
查询中排序的字段
查询中统计或分组统计的字段
12.什么情况下应不建或者少建索引:
表记录太少
经常插入、删除、修改的表
数据重复且分布均匀的表字段
经常和主字段一起查询而且主字段索引值比较多的表字段
13.千万级Mysql数据库建立索引的事项以及提高性能的手段:
对查询进行优化,避免全表扫描
应尽量避免在where子句中对字段进行null值判断
应尽量避免在where子句中使用 != 或 <> 操作符
in 和 not in 慎用
避免使用通配符
如果在where子句中使用参数,也会导致全表查询
14.Mysql调优:
15.各种函数的用法:
16.查询语句(单表,多表):
分组查询:
group by 单独使用,查询结果只显示一个分组的一条记录。 : select * from table_tablename group by sex;
select
sex,group_concat(
name
)
from
employee
group
by
sex;
与集合函数一起使用: select
sex,
count
(sex)
from
employee
group
by
sex;
与HAVING一起使用:“having条件表达式”,可以限制输出结果。只有满足条件表达式的结果才显示。 elect
sex,
count
(sex)
from
employee
group
by
sex
having
count
(sex) >= 3;
按多组进行分组: select
*
from
employee
group
by
d_id,sex;
与with rollup一起使用,使用with rollup将会在所有记录的最后加上一条记录,这条记录是上面所有记录的总和
连接查询:
内连接查询:当两个表中具有相同意义的字段值相等时,就查询出该条记录。select num,name,employee.d_id,age,d_name from employee,department where employee.d_id = department.d_id因字段名相同,所以取d_id字 段值时最好指定哪张表的字段。
外连接查询: select 属性名列表 from 表名1 left|right join 表名2 on 表名1.属性名1=表名2.属性名2;左连接查询:进行左连接查询时,可以查出表名1中所指的表中所有记录。而表名2所指表中,只能查询出匹配的记录。
实例:select num,name,employee.d_id,age,d_name from employee left join department on employee.d_id = department.d_id;
与左连接相反,可以查询出表名2中的的所有记录,而表名1中所指的表中,只查询出匹配的记录。