/*  多表查询  */-- 准备数据
-- 创建部门表
CREATE TABLE tb_dept (id INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(20)
);INSERT INTO tb_dept (NAME) VALUES ('开发部'),('市场部'),('财务部'),('销售部');-- 创建员工表
CREATE TABLE tb_emp (id INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(10),gender CHAR(1),   -- 性别salary DOUBLE,   -- 工资join_date DATE,  -- 入职日期dept_id INT
);INSERT INTO tb_emp(NAME,gender,salary,join_date,dept_id) VALUES('孙悟空','男',7200,'2013-02-24',1);
INSERT INTO tb_emp(NAME,gender,salary,join_date,dept_id) VALUES('猪八戒','男',3600,'2010-12-02',2);
INSERT INTO tb_emp(NAME,gender,salary,join_date,dept_id) VALUES('唐僧','男',9000,'2008-08-08',2);
INSERT INTO tb_emp(NAME,gender,salary,join_date,dept_id) VALUES('白骨精','女',5000,'2015-10-07',3);
INSERT INTO tb_emp(NAME,gender,salary,join_date,dept_id) VALUES('蜘蛛精','女',4500,'2011-03-14',1);
INSERT INTO tb_emp VALUES (NULL, '白龙马', '男', 1, '2020-02-02', NULL);-- 查询孙悟空员工的信息, 包括所在的部门名称
-- 一次查询多张表
-- 左表的每条数据和右表的每条数据组合,这种效果称为笛卡尔乘积。
SELECT * FROM tb_emp,tb_dept;-- 去掉笛卡尔积
-- 去掉笛卡尔积的条件称为: 表连接条件
SELECT * FROM tb_emp INNER JOIN tb_dept ON tb_emp.dept_id=tb_dept.id;-- 在加上查询员工名字为孙悟空
SELECT * FROM tb_emp INNER JOIN tb_dept ON tb_emp.dept_id=tb_dept.id WHERE tb_emp.NAME='孙悟空';-- 扩展:给表取别名,表取了别名后,只能使用别名啦!否则会报错
SELECT * FROM tb_emp e INNER JOIN tb_dept d ON e.dept_id=d.id WHERE e.NAME='孙悟空';/* ===========显式内连接=========== */
-- 显式内连接 INNER JOIN...ON-- INNER可以省略,初学者不建议省略
SELECT * FROM tb_emp e INNER JOIN tb_dept d ON e.dept_id=d.id;/* ===========左外连接查询=========== */
-- 左外连接查询 (满足要求的显示,保证左表不满足要求的也显示)
SELECT * FROM tb_emp e LEFT OUTER JOIN tb_dept d ON e.dept_id=d.id;/* ===========右外连接=========== */
-- 右外连接
SELECT * FROM tb_emp e RIGHT OUTER JOIN tb_dept d ON e.dept_id=d.id;-- 一般在工作中我们都使用左外, 右外可以转成左外, 我们中国人的书写顺序,从左到右/* ===========子查询结果=========== */
-- 子查询结果的三种情况
-- 1.单行单列(一个值)
-- 2.多行单列(多个值)
-- 3.多行多列 (虚拟的表)/* ===========子查询的结果是单行单列=========== */
-- 查询工资最高的员工是谁?
-- 1.查询最高工资
-- 2.通过最高工资查询员工姓名
SELECT MAX(salary) FROM tb_emp;
SELECT NAME FROM tb_emp WHERE salary = (SELECT MAX(salary) FROM tb_emp);
-- 子查询心得:建议先写好一条SQL,再复制到另一个SQL语句中/* ===========子查询的结果是多行单列的时候=========== */
-- 查询工资大于5000的员工, 来自于哪些部门的名字
-- 1.查询工资大于5000的员工所在部门id
-- 2.根据部门id查找部门名称
SELECT dept_id FROM tb_emp WHERE salary > 5000;
SELECT NAME FROM tb_dept WHERE id IN (SELECT dept_id FROM tb_emp WHERE salary > 5000);/* ===========子查询的结果是多行多列=========== */
-- 查询出2011年以后入职的员工信息, 包括部门名称
-- 1.查询出2011年以后入职的员工信息
SELECT * FROM tb_emp WHERE join_date >= '2011-01-01';
-- 2.找到对应的部门信息
SELECT * FROM (SELECT * FROM tb_emp WHERE join_date >= '2011-01-01') e LEFT OUTER JOIN tb_dept d ON e.dept_id=d.id;/* ===========多表查询练习=========== */
-- 准备数据
-- 部门表
CREATE TABLE dept (id INT PRIMARY KEY, -- 部门iddname VARCHAR(50), -- 部门名称loc VARCHAR(50) -- 部门位置
);-- 添加4个部门
INSERT INTO dept(id,dname,loc) VALUES
(10,'教研部','北京'),
(20,'学工部','上海'),
(30,'销售部','广州'),
(40,'财务部','深圳');-- 职务表, 职务名称, 职务描述
CREATE TABLE job (id INT PRIMARY KEY,jname VARCHAR(20),description VARCHAR(50)
);-- 添加4个职务
INSERT INTO job (id, jname, description) VALUES
(1, '董事长', '管理整个公司, 接单'),
(2, '经理', '管理部门员工'),
(3, '销售员', '向客人推销产品'),
(4, '文员', '使用办公软件');-- 员工表
CREATE TABLE emp (id INT PRIMARY KEY, -- 员工idename VARCHAR(50), -- 员工姓名job_id INT, -- 职务idmgr INT , -- 上级领导joindate DATE, -- 入职日期salary DECIMAL(7,2), -- 工资bonus DECIMAL(7,2), -- 奖金dept_id INT, -- 所在部门编号CONSTRAINT emp_jobid_ref_job_id_fk FOREIGN KEY (job_id) REFERENCES job (id),CONSTRAINT emp_deptid_ref_dept_id_fk FOREIGN KEY (dept_id) REFERENCES dept (id)
);-- 添加员工
INSERT INTO emp(id,ename,job_id,mgr,joindate,salary,bonus,dept_id) VALUES
(1001,'孙悟空',4,1004,'2000-12-17','8000.00',NULL,20),
(1002,'卢俊义',3,1006,'2001-02-20','16000.00','3000.00',30),
(1003,'林冲',3,1006,'2001-02-22','12500.00','5000.00',30),
(1004,'唐僧',2,1009,'2001-04-02','29750.00',NULL,20),
(1005,'李逵',4,1006,'2001-09-28','12500.00','14000.00',30),
(1006,'宋江',2,1009,'2001-05-01','28500.00',NULL,30),
(1007,'刘备',2,1009,'2001-09-01','24500.00',NULL,10),
(1008,'猪八戒',4,1004,'2007-04-19','30000.00',NULL,20),
(1009,'罗贯中',1,NULL,'2001-11-17','50000.00',NULL,10),
(1010,'吴用',3,1006,'2001-09-08','15000.00','0.00',30),
(1011,'沙僧',4,1004,'2007-05-23','11000.00',NULL,20),
(1012,'李逵',4,1006,'2001-12-03','9500.00',NULL,30),
(1013,'小白龙',4,1004,'2001-12-03','30000.00',NULL,20),
(1014,'关羽',4,1007,'2002-01-23','13000.00',NULL,10);-- 工资等级表
CREATE TABLE salarygrade (grade INT PRIMARY KEY,losalary INT,hisalary INT
);-- 添加5个工资等级
INSERT INTO salarygrade(grade,losalary,hisalary) VALUES
(1,7000,12000),
(2,12010,14000),
(3,14010,20000),
(4,20010,30000),
(5,30010,99990);-- 多表查询规律分三步走:
-- 1.根据需求明确查询哪些表
-- 2.明确表连接条件去掉笛卡尔积
-- 3.后续的查询-- 练习1
-- 查询有职务的员工信息。显示员工编号, 员工姓名, 工资, 职务名称, 职务描述
-- 多表查询规律
-- 1.根据需求明确查询哪些表  emp,job
SELECT * FROM emp INNER JOIN job;
-- 2.明确表连接条件去掉笛卡尔积
SELECT * FROM emp INNER JOIN job ON emp.job_id = job.id;
-- 3.后续的查询
SELECT
emp.id AS 员工编号,
emp.ename AS 员工姓名,
emp.salary AS 工资,
job.jname AS 职务名称,
job.description AS 职务的描述
FROM emp INNER JOIN job ON emp.job_id = job.id;-- 练习2
-- 查询有职务和部门的员工信息。显示员工编号, 员工姓名, 工资, 职务名称, 职务描述, 部门名称, 部门位置
-- 1.根据需求明确查询哪些表 emp, job, dept
SELECT * FROM emp
INNER JOIN job
INNER JOIN dept;
-- 2.明确表连接条件去掉笛卡尔积
SELECT * FROM emp
INNER JOIN job ON emp.job_id = job.id
INNER JOIN dept ON emp.dept_id = dept.id;
-- 3.后续的查询
SELECT
emp.id AS 员工编号,
emp.ename AS 员工姓名,
emp.salary AS 工资,
job.jname AS 职务名称,
job.description AS 职务描述,
dept.dname AS 部门名称,
dept.loc AS 部门位置
FROM emp
INNER JOIN job ON emp.job_id = job.id
INNER JOIN dept ON emp.dept_id = dept.id;-- 练习3
-- 查询有部门的经理的信息。显示员工姓名, 工资, 职务名称, 职务描述, 部门名称, 部门位置, 工资等级
-- 1.根据需求明确查询哪些表 emp,job,dept,salarygrade
SELECT * FROM emp
INNER JOIN job
INNER JOIN dept
INNER JOIN salarygrade
-- 2.明确表连接条件去掉笛卡尔积
SELECT * FROM emp
INNER JOIN job ON emp.job_id = job.id
INNER JOIN dept ON emp.dept_id = dept.id
INNER JOIN salarygrade ON emp.salary BETWEEN salarygrade.losalary AND salarygrade.hisalary;
-- 3.后续的查询
SELECT
emp.ename 员工姓名,
emp.salary 工资,
job.jname 职务名称,
job.description 职务描述,
dept.dname 部门名称,
dept.loc 部门位置,
salarygrade.grade 工资等级
FROM emp
INNER JOIN job ON emp.job_id = job.id
INNER JOIN dept ON emp.dept_id = dept.id
INNER JOIN salarygrade ON emp.salary BETWEEN salarygrade.losalary AND salarygrade.hisalary
WHERE job.jname = '经理';-- 练习4
-- 查询出所有部门编号、部门名称、部门位置、部门人数
-- 1.根据需求明确查询哪些表 dept,emp
SELECT * FROM dept INNER JOIN emp;
-- 2.明确表连接条件去掉笛卡尔积
SELECT * FROM dept INNER JOIN emp ON dept.id = emp.dept_id;
-- 3.后续的查询
SELECT
dept.id 部门编号,
dept.dname 部门名称,
dept.loc 部门位置,
COUNT(emp.id)
FROM dept LEFT OUTER JOIN emp ON dept.id = emp.dept_id GROUP BY dept.id;-- 练习5
-- 列出所有员工的姓名及其直接上级领导的姓名,
-- 没有上级领导的员工也需要显示,显示自己的名字和领导的名字
-- 1.根据需求明确查询哪些表 emp,emp   自己直接关联自己会报错:Not unique table/alias: 'emp'
SELECT * FROM emp INNER JOIN emp;
-- 2.明确表连接条件去掉笛卡尔积
SELECT * FROM emp pt LEFT OUTER JOIN emp ld ON pt.mgr = ld.id;
-- 3.后续的查询
SELECT pt.ename 员工姓名,ld.ename 领导姓名FROM emp pt LEFT OUTER JOIN emp ld ON pt.mgr = ld.id;-- 练习6-- 1.使用建库语句创建数据库,创建数据库名称:book_sys。CREATE DATABASE book_sys;
USE book_sys;-- 2.使用建表语句完成上面三张表的创建
-- 3.请参考数据表的要求设置主外键及字段类型要求,要建立外键与主键
CREATE TABLE student(stuID VARCHAR(10) PRIMARY KEY ,stuName VARCHAR(10),major VARCHAR(50)
);
CREATE TABLE book(BID VARCHAR(10) PRIMARY KEY,title VARCHAR(50),author VARCHAR(20)
);
CREATE TABLE borrow(borrowID VARCHAR(10) PRIMARY KEY,stuID VARCHAR(10),BID VARCHAR(10),T_time DATETIME,-- 借书时间B_time DATETIME,-- 还书时间FOREIGN KEY(stuID) REFERENCES student(stuID),FOREIGN KEY(BID) REFERENCES book(BID)
);-- 4.插入数据
INSERT INTO book VALUES
('B001', '人生若只如初见', '安意如'),
('B002', '入学那天遇见你', '晴空'),
('B003', '感谢折磨你的人', '如娜'),
('B004', '我不是教你诈', '刘庸'),
('B005', '英语四级', '白雪');INSERT INTO student VALUES
('1001', '林林', '计算机'),
('1002', '白杨', '计算机'),
('1003', '虎子', '英语'),
('1004', '北漂的雪', '工商管理'),
('1005', '五月', '数学');INSERT INTO borrow VALUES
('T001', '1001', 'B001', '2017-12-26 00:00:00', NULL),
('T002', '1004', 'B003', '2018-01-05 00:00:00', NULL),
('T003', '1005', 'B001', '2017-10-08 00:00:00', '2017-12-25 00:00:00'),
('T004', '1005', 'B002', '2017-12-16 00:00:00', '2018-01-07 00:00:00'),
('T005', '1002', 'B004', '2017-12-22 00:00:00', NULL),
('T006', '1005', 'B005', '2018-01-06 00:00:00', NULL),
('T007', '1002', 'B001', '2017-09-11 00:00:00', NULL),
('T008', '1005', 'B004', '2017-12-10 00:00:00', NULL),
('T009', '1004', 'B005', '2017-10-16 00:00:00', '2017-12-18 00:00:00'),
('T010', '1002', 'B002', '2017-09-15 00:00:00', '2018-01-05 00:00:00'),
('T011', '1004', 'B003', '2017-12-28 00:00:00', NULL),
('T012', '1002', 'B003', '2017-12-30 00:00:00', NULL);-- 5.查询“计算机”专业学生在“2017-12-15”至“2018-1-8”时间段内借书的学生编号、学生名称、图书编号、图书名称、借出日期;SELECT student.stuID AS 学生编号,student.stuName AS 学生名称,borrow.BID AS 图书编号,book.title 图书名称,borrow.T_time 借出日期
FROM student INNER JOIN borrow ON student.stuID=borrow.stuIDINNER JOIN book ON borrow.BID=book.BID
WHERE student.major='计算机' AND borrow.T_time BETWEEN '2017-12-15' AND '2018-1-8';-- 6.查询所有借过图书的学生编号、学生名称、专业;
-- 6.1.先查询到所有借阅过图书学生的编号
SELECT DISTINCT stuID FROM borrow;-- 6.2.根据所有借阅过图书学生的编号查询学生的信息
SELECT * FROM student WHERE stuID IN (SELECT DISTINCT stuID FROM borrow);-- 7.查询借过作者为“安意如”的图书的学生姓名、图书名称、借出日期、归还日期;
SELECTstudent.`stuName` 学生姓名,book.`title` 图书名称,borrow.`T_time` 借出日期,borrow.`B_time` 归还日期
FROMstudent INNER JOIN borrow ON borrow.`stuID`=student.`stuID`INNER JOIN book ON borrow.`BID`=book.`BID`
WHEREbook.`author`='安意如';-- 8.查询目前借书但未归还图书的学生名称及未还图书数量;
-- 什么是借书但未归还图书: ?
SELECT s.stuName 学生姓名,COUNT(b.stuID) 未还图书数量 FROM student s INNER JOIN borrow b ON s.stuID=b.stuID WHERE B_time IS NULL AND T_time IS NOT NULLGROUP BY s.stuName;------------------------------------------------------------------------------------/*
约束使用方式:一、可以在建完表之后再添加(很少这么干,了解)二、一般都是在创建表的时候直接加约束(经常)为什么呢?
因为当表创建完毕之后,有可能会添加数据。如果已添加的数据跟约束冲突了,那么此时约束就加不上去了。
所以,我们一般是在创建表的时候就直接加约束了,因为在创建表的时候里面肯定是没有任何数据的。
*//* =========== 主键约束 ===========主键是唯一且不能为null ,如果是主键是自增的可以写null
*/
-- 创建表学生表st1, 包含字段(id, name, age)将id做为主键
-- 创建表时添加主键
DROP TABLE st1;
CREATE TABLE st1 (id INT PRIMARY KEY,NAME VARCHAR(10),age INT
);INSERT INTO st1 VALUES (1, '刘德华', 60);
INSERT INTO st1 VALUES (2, '郭富城', 58);-- 演示主键约束: 唯一Duplicate entry '2' for key 'st1.PRIMARY'
INSERT INTO st1 VALUES (2, '郭大城', 58);
--  演示主键约束:非空Column 'id' cannot be null
INSERT INTO st1 VALUES (NULL, '郭富城', 58);-- 删除主键约束,一个表的主键只能有一个
ALTER TABLE st1 DROP PRIMARY KEY;
-- 在已有表中添加主键约束(了解)
ALTER TABLE st1 ADD PRIMARY KEY(id)/* =========== 主键自动增长 =========== */
-- 创建学生表st2, 包含字段(id, name, age)将id做为主键并自动增长
CREATE TABLE st2 (id INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(10),age INT
);-- 主键默认从1开始自动增长: i++
INSERT INTO st2 (NAME, age) VALUES ('貂蝉', 28);
INSERT INTO st2 (NAME, age) VALUES ('西施', 18);
INSERT INTO st2 (NAME, age) VALUES ('王昭君', 26);
INSERT INTO st2 (NAME, age) VALUES ('杨玉环', 22);
INSERT INTO st2 (NAME, age) VALUES ('关羽', 28);
SELECT * FROM st2;-- 修改自动增长的开始值(面试题)
ALTER TABLE st2 AUTO_INCREMENT = 100;
-- id从100开始
INSERT INTO st2 (NAME, age) VALUES ('刘备', 29); /* =========== 唯一约束 =========== */
/* =========== 非空约束 =========== */
/* =========== 默认值约束 =========== */
CREATE TABLE emp (id INT PRIMARY KEY AUTO_INCREMENT, -- 员工id,主键且自增长ename VARCHAR(50) UNIQUE NOT NULL, -- 员工姓名,非空并且唯一joindate DATE NOT NULL, -- 入职日期,非空salary DOUBLE(7,2) NOT NULL, -- 工资,非空bonus DOUBLE(7,2) DEFAULT 1000 -- 奖金,如果没有奖金默认为1000
);INSERT INTO emp(id, ename, joindate, salary, bonus) VALUES(1, '张三', '1999-11-11', 8800, 5000);
INSERT INTO emp(id, ename, joindate, salary, bonus) VALUES(2, '李四', '1999-11-11', 8800, 5000);-- 演示非空约束,当给ename设为UNIQUE NOT NULL时,Column 'ename' cannot be null
INSERT INTO emp(id, ename, joindate, salary, bonus) VALUES(3, NULL, '1999-11-11', 8800, 5000);-- 演示唯一约束  Duplicate entry '李四' for key 'emp.ename'
INSERT INTO emp(id, ename, joindate, salary, bonus) VALUES(3, '李四','1999-11-11', 8800, 5000);-- 演示默认约束
INSERT INTO emp(id, ename, joindate, salary) VALUES(3, '王五', '1999-11-11', 8800);
SELECT * FROM emp;-- 面试题: 主键是唯一和非空,普通的字段我们也可以添加唯一和非空,有区别吗?
/*
一张表只有一个主键
一张表可以有多个唯一非空的字段
*//* =========== 外键约束约束 =========== */
-- 创建部门表
CREATE TABLE department (id INT PRIMARY KEY AUTO_INCREMENT,dep_name VARCHAR(20),dep_location VARCHAR(20)
);-- 创建员工表
CREATE TABLE employee (id INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(20),age INT,dep_id INT
);-- 添加2个部门
INSERT INTO department (dep_name, dep_location) VALUES ('研发部', '广州'), ('销售部', '深圳');-- 添加员工,dep_id表示员工所在的部门
INSERT INTO employee (NAME, age, dep_id) VALUES
('张三', 20, 1),
('李四', 21, 1),
('王五', 20, 1),
('老王', 20, 2),
('大王', 22, 2),
('小王', 18, 2);-- 删除从表 employee
DROP TABLE employee;-- 创建 employee 并添加外键约束
CREATE TABLE employee (id INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(20),age INT,dep_id INT,CONSTRAINT fk_dep_id FOREIGN KEY(dep_id) REFERENCES department(id));-- 正常添加数据
INSERT INTO employee VALUES(NULL,'张三',18,1);-- 添加不正常的数据,报错: Cannot add or update a child row: a foreign key constraint fails
INSERT INTO employee VALUES(NULL,'张五',20,9);-- 删除外键约束(了解)
ALTER TABLE employee DROP FOREIGN KEY fk_dep_id;-- 在已有表添加外键约束, 外键约束可以省略: CONSTRAINT 外键约束名 (了解)
-- 省略CONSTRAINT外键约束名 数据库会自动设置外键约束的名字,我们要到 `3信息` 中查找
ALTER TABLE employee ADD FOREIGN KEY(dep_id) REFERENCES department(id); -- 数据库设计
-- 一对多,就在多的那边建立外键
-- 多对多,就建立第三方中间表,中间表包含两个外键,分别关联两方表
-- 一对一,在任意一方加入外键,关联另一方主键,并且设置外键为唯一(UNIQUE)

