Mysql部分面试问题总结

多表查询

1.交叉查询(笛卡尔积)

交叉连接查询(基本不会使用-得到的是两个表的乘积) [了解]

语法:select * from A,B;

2.内连接查询

内连接查询是A和B的交集。(使用的关键字 inner join  -- inner可以省略)

  1. 隐式内连接:select * from A,B where 条件;
  2. 显示内连接:select * from A inner join B on 条件;

3.外连接

外连接查询(使用的关键字 outer join -- outer可以省略)

     左外连接:是A和B的交集再并上A的所有数据。显示关键词left左边表中的所有数据,右边表数据数据少了补NULL值,数据多了不显示;

     右外连接:是A和B的交集再并上B的所有数据。

  1. 左外连接:left outer join             语句: select * from A left outer join B on 条件;
  2. 右外连接:right outer join            语句:select * from A right outer join B on 条件;

1.左外连接:查询左表(A表)所有的数据,关联的右表(B表)数据是否显示,取决于条件是否成立,如果成立显示数据,如果不成立显示null。

##格式:select * from A left outer join B on 连接条件

2.右外连接:查询右表(B表)所有的数据,关联的左表(A表)数据是否显示,取决于条件是否成立,如果成立显示数据,如果不成立显示null。

##格式:select * from A right outer join B on 连接条件

聚合函数

  1. count:统计指定列不为NULL的记录行数;
  2. sum:计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0;
  3. max:计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算;
  4. min:计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算;
  5. avg:计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0;

例子:

/*聚合函数*/

/*1、count(列名) 统计个数*/

/*统计价格在800以上一共有多少商品*/

/*SELECT COUNT(*) as total from d_product where price>=800;*/

/*统计一共有几种价格*/

/*select count(DISTINCT price)from d_product;*/

/*2、sum 计算和值*/

/*统计价格的和值*/

/*select sum(price) from d_product;*/

/*3、max 获取最大值*/

/*获取价格最大的商品的价格*/

/*select max(price) from d_product;*/

/*4、min 获取最小值*/

/*获取价格最小的商品的价格*/

/*select min(price) from d_product;*/

/*5、avg 获取平均值*/

/*获取所有商品的平均价格*/

select avg(price) from d_product;

limit用法

SELECT * FROM table LIMIT 5,10; // 检索记录行 6-15
//如果只给定一个参数,它表示返回最大的记录行数目: 
mysql> SELECT * FROM table LIMIT 5; //检索前 5 个记录行,换句话说,LIMIT n 等价于 LIMIT 0,n。

分页查询语句

客户端通过传递start(页码),limit(每页显示的条数)两个参数去分页查询数据库表中的数据,那我们知道MySql数据库提供了分页的函数limit m,n,但是该函数的用法和我们的需求不一样,所以就需要我们根据实际情况去改写适合我们自己的分页语句,具体的分析如下:

比如:

查询第1条到第10条的数据的sql是:select * from table limit 0,10;   ->对应我们的需求就是查询第一页的数据:select * from table limit (1-1)*10,10;

查询第10条到第20条的数据的sql是:select * from table limit 10,20;  ->对应我们的需求就是查询第二页的数据:select * from table limit (2-1)*10,10;

查询第20条到第30条的数据的sql是:select * from table limit 20,30;  ->对应我们的需求就是查询第三页的数据:select * from table limit (3-1)*10,10;

通过上面的分析,可以得出符合我们自己需求的分页sql格式是:select * from table limit (start-1)*limit,limit; 其中start是页码,limit是每页显示的条数。

分组查询

分组查询是指使用group by字句对查询信息进行分组。

  1. 格式:

SELECT 字段1,字段2… FROM 表名 GROUP BY分组字段 HAVING 分组条件;

分组操作中的having子语句,是用于在分组后对数据进行过滤的,作用类似于where条件。

  1. having与where的区别:
    1. having是在分组后对数据进行过滤+++where是在分组前对数据进行过滤

              2.having后面可以使用分组函数(统计函数)+++where后面不可以使用分组函数。

一条sql中有where having group by的时候,顺序是 where  group by having

where和having都可以使用的场景:

    select price,name from goods where price > 100
    select price,name from goods having price > 100

说明:having可用的前提是已经筛选出了price字段,在这种情况下和where的效果是等效的,But如果没有select price 就会报错!!因为having是从前筛选的字段再筛选,而where是从数据表中的字段直接进行的筛选的。

只可以用where,不可以用having的情况

    select name from goods where price> 100
    select name from goods having price> 100 //报错!!!因为select没有筛选出price 字段,having不能用,而where是对表进行检索price。100

