Mysql子查询

1、表的操作
  (1)表的创建:create table 表名 (列名1 类型 约束, 列名2 类型 约束...)
CREATE TABLE a_table (
a_id int(11) DEFAULT NULL,
a_name varchar(10) DEFAULT NULL,
a_part varchar(10) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8

表的删除:drop table 表名
  表的更改:alter table 表名 add|drop 列名|约束名
  插入记录:insert into 表名... value...
  更新记录:update 表名 set 列名=值 where 条件
  删除记录:delete from 表名 where 条件
  查询记录:select 列名... from 表名 where 条件

2、什么是数据库约束,常见的约束有哪几种?
   约束可以分为:主键约束primary key、外键约束foreign key、唯一约束unique、检查约束check、空值约束not null、默认值约束default

3、主键和外键的区别?
 主键在本表中是唯一的,不可为空的,外键可以重复可以为空。外键和另一张表的主键关联,不能创建对应表中不存在的外键。

4、索引定义和优缺点
  对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。
  优缺点:优点:利用索引可以加速对数据的检索,索引是可以唯一的,创建索引允许指定单个列或者多个列
  缺点:减慢了数据录入速度,同时也增加了数据库的尺寸大小

5、order by和group by的区别?
 order by为排序查询、ASC升序  DESC降序
 group by为分组查询、having只能用于group by子句、作用于组内、having条件子句的查询语句需要使用聚合函数

6、sql的表连接方式有哪些?
内连接、外连接(分为左连接、右连接、全连接)、交叉连接
内连接:INNER JOIN 两边表同时有对应的数据,即任何一边缺失数据就不显示。
左连接LEFT JOIN 会读取左边数据表的全部数据,即便右边表无对应数据,如:A left(outer) join B;以A表为基础,A表的全部数据,B表有的组合,没有的为null。
右连接:RIGHT JOIN 会读取右边数据表的全部数据,即便左边表无对应数据,如:A right(outer) join B :以B表为基础,B表的全部数据,A表有的组合,没有的为null。
全连接 A full(outer) join :两表相同的组合在一起,A表有,B表没有的数据(显示为null),同样B表有,A表没有的显示为null;
交叉连接:cross join,即使笛卡尔乘积;
(1)建表语句
CREATE TABLE a_table (
a_id int(11) DEFAULT NULL,
a_name varchar(10) DEFAULT NULL,
a_part varchar(10) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
.
CREATE TABLE b_table (
b_id int(11) DEFAULT NULL,
b_name varchar(10) DEFAULT NULL,
b_part varchar(10) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8

(2)多表查询
INNER JOIN 两边表同时有对应的数据,即任何一边缺失数据就不显示。
LEFT JOIN 会读取左边数据表的全部数据,即便右边表无对应数据。
RIGHT JOIN 会读取右边数据表的全部数据,即便左边表无对应数据。
表测试数据:

(2)内连接
组合两个表中的记录,返回关联字段相符的记录,也就是返回两个表的交集(阴影)部分。
关键字:inner join on
语句:select * from a_table a inner join b_table b on a.a_id = b.b_id;
执行结果:

说明:组合两个表中的记录,返回关联字段相符的记录,也就是返回两个表的交集(阴影)部分。

(3)左连接(左外连接)
关键字:left join on / left outer join on
语句:select * from a_table a left join b_table b on a.a_id = b.b_id;
执行结果:

说明:
left join 是left outer join的简写,它的全称是左外连接,是外连接中的一种。左(外)连接,左表(a_table)的记录将会全部表示出来,而右表(b_table)只会显示符合搜索条件的记录。右表记录不足的地方均为NULL。

(4)右连接(右外连接)
关键字:right join on / right outer join on
语句:select * from a_table a  right outer join b_table b  on a.a_id = b.b_id;
执行结果:

说明:
right join是right outer join的简写,它的全称是右外连接,是外连接中的一种。
与左(外)连接相反,右(外)连接,左表(a_table)只会显示符合搜索条件的记录,而右表(b_table)的记录将会全部表示出来。左表记录不足的地方均为NULL。

(5) IN 运算符
 IN 运算符允许您在 WHERE 子句中指定多个值。
 IN 运算符是多个 OR 条件的简写。
SQL IN 语法
SELECT column_name(s)FROM table_nameWHERE column_name IN (value1, value2, ...);
或者
SELECT column_name(s)FROM table_nameWHERE column_name IN (SELECT STATEMENT);

in和not in的区别
select *from [表] where [value] in(1,9) or [value] not in(1,9);
查询和所有女生年龄相同的男生
select * from stu where sex='男' and age in(select age from stu where sex='女')
7、SQL 子查询
(1)子查询(Sub Query)或者说内查询(Inner Query),也可以称作嵌套查询(Nested Query),是一种嵌套在其他 SQL 查询的 WHERE 子句中的查询。
(2)子查询用于为主查询返回其所需数据,或者对检索数据进行进一步的限制。
(3)子查询可以在 SELECT、INSERT、UPDATE 和 DELETE 语句中,同 =、<、>、>=、<=、IN、BETWEEN 等运算符一起使用。
(4)使用子查询必须遵循以下几个规则:
 1)子查询必须括在圆括号中;
2)子查询的 SELECT 子句中只能有一个列,除非主查询中有多个列,用于与子查询选中的列相比较;
3)子查询不能使用 ORDER BY,不过主查询可以。在子查询中,GROUP BY 可以起到同 ORDER BY 相同的作用;
4)返回多行数据的子查询只能同多值操作符一起使用,比如 IN 操作符;
5)SELECT 列表中不能包含任何对 BLOB、ARRAY、CLOB 或者 NCLOB 类型值的引用;
6)子查询不能直接用在聚合函数中;
7)BETWEEN 操作符不能同子查询一起使用,但是 BETWEEN 操作符可以用在子查询中;