小测试

【单选题】
SQL中,“AGE IN(20,22)”的语义是( D )。
A: AGE<=22 AND AGE >=20
B: AGE <22 AND AGE >20
C: AGE =20 AND AGE =22
D: AGE =20 OR AGE =22

【单选题】
在SQL语言中,条件“BETWEEN 20 AND 30”表示年龄在20到30之间,且( A)。
A: 包括20岁和30岁
B: 不包括20岁和30岁
C: 包括20岁,不包括30岁
D: 不包括20岁,包括30岁

【单选题】
SQL语言中,删除EMP表中全部数据的命令正确的是(C)。
A: delete * from emp
B: drop table emp
C: truncate table emp
D: 没有正确答案

【单选题】
下面正确表示Employees表中有多少非NULL的Region列的SQL语句是( B)
A: SELECT count(* ) from Employees
B: SELECT count(Region) from Employees
C: SELECT count(Distinct Region) from Employees
D: SELECT sum( Region) from Employees

【单选题】
t_score(stu_id,sub_id,score),即成绩表(学号,科目编号,成绩)。以下能够获取每个学生所有学科的平均成绩的选项是(A)
A: select stu_id,avg(score) from t_score group by stu_id
B: select stu_id,avg(score) from t_score
C: select stu_id,avg(score) from t_score order by stu_id
D: select stu_id,sum(score)/count(score) from t_score