只可以用having,不可以用where情况

查询每种id 商品价格的平均值,获取平均价格大于100元的商品信息

    select id, avg(price) as agprice from goods group by id having agprice > 100
    select id, avg(price) as agprice from goods where agprice>100 group by id //报错!!因为from goods这表里面没有agprice这个字段

Mysql中的事务:

事务(transaction)是作为一个单元的一组有序的数据库操作。如果组中的所有操作都成功,则认为事务成功,即使只有一个操作失败,事务也不成功。如果所有操作完成,事务则提交,其修改将作用于所有其他数据库进程。如果一个操作失败,则事务将回滚,该事务所有操作的影响都将取消。ACID 四大特性,原子性、隔离性、一致性、持久性。

事务回滚:要同时修改数据库中两个不同表时,如果它们不是一个事务的话,当第一个表修改完,可能第二个表修改过程中出现了异常而没能修改,此时就只有第二个表依旧是未修改之前的状态,而第一个表已经被修改完毕。而当你把它们设定为一个事务的时候,当第一个表修改完,第二表修改出现异常而没能修改,第一个表和第二个表都要回到未修改的状态,这就是所谓的事务回滚。

事务特性:

(1)原子性:即不可分割性,事务要么全部被执行,要么就全部不被执行。

(2)一致性或可串性。事务的执行使得数据库从一种正确状态转换成另一种正确状态

(3)隔离性。在事务正确提交之前,不允许把该事务对数据的任何改变提供给任何其他事务,

(4) 持久性。事务正确提交后,其结果将永久保存在数据库中,即使在事务提交后有了其他故障,事务的处理结果也会得到保存。

或者这样理解:

事务就是被绑定在一起作为一个逻辑工作单元的SQL语句分组,如果任何一个语句操作失败那么整个操作就被失败,以后操作就会回滚到操作前状态,或者是上有个节点。为了确保要么执行,要么不执行,就可以使用事务。要将有组语句作为事务考虑,就需要通过ACID测试,即原子性,一致性,隔离性和持久性。

SQL语言包括哪几部分?每部分都有哪些操作关键字?

答:SQL语言包括数据定义(DDL)、数据操纵(DML),数据控制(DCL)和数据查询(DQL)四个部分。

数据定义:Create Table,Alter Table,Drop Table, Craete/Drop Index等

数据操纵:Select ,insert,update,delete,

数据控制:grant,revoke

数据查询:select

完整性约束包括哪些?


答:数据完整性(Data Integrity)是指数据的精确(Accuracy)和可靠性(Reliability)。

分为以下四类:

1) 实体完整性:规定表的每一行在表中是惟一的实体。

2) 域完整性:是指表中的列必须满足某种特定的数据类型约束,其中约束又包括取值范围、精度等规定。

3) 参照完整性:是指两个表的主关键字和外关键字的数据应一致,保证了表之间的数据的一致性,防止了数据丢失或无意义的数据在数据库中扩散。

4) 用户定义的完整性:不同的关系数据库系统根据其应用环境的不同,往往还需要一些特殊的约束条件。用户定义的完整性即是针对某个特定关系数据库的约束条件,它反映某一具体应用必须满足的语义要求。

与表有关的约束:包括列约束(NOT NULL(非空约束))和表约束(PRIMARY KEY、foreign key、check、UNIQUE) 。

主键、外键和索引的区别?


主键、外键和索引的区别

定义:

 主键–唯一标识一条记录,不能有重复的,不允许为空

 外键–表的外键是另一表的主键, 外键可以有重复的, 可以是空值

 索引–该字段没有重复值,但可以有一个空值

作用:

 主键–用来保证数据完整性

 外键–用来和其他表建立联系用的

 索引–是提高查询排序的速度

个数:

 主键–主键只能有一个

 外键–一个表可以有多个外键

 索引–一个表可以有多个唯一索引

char和varchar的区别?


答:是一种固定长度的类型,varchar则是一种可变长度的类型,它们的区别是:  

char(M)类型的数据列里,每个值都占用M个字节,如果某个长度小于M,MySQL就会在它的右边用空格字符补足.(在检索操作中那些填补出来的空格字符将被去掉)在varchar(M)类型的数据列里,每个值只占用刚好够用的字节再加上一个用来记录其长度的字节(即总长度为L+1字节).  

发布了56 篇原创文章 · 获赞 84 · 访问量 9875

猜你喜欢

转载自blog.csdn.net/qq_39182939/article/details/105221089