8、在数据库中查询语句速度很慢,如何优化?
      ① 建立索引
      ② 减少表之间的关联
      ③ 优化sql语句,尽量让sql很快定位数据,不要让sql做全表查询,应该走索引,把数据量大的排在前面
      ④ 简化查询字段,没用的字段不要
    ⑤ 尽量用PreparedStatement来查询,不要用Statement

9、如何在删除主表记录时,一并删除从表相关联的记录?
  如果两张表存在主外键关系,那么在删除主键表的记录时,如果从表有相关联的记录那么将导致删除失败;
   在定义外键约束时,可以同时指定3种删除策略:一是将从表记录一并删除(级联删除); 二是将从表记录外键字段设置为NULL;

10、列举几种常用的聚合函数?
   sum函数   avg函数  max函数    min函数   count函数

11、union和union all有什么不同?
   union在进行表连接后筛选重复的记录,所以在表连接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果;
   union all 只是简单地将两个结果合并后返回;
   从效率上说,union all比union快很多,所以,如果可以确认合并的两个结果集中不包括重复的数据的话,那么就使用union all

12、truncate和delete的区别?
   相同处:二者均删除表中的全部行
   不同处:① truncate table比delete速度快
            ② delete语句每次删除一行,并在事务日志中为所删除的每行记录一项;truncate通过释放存储数据所用的数据页来删除数据,并且只在事务日志中记录页的释放。
           ③ truncate table删除内容,释放空间但不删除定义
          ④ delete table删除内容,不删除定义但不释放空间
           ⑤ drop table删除内容和定义,释放空间

13、行转列、列转行怎么转?
      ① 使用decode函数
      ② 使用case when语句

14、什么是存储过程?存储过程的优缺点?
    存储过程一个预编译的sql语句,优点是允许模块化的设,就是说只需创建一次,以后在该程序中就可以调用多次,如果某次操作需要执行多次sql,使用存储过程比单纯的sql语句执行要快。
  存储过程的优缺点:
  优点:① 存储过程是预编译过的,执行效率高
          ② 存储过程的代码存放于数据库中,通过存储过程名直接调用,减少网络通讯。
         ③ 安全性高,执行存储过程需要有一定权限的用户
         ④ 存储过程可以重复使用,可减少数据库开发人员的工作量
  缺点:移植性差

如有侵权可以联系我进行删除。

posted on 2021-04-13 17:14  万能人  阅读(414)  评论(0编辑  收藏  举报

导航