【单选题】
若要求查找S表中,姓名的第一个字为’王’的学生学号和姓名。下面列出的SQL语句中,哪个是正确的(B )
A: SELECT Sno,SNAME FROM S WHERE SNAME=′王%′
B: SELECT Sno,SNAME FROM S WHERE SNAME LIKE ′王%′
C: SELECT Sno,SNAME FROM S WHERE SNAME LIKE ′王_′
D: 全部

【单选题】
若要求“查询选修了3门以上(不包含3门)课程的学生的学生号”,正确的SQL语句是(B )
A: SELECT Sno FROM SC GROUP BY Sno WHERE COUNT()> 3
B: SELECT Sno FROM SC GROUP BY Sno HAVING( COUNT(
)> 3)
C: SELECT Sno FROM SC ORDER BY Sno WHERE COUNT()> 3
D: SELECT Sno FROM SC ORDER BY Sno HAVING COUNT(
)>= 3

【单选题】
要删除students表中学生平均成绩(avg_grade)小于60分的记录, 下列SQL语句正确的是? B
A: DELETE from students
B: DELETE from students WHERE avg_grade < 60
C: DELETE from students WHERE avg_grade <= 60
D: DELETE * students WHERE avg_grade < 60

【单选题】
请问,以下哪条SQL语句可以查询姓名为”李”开头的所有学员:(C )
A: select * from student where name like ‘%李%’;
B: select * from student where name like ‘李’;
C: select * from student where name like ‘李%’;
D: select * from student where name like ‘李
’;

