Java面试题之--------MySql

想起来什么写什么比较随意。

一、连表查询方式(仔细品味,想想其实超级简单)

Left join

1、左连接的定义:是以左表为基础,根据ON后给出的两表的条件将两表连接起来。结果会将左表所有的查询信息列出,而右表只列出ON后条件与左表满足的部分。左连接全称为左外连接,是外连接的一种。

right join

2、右连接的定义,是以右表为基础,根据ON后给出的两表的条件将两表连接起来。结果会将右表所有的查询信息列出,而左表只列出ON后条件与右表满足的部分。右连接全称为右外连接,是外连接的一种。

inner join

3、内连接:使用比较运算符根据每个表共有的列的值匹配两个表中的行。

二、mysql的索引(看情况使用,也是超级简单)

mysql的索引分为单列索引(主键索引,唯一索引,普通索引)和组合索引.

关于MySQL索引的好处,如果正确合理设计并且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮车。对于没有索引的表,单表查询可能几十万数据就是瓶颈,而通常大型网站单日就可能会产生几十万甚至几百万的数据,没有索引查询会变的非常缓慢。还是以WordPress来说,其多个数据表都会对经常被查询的字段添加索引,比如wp_comments表中针对5个字段设计了BTREE索引。

1、 普通的索引

目的很简单就是为了提高访问的速度。

-直接添加

CREATE INDEX IndexName ON `TableName`(`字段名`(length))

–修改表结构的方式添加索引

ALTER TABLE TableName ADD INDEX IndexName(`字段名`(length))

第一种方式 :

CREATE INDEX account_Index ON award(account(10));

第二种方式: 

ALTER TABLE award ADD INDEX account_Index(account(10))

2、 唯一索引

创建唯一索引的目的不是为了提高访问速度,而只是为了避免数据出现重复。唯一索引可以有多个但索引列的值必须唯一,索引列的值允许有空值。如果能确定某个数据列将只包含彼此各不相同的值,在为这个数据列创建索引的时候就应该使用关键字UNIQUE,把它定义为一个唯一索引。

第一种方式 :

CREATE UNIQUE INDEX IndexName ON `TableName`(`字段名`(length));

第二种方式: 

 ALTER TABLE TableName ADD UNIQUE (column_list)  

 

CREATE UNIQUE INDEX account_UNIQUE_Index ON `award`(account(10));

3、主键索引

不允许有空值,(在B+TREE中的InnoDB引擎中,主键索引起到了至关重要的地位)

主键索引建立的规则是 int优于varchar,一般在建表的时候创建,最好是与表的其他字段不相关的列或者是业务不相关的列.一般会设为 int 而且是 AUTO_INCREMENT自增类型的。

4、组合索引

需要加索引的字段,要在where条件中

数据量少的字段不需要加索引

如果where条件中是OR关系,加索引不起作用

符合最左原则

一个表中含有多个单列索引不代表是组合索引,通俗一点讲 组合索引是:包含多个字段但是只有索引名称

其sql格式是 CREATE INDEX IndexName On `TableName`(`字段名`(length),`字段名`(length),...);

CREATE INDEX nickname_account_createdTime_Index ON `award`(`nickname`, `account`, `created_time`);

个人理解就是一个一个建立普通索引的话太麻烦,不如以一下子就建立一个组合索引。.

注意事项:(组合索引无效的时候)组合和复合一个概念。

对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分。例如索引是key index (a,b,c). 可以支持a | a,b| a,b,c 3种组合进行查找,但不支持 b,c进行查找 .当最左侧字段是常量引用时,索引就十分有效。

所以说创建复合索引时,应该仔细考虑列的顺序。对索引中的所有列执行搜索或仅对前几列执行搜索时,复合索引非常有用;仅对后面的任意列执行搜索时,复合索引则没有用处。

三、视图(很有用,但是经常被忽略)

总而言之,使用视图的大部分情况是为了保障数据安全性,提高查询效率。

使用show create view语句查看视图信息

视图的更改:

create or replace view view_name as select语句;

在视图存在的情况下可对视图进行修改,视图不在的情况下可创建视图

删除:

drop view 视图名称;

视图的作用实在是太强大了,以下是我体验过的好处:

作用一:

    提高了重用性,就像一个函数。如果要频繁获取user的name和goods的name。就应该使用以下sql语言。示例:

        select a.name as username, b.name as goodsname from user as a, goods as b, ug as c where a.id=c.userid and c.goodsid=b.id;

    但有了视图就不一样了,创建视图other。示例

        create view other as select a.name as username, b.name as goodsname from user as a, goods as b, ug as c where a.id=c.userid and c.goodsid=b.id;

    创建好视图后,就可以这样获取user的name和goods的name。示例:

        select * from other;

    以上sql语句,就能获取user的name和goods的name了。

作用二:

    对数据库重构,却不影响程序的运行。假如因为某种需求,需要将user拆房表usera和表userb,该两张表的结构如下:

        测试表:usera有id,name,age字段

        测试表:userb有id,name,sex字段

    这时如果php端使用sql语句:select * from user;那就会提示该表不存在,这时该如何解决呢。解决方案:创建视图。以下sql语句创建视图:

        create view user as select a.name,a.age,b.sex from usera as a, userb as b where a.name=b.name;

        以上假设name都是唯一的。此时php端使用sql语句:select * from user;就不会报错什么的。这就实现了更改数据库结构,不更改脚本程序的功能了。

作用三:

    提高了安全性能。可以对不同的用户,设定不同的视图。例如:某用户只能获取user表的name和age数据,不能获取sex数据。则可以这样创建视图。示例如下:

        create view other as select a.name, a.age from user as a;

    这样的话,使用sql语句:select * from other; 最多就只能获取name和age的数据,其他的数据就获取不了了。

作用四:

    让数据更加清晰。想要什么样的数据,就创建什么样的视图。经过以上三条作用的解析,这条作用应该很容易理解了吧

 

 

你可能感兴趣的:(数据库)