mysql的增删改查

1.启动 Navicat for MySQL, 在 MySQL – 新建连接中完成连接参数配置。
2.登录到本地数据库服务器后, 连接到 test 数据库上。
3.用 Create Table 建立 Student 表,表结构如下所示:

属性名 类型 长度
SNO Varchar 20
Name Varchar 10
Age Integer
College Varchar 30


4.用 Create Table 建立 Course 表,表结构如下所示:

字段名 类型 长度
CourseID Varchar 15
CourseName Varchar 30
CourseBeforeID Varchar 15


5.用 Create Table 建立 Choose 表,表结构如下所示:

字段名 类型 长度
SNO Varchar 20
CourseID Varchar 30
Score DECIMAL 5,2



6.用 INSERT 语句向 Student 表中插入 3 个元组:
注意:每条元组一个完整的 INSERT 语句, 3 个元组需要写 3 个 INSERT 语句。

SNO Name Age College
S00001 张三 20 计算机学院
S00002 李四 19 通信学院
S00003 王五 21 计算机学院


7.用 INSERT 语句向 Course 表中插入 3 个元组:
注意:每条元组一个完整的 INSERT 语句, 3 个元组需要写 3 个 INSERT 语句。

CourseID CourseName CourseBeforeID
C1 计算机引论 空值(NULL)
C2 C 语言 C1
C3 数据结构 C2


8.用 INSERT 语句向 Choose 表中插入 7 个元组:
注意:每条元组一个完整的 INSERT 语句, 7 个元组需要写 7 个 INSERT 语句。

SNO CourseID Score
S00001 C1 95
S00001 C2 80
S00001 C3 84
S00002 C1 80
S00002 C2 85
S00003 C1 78
S00003 C3 70


9.用 SELECT 语句,查询计算机学院学生的学号和姓名。
10.用 SELECT 语句的 between…and…表示查询条件, 查询年龄在 20~23 岁的学
生信息。
11.用 SELECT 语句的 COUNT()聚集函数,统计 Student 表中学生总人数。
12.分别用 SELECT 语句的 max()、min()、sum()、avg()四个聚集函数,计算 Choose
表中 C1 课程的最高分、最低分、总分、平均分。
13.用 SELECT 语句对空值(NULL)的判断条件,查询 Course 表中先修课称编号为
空值的课程编号和课程名称。
14.用 SELECT 语句的连接查询,查询学生的学号、姓名、选修的课程名及成绩。
15.用 SELECT 的存在量词 EXISTS, 查询与“张三” 在同一个学院学习的学生信
息。
16.用 SELECT 语句的嵌套查询,查询选修 C1 课程的成绩低于“张三” 的学生的
学号和成绩。
17.用 SELECT 语句的组合查询(UNION),查询选修了 C1 课程或者选修了 C3 课程
的学生学号。
18.用 SELECT 语句的组合查询(UNION)与 DISTINCT 短语,查询选修了 C1 课程或
者选修了 C3 课程的学生学号,并取消重复的数据。
以上 SQL 语句请保存,以备老师检查和写实验报告之用。
七、思考与练习
1、 Where 与 Having 语句有何差别?
2、 Count(*)与 Count(字段名)有何差别?
3、 LIKE ‘[^s][^y][^s]%’ 与 NOT LIKE ‘sys%’ 有无区别?请加以验证?
4、 全连接、左连接、右连接有什么不同?
5、 IN 与 Exists 语句有何区别?
6、 不相关子查询、相关子查询有何区别?
7、 UNION 与 UNION ALL 有何差别,谁的性能高?

下面是答案

创建表:
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 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 的名称也都将从结果中消除。这是因为用反向通配符匹配字符串是分步骤进行计算的,一次一个通配符。如果在计算过程中任一环节匹配失败,那么就会将其消除。

转载于:https://www.cnblogs.com/quitpoison/p/9668821.html

你可能感兴趣的:(mysql的增删改查)