数据库的创建,插入,查询,平均数,连接查询,嵌套查询,组合查询等

创建表:
CREATE TABLE Student(
    SNO VARCHAR(20),
    Name VARCHAR(10),
    Age INTEGER,
College VARCHAR(30)
);
CREATE TABLE Course(
    CourseID VARCHAR(15),
    CourseName VARCHAR(30),
    CourseBeforeID VARCHAR(15)
);
CREATE TABLE Choose(
SNO VARCHAR(20),
    CourseID VARCHAR(30),
    Score DECIMAL(5,2)
);
表中插入数据:
INSERT INTO student(SNO,Name,Age,College)
VALUES('S00001','张三',20,'计算机学院');

INSERT INTO course
VALUES('C1','计算机引论','');
INSERT INTO course
VALUES('c2','C语言','C1');
INSERT INTO course
VALUES('c3','数据结构','C2');

INSERT INTO choose
VALUES('S00001','C1',95);
INSERT INTO choose
VALUES('S00001','C2',80);
INSERT INTO choose
VALUES('S00001','C3',84);
INSERT INTO choose
VALUES('S00002','C1',80);
INSERT INTO choose
VALUES('S00002','C2',85);
INSERT INTO choose
VALUES('S00003','C1',78);
INSERT INTO choose
VALUES('S00003','C3',70);

查询数据:
SELECT SNO, Name from student WHERE College='计算机学院';

betwwwn and
SELECT Name,Age FROM student WHERE Age BETWEEN 20 AND 30;

count
SELECT COUNT(*) FROM student;

MAX
SELECT MAX(Score) from choose;

MIN
SELECT MIN(Score) from choose;

SUM
SELECT SUM(Score) from choose;

AVG 平均数
SELECT AVG(Score) from choose;

IS NULL
SELECT CourseID,CourseName FROM course WHERE CourseBeforeID IS NULL;

连接查询
SELECT CourseID,Name,College,Score FROM student left join choose ON student.SNO=choose.SNO;

exists
select * from student a where exists ( select 1 from student b where b.`name`='张三'and b.college=a.college)

嵌套查询
select SNO,Score from choose WHERE CourseID='C1' and Score<any(
SELECT Score FROM student,choose WHERE student.SNO =choose.SNO and CourseID ='C1' and `Name`='张三'
)

组合查询
UNION 用于合并两个或多个 SELECT 语句的结果集,并消去表中任何重复行。(UNION ALL 不消除重复行)
select SNO from choose WHERE CourseID='C1' UNION SELECT SNO FROM choose WHERE CourseID='C3';

UNION 和 DISTINCT
select DISTINCT SNO from choose WHERE CourseID='C1' UNION SELECT DISTINCT SNO FROM choose WHERE CourseID='C3';
SELECT DISTINCT SNO FROM student WHERE SNO in(SELECT SNO from choose WHERE CourseID='C1') UNION SELECT DISTINCT SNO FROM student WHERE SNO in (SELECT SNO FROM choose WHERE CourseID='C3');

where与having 的区别
作用相同,区别在俞having关键字可以跟聚合函数,而where关键字不能,通常与group by一起使用,区别对分组后的结果进行过滤

count(字段名)和count(*)有什么区别
一般没什么区别,但count(字段名)比count(*)效率更高

LIKE ‘[^s][^y][^s]%’ 与 NOT LIKE ‘sys%’ 有无区别?请加以验证?

IN 与 Exists 语句有何区别?
区别及应用场景
    in 和 exists的区别: 如果子查询得出的结果集记录较少,主查询中的表较大且又有索引时应该用in, 反之如果外层的主查询记录较少,子查询中的表大,又有索引时使用exists。其实我们区分in和exists主要是造成了驱动顺序的改变(这是性能变化的关键),如果是exists,那么以外层表为驱动表,先被访问,如果是IN,那么先执行子查询,所以我们会以驱动表的快速返回为目标,那么就会考虑到索引及结果集的关系了 ,另外IN时不对NULL进行处理。

    in 是把外表和内表作hash 连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询。一直以来认为exists比in效率高的说法是不准确的。

  not in 和not exists
    如果查询语句使用了not in 那么内外表都进行全表扫描,没有用到索引;而not extsts 的子查询依然能用到表上的索引。所以无论那个表大,用not exists都比not in要快。

非相关子查询和相关子查询区别?
非相关子查询是独立于外部查询的子查询,子查询总共执行一次,执行完毕后将值传递给外部查询,并且它是优先于外部查询先执行的,他执行了再执行外部。
相关子查询的执行依赖于外部查询的数据,外部查询执行一行,子查询就执行一次。并且是外部先查询一次,然后再执行一次内部查询!(由于他执行查询的次数多,可见他的效率并不高,可以用存储过程来代替他)

UNION 与 UNION ALL 有何差别,谁的性能高?
union会去除两个结果集相同的值,而union all不会。
因为union all没有去掉重复值的额外开销,所以通常效率更高。

全连接、左连接、右连接有什么不同?
交叉连接(CROSS JOIN):有两种,显式的和隐式的,不带ON子句,返回的是两表的乘积,也叫笛卡尔积。
left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录
right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录
inner join(等值连接) 只返回两个表中联结字段相等的行


LIKE ‘[^s][^y][^s]%’ 与 NOT LIKE ‘sys%’ 有无区别?请加以验证?
若要查阅非系统表的所有对象,请使用 NOT LIKE 'sys%'。如果共有 32 个对象且 LIKE 找到 13 个与模式匹配的名称,则 NOT LIKE 将找到 19 个与 LIKE 模式不匹配的对象。

使用 LIKE '[^s][^y][^s]%' 模式不一定每次找到的名称都相同。可能仅得到 14 个名称(而不是 19 个),除了系统表名称外,所有以 s 开始或第二个字母为 y 或第三个字母为 s 的名称也都将从结果中消除。这是因为用反向通配符匹配字符串是分步骤进行计算的,一次一个通配符。如果在计算过程中任一环节匹配失败,那么就会将其消除。

猜你喜欢

转载自www.cnblogs.com/quitpoison/p/10795520.html