【单选题】
查找条件为:姓名不是NULL的记录(C )
A: WHERE NAME ! NULL
B: WHERE NAME NOT NULL
C: WHERE NAME IS NOT NULL
D: WHERE NAME!=NULL

【单选题】
以下聚合函数求平均数的是©
A: SUM()
B: MAX()
C: AVG()
D: MIN()

【单选题】
关于MySQL中的group by(分组),以下说法正确的是: A
A: group by语句可以和where语句和having语句同时使用
B: group by语句只能对一个字段进行分组
C: group by语句只能对varchar类型字段进行分组
D: group by语句和order by语句可以同时使用,而且没有顺序关系

【多选题】
按照学生平均成绩(avg_grade) 升序排列将students表中的数据检索出来,下面SQL语句正确的是? AD
A: SELECT * FROM students ORDER BY avg_grade
B: SELECT * FROM students GROUP BY avg_grade ASC
C: SELECT * FROM students ORDER BY avg_grade DESC
D: SELECT * FROM students ORDER by avg_grade asc

【多选题】
假如有数据库:Employee,里面有”性别”字段:sex,”薪水”字段:salary,
请补全下面的SQL语句,使其可以查询:男性员工和女性的员工的最高薪水。
要求结果显示:性别,最高薪水两列。(请按顺序选择) select sex ‘性别’, A___________ from employee D_____
A: max(salary) ‘最高薪水’
B: max(sum(salary)) ‘最高薪水’
C: group by salary;
D: group by sex;

【多选题】
对于关系型数据库来说,表之间存在下面那些关系(ABC)
A: 一对一关系
B: 一对多关系
C: 多对多关系
D: 继承关系

【单选题】
如果一个字段的数据必须来源另一个表的主键,那么要在这个字段上建立(B)。
A: PK(主键)
B: FK(外键)
C: UK(唯一键)
D: 复合主键

【单选题】
关于SQL中主外键说法错误的是C
A: 外键可以在创建表时进行添加;也可以表创建好之后,修改表结构进行添加
B: 添加外键的语法为:ALTER TABLE 从表名ADD FOREIGN KEY(外键名) REFERENCES 主表(主键名)
C: 删除外键的语法为:alter table 表名 delete foreign key 外键名
D: 主键是为保证数据库的实体完整性,取值非空唯一;外键是保证数据库的参照完整性,值可以为空

【单选题】
关于主键下列说法错误的是:(B)
A: 一个表的主键由一个或多个字段组成。
B: 一个表的主键由只能由一个字段组成。
C: 值具有唯一性,而且不允许取空值(NULL)。
D: 键的作用是唯一地标识表中的每一条记录。

【多选题】
关于SQL中主外键说法正确的是:ABD
A: 设置数据库自增主键的起始值语法为:ALTER TABLE 表名 AUTO_INCREMENT=起始值
B: 添加外键的语法为:ALTER TABLE 从表名ADD FOREIGN KEY(外键名) REFERENCES 主表(主键名)
C: 删除主键的语法为:ALTER TABLE 表名 DELETE PRIMARY KEY
D: 主键必须包含唯一的值且主键列中不能包含NULL值

MySQL多表查询练习相关推荐

  1. java mysql 多表查询_解析Mysql多表查询的实现

    查询是数据库的核心,下面就为您介绍Mysql多表查询时如何实现的,如果您在Mysql多表查询方面遇到过问题,不妨一看. Mysql多表查询: CREATE TABLE IF NOT EXISTS co ...

  2. mysql多表查询详解_MySQL多表查询详解上

    时光在不经意间,总是过得出奇的快.小暑已过,进入中暑,太阳更加热烈的绽放着ta的光芒,...在外面被太阳照顾的人们啊,你们都是勤劳与可爱的人啊.在房子里已各种姿势看我这篇这章的你,既然点了进来,那就由 ...

  3. mysql教程多表查询_解析Mysql多表查询的实现

    查询是数据库的核心,下面就为您介绍Mysql多表查询时如何实现的,如果您在Mysql多表查询方面遇到过问题,不妨一看. Mysql多表查询: CREATE TABLE IF NOT EXISTS co ...

  4. 零基础带你学习MySQL—多表查询笛卡尔集(二十)

    零基础带你学习MySQL-多表查询笛卡尔集(二十) 一.多表查询 多表查询:就是指基于两个和两个以上的表的查询,在实际应用中,单个表并不能满足你的需求,我们经常需要在很多个表之间查询数据 二.笛卡尔集 ...

  5. mysql 大表查询慢_mysql大表查询慢怎么优化?

    mysql大表查询慢的优化方法:1.合理建立索引,通常查询利用到索引比不用索引更快:2.对关键字段建立水平分区,比如时间字段,若查询条件往往通过时间范围来进行查询,能提升不少性能:3.建立粗粒度数据表 ...

  6. mysql锁表查询和解锁操作

    mysql锁表查询和解锁操作 1.在做数据库操作时,有时会因为自己的粗心或者程序设计上的缺陷导致锁表,在mysql中查看锁表和解锁的步骤如下: //1.查看当前数据库锁表的情况SELECT * FRO ...

  7. Mysql 多表查询详解

    Mysql 多表查询详解 一.前言  二.示例 三.注意事项 一.前言  上篇讲到Mysql中关键字执行的顺序,只涉及了一张表:实际应用大部分情况下,查询语句都会涉及到多张表格 : 1.1 多表连接有 ...

  8. Mysql多表查询效率的研究(一)

    Mysql多表查询效率的研究(一) 本文探究了mysql InnoDB引擎在多表查询的应用场景下,使用子表.内连接和左联接运行速度的差别,并且比较了索引使用与否对查询效率的影响. 第一部分简略地概括了 ...

  9. cmd操作MySQL 多表查询(日记 day 4)

    cmd操作MySQL 多表查询 今天记录一下学习多表查询的一些操作,也算是练习记录了. 通过练习排错,来避免知识的盲区和解决心中的一些疑惑 其中的数据.题目是参照b站大刘老师的,我觉得讲的很精炼 有兴 ...

  10. 浅谈 MySQL 连表查询

    浅谈 MySQL 连表查询 连表查询是一把双刃剑, 优点是适应范式, 减少数据冗余; 缺点是连表查询特别是多张表的连表会增加数据库的负担, 降低查询效率. 简介 连表查询就是 2 张表或者多张表的联合 ...

最新文章

  1. 2019 浙江大学 计算机 科目,2019考研大纲:浙江大学2019年《计算机学科专业基础综合》(单考)(科目代码907)...
  2. 回溯 Rust 2020:正成为最受欢迎的编程语言
  3. python代码画简单图-python绘制简单彩虹图
  4. textarea标签中的换行与空格问题
  5. pythonexcelweb交互插件_来一次Python与Excel的完美交互
  6. Eclipse、NetBeans、IntelliJ集成开发工具 Java IDE
  7. JZOJ__Day 2:【NOIP普及模拟】和谐数
  8. ansys流固耦合分析与工程实例模型文件_平板射流冲击流固耦合分析
  9. js之base64上传图片
  10. string 长度_String源码解析
  11. python九九乘法表教程_python教程九九乘法表
  12. SpringSecurity-1-UserDetailsService接口
  13. pojo vo bo dto javabean
  14. MySQL可视化工具推荐
  15. potel99se 文件损坏修复
  16. VC++实现镜像劫持(360保险箱启动原理)
  17. CAD快捷键命令 mac版
  18. HuangTools 绿色软件包 (Version 1.0.0)
  19. 台式计算机c盘怎么清理空间,怎么样清理台式机c盘空间
  20. 【AlexNet】ImageNet Classification with Deep Convolutional Neural Networks

热门文章

  1. 中山大学计算机在职研究生分数线,中山大学在职研究生的合格分数线不是很高吗...
  2. lammps案例:空位形成能的模拟与计算
  3. 2022-2027年中国消防机器人行业市场调研及未来发展趋势预测报告
  4. 中餐厅第四季站点线路
  5. Linux 查看CPU信息,机器型号,内存等信息
  6. 《穷爸爸和富爸爸》读后感
  7. 【暑假复习】【搜索】POJ3009:Curling 2.0
  8. 致血气方刚的产品经理:如何不被程序员嫌弃
  9. YX150C 纯IO口 8位OTP单片机
  10. 因特尔又要加入手机芯片市场了