第五章:数据表基本操作

创建学生表:

创建一个学生表,但是没有放数据进去。

CREATE table student01(      -- 建立一个学生表
id int (11),        -- 序号
name VARCHAR(4),    -- 名字
birth date,             -- 生日
sex enum('男','女'),  -- 性别
address varchar(5),  -- 家庭住址
age TINYINT (4),            -- 年龄
hobby SET ('篮球','羽毛球','足球','排球','桌球'),    -- set多个存储链接
photo LONGBLOB,     -- 照片存储
spend DECIMAL(8,2),  -- 生活费
info VARCHAR (1000)     -- 个人简介
);

创建商品表:

创建一个商品表

主键约束:主键约束不能为空,int,(设置了主键,该条数据就必须要有内容);(简单理解主键特点:非空性,唯一性)

当记录一个主键约束后,id int (11) primary key ,用了后面的主键约束,就不会出现相同的id名。

就像身份证一样永远只有一个id,是唯一的。

id int (11) PRIMARY KEY,-- P K 设置id为主键排序

非空约束填写notnull,type(数据不能为空)

type VARCHAR(30) NOT NULL,--N N 该组type数据不能为空,非空

唯一性约束:唯一性约束可以为空 unique (数据可以为空,但是是唯一的)

--  也是后面加上unique

自增约束:auto increment

CREATE TABLE goods(
id int (11) primary key auto increment,
type VARCHAR(30),
name VARCHAR (30));

无符号约束:unsigned

CREATE TABLE dd(id TINYINT(4) UNSIGNED);-- unsigned 无符号约束
-- 只有设置了无符号约束,这里才能取值0-255
INSERT into dd VALUES (254);

外键约束:CONSTRAINT waijianname FOREIGN KEY(goods_id) REFERENCES goods(id)

-- 主表中没有的从表中不允许插入,从表中有的主表中不能删除,不能更改主表中的值而导致从表中记录孤立存在,先删除从表  再删除主表
-- 条件01:两个表中必须有公共字段,字段名称可以不同,但是数据类型必须是一样的
-- 条件02:主表 中的这个字段必须是主键字段,从表 中的字段可以是主键也可以不是主键字段,主从关系
-- 主表的id数量一定 大于等于 从表中的id数量,包含关系,主表中的id包含从表中的id(重要)
-- 外键约束加在从表里面
CONSTRAINT 外键约束名字 FOREIGN KEY(goods_id 从表中的字段) REFERENCES goods(id 主表名称)
constraint-- 示例演示:CREATE TABLE goods (  -- 主表
id INT(11) PRIMARY KEY AUTO_INCREMENT, -- 主键约束加上自增约束
type VARCHAR(30) NOT NULL, -- 非空
name VARCHAR(30) UNIQUE, -- 唯一性定义
price DECIMAL(7,2) UNSIGNED, -- 无符号定义    decimal十进制
num INT(11) DEFAULT 0,
add_time DATETIME
);CREATE TABLE orders(--从表
o_id INT(11) PRIMARY KEY,--主键约束
add_time DATETIME,
goods_id INT(11),
-- 添加外键约束,让主表goods与从表orders联系起来
CONSTRAINT yueshu FOREIGN KEY (goods_id) REFERENCES goods(id) ···;
约束 约束名字 外键 (从表名) references 参考(主表名);INSERT INTO goods(id,type,name,price,num,add_time) VALUES(1,'书籍','西游记',50.4,20,'2018-01-01 13:40:40');
INSERT INTO goods VALUES(2,'糖类','牛奶糖',7.5,200,'2018-02-02 13:40:40');INSERT INTO goods(id,type,name,price,num,add_time) VALUES(4,'服饰','休闲西服',800,null,'2016-04-04 13:40:40'),
(5,'饮品','果汁',3,70,'2016-05-05 13:40:40'),
(6,'书籍','论语',109,50,'2016-06-06 13:40:40');
INSERT INTO goods(id,type,name,price,num,add_time)
VALUES
(7,'水果','西瓜',1.5,null,'2018-02-05 13:40:40'),
(8,'水果','苹果',3,100,'2018-03-05 13:40:40'),
(9,'服饰','牛仔裤',120,10,'2018-05-04 13:40:40'),
(10,'书籍','红楼梦',50.5,15,'2018-05-06 13:40:40');insert into orders(--------------------------------------------------------------)添加进去
-- 创建一个商品表,是没有数据的
--1,
CREATE TABLE goods(
id int (11),
type VARCHAR(30),
name VARCHAR (30),
price DECIMAL (7,2),
num int (11),
add_time datetime
);
--2,查看表的数据
SELECT * FROM goods;--3,插入一条id数据
INSERT INTO goods (id) VALUES (1);--4,主键和非空用法
CREATE TABLE goods(
id int (11) PRIMARY KEY,-- P K 设置id为主键排序
type VARCHAR(30) NOT NULL,--N N 该组type数据不能为空,非空
name VARCHAR (30),
price DECIMAL (7,2),
num int (11),
add_time datetime -- 年月日 时分秒
);
-- 因为设置了type值为非空,以下三条没有写type数据,所以会报错
INSERT INTO goods (id) VALUES (1);
INSERT INTO goods (id) VALUES (2);
INSERT INTO goods (id) VALUES (3);-- 因为设置了非空和主键,所以插入数据方法为:
INSERT INTO goods (id,type,name,price,num,add_time) VALUES (1,'水果','北京鸭梨',99.9,001,'2021:3:12:18:30:29');
INSERT INTO goods (id,type,name,price,num,add_time) VALUES (2,'水果','北京烤鸭',56.6,002,'2021:3:12:18:30:29');
INSERT INTO goods (id,type,name,price,num,add_time) VALUES (3,'水果','南京香蕉',15.4,003,'2021:3:12:18:30:29');
INSERT INTO goods (id,type,name,price,num,add_time) VALUES (4,'水果','四川苹果',12.2,004,'2021:3:12:18:30:29');
INSERT INTO goods (id,type,name,price,num,add_time) VALUES (5,'水果','云南香瓜',45.3,005,'2021:3:12:18:30:29');
-- 要一一对应值,设置非空的必须要有值,自增约束非空可以为空--上面的日期之间要用:2020-2-17 13:08:12  注意格式的书写

查看表结构语法:

desc 表名tablename:查看表结构

修改语法:

2,修改字段名:alter table goods(表名) change (原来的字段名)(现在的字段名) varchar(30) 数据类型 ;

3,修改数据类型:alter table 表名 modify 字段名 现在的字段的数据类型

4,同时修改数据类型和字段名: alter table 表名 change 原来的字段名 现在的字段的数据类型

5,修改表名:alter table 原来的表名 rename 现在的表名;

增加语法:

1,增加一个字段:alter table 表名 add 新增的字段名 数据类型;

2,在第一列增加一个字段:alter table 表名 add 新增的字段名 数据类型 first;

3,在指定列添加字段:alter table 表名 add 新增的字段名 数据类型 after name(name 是指定的列名);

删除语法:

1,alter table 表名 drop 字段名;

修改表的存储引擎:

alter table 表名 engine = 要修改的存储引擎的名字;

第六章:数据插入、修改、删除

-- 创建表
CREATE TABLE goods (
id INT(11) PRIMARY KEY AUTO_INCREMENT,
type VARCHAR(30) NOT NULL,
name VARCHAR(30) UNIQUE,-- 唯一性约束
price DECIMAL(7,2) UNSIGNED,-- 无符号约束
num INT(11) DEFAULT 0,-- 默认为0,default 0
add_time DATETIME
);
-- 补充:
drop table goods;-- 全部删除
-- 语法:
INSERT INTO table_name(col_name1,col_name2,……col_namen) (所有字段的字 段名)VALUES(value1,value2,……valuen)(所有字段的字段值 );
------------------------------------------------------------------------------------------------------------
INSERT INTO goods(id,type,name,price,num,add_time) VALUES(1,'书籍','西游记',50.4,20,'2018-01-01 13:40:40');
INSERT INTO goods(type,id,name,price,num,add_time) VALUES('书籍',2,'史记',50.4,20,'2018-01-01 13:40:40');
-- id 和 type 顺序不能乱,上面第二个就乱了
-- 补充:当字段名的顺序发生变化时,字段值的顺序也要跟着变化
select * from goods;
-- 向表中指定字段插入数据(注意:非空约束的字段必须要插入数据,除了设置了自增约束的非空字段)
-- 语法:
INSERT INTO table_name(col_name1,col_name2,……,col_namen)(指定字段的字段名) VALUES(value1,value2,……,valuen);
------------------------------------------------------------------------------------------------------------
-- 具体案例:可以不指定id,因为id设置了自增约束,会自动增长
INSERT INTO goods(type,name,price) VALUES('糖类','水果糖',2.5);select * from goods;
INSERT INTO goods(type,name,price) VALUES('糖类','旺仔QQ糖',2.5);
-- 同时插入多条数据:
-- 语法:INSERT INTO table_name(col_name1,col_name2,……,col_namen)
VALUES(value1,value2,……,valuen),
……
(value 1,value2,……,valuen);(每一行的记录我们用一个括号包裹,每个括号之间用逗号分隔)
------------------------------------------------------------------------------------------------------------
-- 具体案例:
INSERT INTO goods
VALUES
(4,'服饰','休闲西服',800,null,'2016-04-04 13:40:40'),
(5,'饮品','果汁',3,70,'2016-05-05 13:40:40'),
(6,'书籍','论语',109,50,'2016-06-06 13:40:40');select * from goods;
-- 将其他表中的数据插入到表中(字段的数据类型一定要相同,而且字段的顺序要相同,字段的数量要相同)
INSERT INTO table_name1(table_name1_col_list) 表中的字段
SELECT table_name2_col_list FROM table_name2; (从这个表中选出的字段)-- 相当于复制表
insert into new_goods(id,type,name....)
select id,type,name,......from goods;
------------------------------------------------------------------------------------------------------------
CREATE TABLE new_goods (
id INT(11) PRIMARY KEY AUTO_INCREMENT,
type VARCHAR(30) NOT NULL,
name VARCHAR(30),
price DECIMAL(7,2) UNSIGNED,
num INT(11) DEFAULT 0,
add_time DATETIME
);INSERT INTO new_goods(id,type,name,price,num,add_time)
SELECT id,type,name,price,num,add_time FROM goods;select * from new_goods;SELECT id,type,name,price,num,add_time FROM goods===select * from goods;
-- 修改数据:update
-- 修改某个字段或者某些字段的所有数据
-- 语法:
UPDATE table_name
SET col_name1=value1,col_name2=value2……,col_namen=valuen;
------------------------------------------------------------------------------------------------------------
UPDATE new_goods set num=0,price=0;-- 例子
select *from new_goods;
-- 修改某个字段的指定数据
UPDATE table_name
SET col_name1=value1,col_name2=value2,……,col_namen=valuen
WHERE condition;
------------------------------------------------------------------------------------------------------------
update new_goods  set name='红牛',num=30 where id=5;
select * from new_goods;update new_goods set num=50,price=50 where id=6;
select * from new_goods;
-- 6-8的指定数据更改
update goods set num=1,price=30 where id in(6,7,8);        -- 方法一
update goods set num=1,price=30 where id between 6 and 8;-- 方法二
-- 删除数据 :DELETE 删除所有数据和删除指定数据(注意:删除数据要么就是删除整个表中的所有数据,
-- 要么就是删除某条记录的数据,不能删某条记录的某些字段,如果这样的其实是修改) -- 删除表中某条记录或者某些记录的数据
DELETE FROM table_name WHERE condition;
------------------------------------------------------------------------------------------------------------
DELETE FROM new_goods WHERE id=6;
SELECT * FROM new_goods;delete from new_goods where id=8;
insert into new_goods(id,type,name) VALUES(8,'水果','椰子');-- 当删除某个字段后再插入数据,
-- 插入数据的时候不插入包含auto_increment的字段这时需要通过修改语句使auto_increment恢复原来的数据再插入数据
-- 仅仅可以自增最外层最大的,eg:1,2,4,5  因为缺少3,但是你不能使用 alter table new_goods auto_increment=3;
-- 只可以 选择自增6 以上的。
alter table new_goods auto_increment=9;insert into new_goods(type,name) VALUES('水果','火龙果');
delete from new_goods where id=10;-- drop table goods; 包括整个表,全部删除掉
-- delete table goods; 只删除该表的数据,不会删除表的结构

第六章作业:

将自增更改为指定的id值 9
alter table 表名 auto_increment=9;

CREATE TABLE `tb_worker` (`id` int(11) PRIMARY KEY AUTO_INCREMENT,`name` varchar(30) NOT NULL,`sex` enum('男','女') DEFAULT '男',`hobby` set('足球','篮球','排球') DEFAULT NULL,`score` float(3,1) unsigned DEFAULT NULL,`mobile` varchar(11) UNIQUE KEY,`intro` text,`entry_time` date DEFAULT NULL);select * from tb_worker;DROP TABLE tb_worker;
-- 1,
INSERT INTO tb_worker
(id,name,sex,hobby,score,mobile,intro,entry_time)
VALUES(1,'小赵' ,'男','篮球', 9.2, 13899991111, Null,'2009-5-8');-- 2
INSERT INTO tb_worker
(name,sex,hobby,score,mobile,intro,entry_time)
VALUES('小钱'   ,'男','篮球,排球', 9.1, 13899992222,Null,'2008-6-5');-- 3
INSERT INTO tb_worker
(name,sex,hobby,score,mobile,intro,entry_time)
VALUES
('小孙' ,'女', '足球',  9.8, 13899993333,Null,'2015-9-2'),
('小李' ,'男', '篮球,足球',  9.2, 13899994444,Null,'2011-9-2'),
('小周' ,'女', '排球',  9.0, 13899995555,Null,'2017-1-9'),
('小吴' ,'男', '足球,排球',  9.3, 13899996666,Null,'2014-7-7')-- 4修改name 值为 “小吴”的记录,将其hobby值修改为”football”
UPDATE tb_worker SET hobby='足球' WHERE id=6;-- 5
UPDATE tb_worker SET score=score+0.5
WHERE id<=4;-- 6
DELETE FROM tb_worker WHERE id=6;

第七章:单表查询

-- 要做事 先创表
CREATE TABLE goods (
id INT(11) PRIMARY KEY AUTO_INCREMENT,
type VARCHAR(30) NOT NULL,
name VARCHAR(30) UNIQUE,
price DECIMAL(7,2) UNSIGNED,
num INT(11) DEFAULT 0,
add_time DATETIME
);INSERT INTO goods(id,type,name,price,num,add_time) VALUES(1,'书籍','西游记',50.4,20,'2018-01-01 13:40:40');INSERT INTO goods VALUES(2,'糖类','牛奶糖',7.5,200,'2018-02-02 13:40:40');INSERT INTO goods(id,type,name,price,num,add_time) VALUES(4,'服饰','休闲西服',800,null,'2016-04-04 13:40:40'),
(5,'饮品','果汁',3,70,'2016-05-05 13:40:40'),
(6,'书籍','论语',109,50,'2016-06-06 13:40:40');INSERT INTO goods(id,type,name,price,num,add_time)
VALUES
(7,'水果','西瓜',1.5,null,'2018-02-05 13:40:40'),
(8,'水果','苹果',3,100,'2018-03-05 13:40:40'),
(9,'服饰','牛仔裤',120,10,'2018-05-04 13:40:40'),
(10,'书籍','红楼梦',50.5,15,'2018-05-06 13:40:40');

简单查询:

-- 1,查询指定字段SELECT type,name FROM goods;-- 2,查询相应的条件字段SELECT * FROM goods where type !='书籍';select * from goods where price>100;-- 满足多个条件 使用 andselect * from goods where type='书籍'and price>51;-- 查询多个条件字段(and 同时满足),(or 满足其一)SELECT * FROM goods where type !='书籍' AND id>3;SELECT * FROM goods where type ='书籍' or id>3;select * from goods where type='糖类' or type='书籍'; -- type需要写两次-- in关键字SELECT * FROM goods WHERE type in ('糖类','书籍');
-- in可以查询集合数据,只显示条件范围内的数据
-- select * from goods where num in(20,200);包含的20-200的数据SELECT * FROM goods;-- 区间范围之间查询SELECT * from goods WHERE price BETWEEN 1 AND 80;select * from goods where price>50 AND price<100;select * from goods where price BETWEEN 50 and 100;-- 查询空值null/ not null 非空SELECT * FROM goods WHERE price IS null;-- 同上-- 选中指定类 查询 空null 和 非空not nullSELECT name,type FROM goods WHERE num AND type IS NOT null;-- 为非空select id,type,num from goods where num is null; -- 为空select * from goods where num is null; -- 为空-- 去重distinctSELECT type FROM goods; -- 显示所有的type
-- 去重可以运用于计数函数SELECT DISTINCT type FROM goods; -- 去掉重复的type,也就是显示一次-- 案例01
-- 查询 2017年到2018年 的所有商品
SELECT * FROM goods WHERE add_time>'2017-1-1' and add_time<'2018-12-30';-- 方法1
SELECT * FROM goods WHERE add_time BETWEEN '2017-1-1' and '2018-12-30'; -- 方法2

模糊查询:

-- 1,查询包含有某个字的,可以匹配表中 所有相关的字符
SELECT * FROM goods WHERE `name` like '%果%';-- 不分果字的先后顺序
SELECT * FROM goods WHERE `name` like '果%';-- 果字开头
SELECT * FROM goods WHERE `name` like '%果'; -- 果字结尾-- 查询包含有楼字的商品名称
SELECT * FROM goods WHERE `name` like '%楼%';-- 2,通配符_ 下划线 只能匹配一个字符
SELECT * FROM goods WHERE `name` like '西_'; -- 查询西字后面有 一个字符的
SELECT * FROM goods WHERE `name` like '西__'; -- 查询西字后面有 两个字符的
SELECT * FROM goods WHERE `name` like '__西%'; -- 西字在第三个字符的商品名称-- 3,单字段排序
SELECT * FROM goods ORDER BY price; -- 没有ASC 和 DESC ,默认升序
SELECT * FROM goods ORDER BY num ASC; -- 默认将 null值 排在最前面
SELECT * FROM goods ORDER BY price DESC; -- 降序排列-- 3-1 多字段排列
SELECT * FROM goods ORDER BY price,num; -- 先按照price排序,对于price中相同的记录,再按照num字段进行排列
SELECT * FROM goods ORDER BY price DESC,num DESC; -- 多字段降序排列,num 和 price 后面都要加上 DESC-- 4,限制查询结果数量 limit
SELECT * FROM goods LIMIT 6; -- 初始值6,查询 0 - 6 的字段数据
SELECT * FROM goods LIMIT 2,3; -- 查询 3 - 5 ,3开始,接着后面的3位
SELECT * FROM goods LIMIT 4,2; -- 查询 5 - 7 ,5开始,接着后面的2位
SELECT * FROM goods LIMIT 0,5; -- 查询 1 - 5 ,1开始,接着后面的5位
SELECT * FROM goods LIMIT 0,5; == 等价于 == SELECT * FROM goods LIMIT 5;

聚合函数:作用于列,作用于单列

-- As 取名字
-- 计数 count
SELECT count(*) AS 商品数量 FROM goods; -- 计数所有列
SELECT COUNT(DISTINCT `name`) FROM goods; -- 计数name列
SELECT count(math3 FROM chengji WHERE math>70;-- 计数数学大于70的-- 求和函数sun
SELECT sum(chinese)AS 语文成绩和 FROM chengji; -- 统计语文成绩和
SELECT sum(chinese),sum(math),sum(english) FROM chengji; -- 统计各科成绩总和
SELECT sum(chinese+math+english) FROM chengji; -- 统计成绩总和-- 求最值
SELECT MAX(chinese) AS 语文最高分 FROM chengji;
SELECT MIN(math) AS 数学最低分 FROM chengji;
SELECT MIN(chinese+math+english) AS 总成绩最低分 FROM chengji;-- 求平均值  可以用除法
SELECT *,(chinese+math+english)/3 FROM chengji ORDER BY (chinese+math+english); -- order by
SELECT (chinese+math+english)/3 FROM chengji ORDER BY (chinese+math+english); -- order by

分组查询:

-- 分组和聚合函数共用,可以直观的看到该分类的数量,-- 对每个商品中 的num 进行分组
SELECT type,SUM(num) FROM goods GROUP BY type;-- 对商品中价格最低的,进行分组
SELECT type,min(price) FROM goods GROUP BY type; -- 对于select 和 from 之间的字段名,一般是分组函数或聚合函数的属性值-- 计算所有商品的总和,从小到大排序
SELECT type,sum(num) AS zs FROM goods GROUP BY type ORDER BY zs ;-- 计算所有商品价格最大值,从小到大排序 ORDER BY
SELECT type,max(price) AS ss FROM goods GROUP BY type ORDER BY ss ;-- 过滤使用
-- HAVING 和 GROUP BY 一起使用,可以指定显示记录满足的条件,满足才会显示
SELECT type,SUM(num) FROM goods GROUP BY type HAVING SUM(num)>100;-- 分组操作之后通过过滤来选择分组-- HAVING 子句可以包含聚合函数,但是where子句不能包含聚合函数-- 多个字段分组

第七章作业:


1.  查找部门30中员工的详细信息。
SELECT * FROM emp WHERE deptno=30;
2.  找出从事职员工作的员工的编号、姓名、部门号。
SELECT empno,ename,deptno FROM emp WHERE job='职员';
3、检索出奖金多于基本工资的员工信息。
SELECT * FROM emp where comm>sal;
4.检索出奖金多于基本工资60%的员工信息。
SELECT * FROM emp where comm>sal*0.6;
5.找出姓名中包含A的员工信息。
SELECT * FROM emp WHERE ename LIKE '%A%';
6、找出姓名以A、B、S开始的员工信息。
SELECT * FROM emp WHERE ename LIKE 'A%' or ename LIKE 'B%' or ename LIKE 'S%';7、找到名字长度为7个字符的员工信息。
SELECT * FROM emp WHERE ename LIKE '_______';
8、名字中不包含R字符的员工信息。
SELECT * FROM emp WHERE ename NOT LIKE '%R%';9、返回员工的详细信息并按姓名升序排序。
SELECT * FROM emp ORDER BY ename ASC;
10、返回员工的信息并按姓名降序,工资升序排列。优先排序前面的,后面的后面再排序
SELECT * FROM emp ORDER BY  ename DESC ,sal ASC;
11、计算员工的日薪,把员工名和日薪都显示出来(按30天)。
SELECT ename,sal/30 AS '日薪' FROM emp;-- where 语句是分组之前,having 语句是分组之后12. 找出奖金少于100或者没有获得奖金的员工的信息。
SELECT * FROM emp WHERE COMM<100 OR comm is NULL;
13. 显示姓名中没有'L'字的员工的详细信息或含有'SM'字的员工信息
SELECT * FROM emp WHERE ENAME NOT LIKE '%L%' OR ENAME  LIKE '%SM%';
14. 查询员工中名字由四位字母组成并且含有字母D的员工。
SELECT * FROM emp WHERE ENAME LIKE '____' AND ENAME  LIKE '%D%';
15. 把员工表中第3条数据到第5条数据展示出来。
SELECT * FROM emp LIMIT 3,2;
16. 计算每个部门员工的人数,直接使用部门编号计算人数
SELECT DEPTNO as '部门',count(DEPTNO) AS '人数' FROM emp GROUP BY DEPTNO;17.    查询每个岗位的最高工资、最低工资、人数
SELECT job,max(sal),MIN(sal),COUNT(deptno) AS '人数' FROM emp GROUP BY job;18. 显示非销售人员工作名称以及从事同一工作雇员的月工资的总和,并且要满足从事同一工作的雇员的月工资合计大于5000,输出结果按月工资的合计升序排列-- having 满足这个条件-- 两种方法
SELECT job,SUM(sal) FROM emp GROUP BY job having SUM(sal)>5000 and job!='销售员' ORDER BY SUM(sal) asc;
SELECT job,SUM(sal) FROM emp WHERE job!='销售员' GROUP BY job HAVING SUM(sal)>5000 ORDER BY SUM(sal) ASC;19. 查询出所有经理或者是销售人员的信息,并且要求这些人的基本工资高于 2000。
SELECT * FROM emp WHERE job='经理' or job='销售员' AND sal>2000; -- 1
select * from emp where job in('经理','销售员') and SAL>2000; -- 220. 查询出奖金高于薪金的 60%的员工
select * from emp where comm>0.6*sal;21. 查询出每个部门的人数、平均工资
SELECT deptno,COUNT(deptno) as '部门人数',avg(sal) as '平均工资'FROM emp GROUP BY deptno; 22.   查询平均工资高于 2000 的职位信息,以及从事此职位的雇员人数、平均工资
SELECT job,COUNT(job)AS '职位人数', avg(sal) AS'平均工资' FROM emp GROUP BY job HAVING avg (sal)>2000;

第八章:多表查询

一对多关系:一个班对应很多个学生

主键和非主键之间的关系

内连接:左表中有 右表中也要有的 笛卡尔连接

左 外连接:left join … on

left join … on :左外连接 以左表为基表,从 从表中筛选 显示出符合基表的数据,如果没有符合的就显示null

select * from staff,section where staff.section_id = section.section_id;                -- 笛卡尔连接    内连接select * from staff inner join section on staff.section_id = section.section_id ;select * from goods RIGHT join orders on goods.id = orders.goods_id;  -- 结果相同
select * from goods inner join orders on goods.id = orders.goods_id;  -- 结果相同   内连接
select * from goods,orders WHERE goods.id = orders.goods_id;          -- 结果相同

自连接:自身和自身的连接。

多对多关系:商品表和订单表。

一个表的多个数据对应 另一个表的多个数据。如果从表中没有基表的相应数据,那么就显示null

union

-- 左边的表显示 所有数据,右边没有对应 数据就以 空值null显示
select * from goods left join orders on goods.id = orders.goods_id ;                           -- 左 外连接-- 查询订单中所对应的商品哪些存在,哪些不存在,(所以要以 订单表orders为基表,从表是 商品表goods )
select * from orders left join goods on goods.id = orders.goods_id;                    -- 左外连接,以左为基表-- 原理是大致相同的
select * from goods RIGHT join orders on goods.id = orders.goods_id;                   -- 右外连接,以右为基表

子查询:

外层查询为主查询,内层查询为子查询,先执行子查询,将子查询的结果作为主查询的过滤条件

优势:可以把多个步骤进行分解 一步步的来实现。

-- 两种都可以实现,具体看要求来使用
SELECT id,name from (SELECT * from goods WHERE id>3) AS gl WHERE num>10;          -- 子查询
SELECT id,name from goods WHERE num>10 AND id>3;                          -- 内连接查询-- 查询orders表中goods_id 的所有值,然后使用子查询结果拼接where条件,查询goods_id值对应的所以商品的详细信息。
SELECT * FROM goods WHERE id in (SELECT goods_id FROM orders ) ;-- 在goods表中的查询没有订单的商品的详细信息
SELECT * from goods WHERE id NOT in (SELECT goods_id FROM orders);--
SELECT id,name from (SELECT * from goods WHERE id>3) AS gl WHERE num>10;
SELECT id,name from goods WHERE num>10 AND id>3;

多表练习01:

1.查询出每个雇员的姓名、职位、领导姓名。
SELECT a.ename '雇员的姓名', a.job '职位', b.ename '领导名字' FROM emp a, emp b WHERE a.mgr = b.empno;2.查询出在销售部(SALES)工作的员工姓名、基本工资、雇佣日期、部门名称。(不知道销售部编号)。
SELECT ename '员工姓名',sal '基本工资',hiredate '雇佣日期',dept.dname  '部门名称' FROM emp,dept WHERE emp.deptno = dept.deptno AND dname = 'sales';3.查询出所有员工的年工资,所在部门名称,按年薪从低到高排序。
SELECT ename '员工姓名',(sal*12) '年工资',dept.dname '部门名称' FROM emp,dept WHERE emp.deptno = dept.deptno ORDER BY (sal*12) ASC; -- 01
SELECT emp.EMPNO,emp.ENAME,(emp.SAL + emp.COMM)*12,dept.DNAME FROM emp,dept WHERE emp.DEPTNO = dept.DEPTNO ORDER BY (emp.SAL + emp.COMM)*12; -- 02
SELECT * from emp;4.查询工资比 smith 更高的全部员工的所有信息(包括部门名称)。
SELECT * FROM emp,dept WHERE emp.deptno = dept.deptno AND emp.sal > (SELECT sal FROM emp WHERE ename = 'smith');5.查询职位和 smith 相同的所有员工信息。
SELECT * from emp a,emp b  WHERE a.job = b.job AND b.ename = 'smith'; -- 01
SELECT * FROM  emp INNER JOIN dept on emp.DEPTNO = dept.DEPTNO AND emp.JOB = (SELECT job FROM emp WHERE ename = 'smith'); -- 026.查询各部门的部门编号,部门名称,部门地址,员工人数和平均工资。
-- 选择dept中的所有,count(*) 是统计行数
SELECT dept.*, COUNT(emp.empno) '员工人数' ,AVG(emp.sal + emp.comm) '平均工资' FROM dept LEFT JOIN emp on dept.deptno = emp.deptno GROUP BY dept.deptno;

多表练习02:

1、查询student 表的所有记录
SELECT * FROM student;2、查询大数据和人资专业的学生。
SELECT * FROM student WHERE department = '大数据' OR department = '人资';3、在student表中查询年级小于19岁的学生信息。
SELECT * FROM student WHERE 2021-birth < 21;4、每个系部有多少人?
SELECT department,COUNT(id) FROM student GROUP BY department 5、查询每个科目的最高分?
SELECT course.c_name,MAX(grade) FROM course,score WHERE course.c_id = score.cor_id GROUP BY course.c_name;
SELECT * FROM student;6、查询王五的考试科目和考试成绩?
SELECT student.name,course.c_name,score.grade FROM student,course,score WHERE student.name = '王五' AND student.id = score.stu_id AND score.cor_id = course.c_id7、 查询平均成绩大于90分以上的学生姓名、平均成绩
SELECT student.id,student.name,AVG(score.grade) FROM student,score WHERE student.id = score.stu_id GROUP BY student.id HAVING AVG(score.grade)>90;8、查询上了语文课的学生人数
SELECT course.c_name,COUNT(score.stu_id) FROM course,score WHERE  score.cor_id = course.c_id AND course.c_name = '语文';9、查询score表中每个科目的最高分
SELECT course.c_name,MAX(score.grade) FROM course,score,student WHERE course.c_id = score.cor_id GROUP BY course.c_name;10、用连接的方式查询所有学生的信息以及考试分数等信息。
SELECT student.*,score.grade from student,score WHERE student.id = score.stu_id;11、将计算机考试的成绩按照从高到低进行排序
SELECT course.c_name,score.grade FROM score,course where course.c_id = score.cor_id and course.c_name = '计算机' GROUP BY score.stu_id ORDER BY score.grade DESC ;
SELECT * FROM score;12、查询一共有几个专业?
SELECT COUNT(DISTINCT department) AS '共有专业' FROM student;13、查询男生一共有多少人?
SELECT sex,COUNT(sex) FROM student WHERE sex = '男';14、查询是在1999年到2002年出生的人基本信息,并按年龄大小排序
SELECT * FROM student;
SELECT * FROM student WHERE birth BETWEEN 1999 AND 2002 ORDER BY birth;15、查询所有姓张的和姓李的所有学生
SELECT * FROM student WHERE name LIKE '张%' OR name LIKE '李%' ;16、找出所有姓张的并且只有两个字的人
SELECT * FROM student WHERE name LIKE '张_'; 17、每门课程从低到高排序
SELECT * FROM course ORDER BY c_name ASC;18、查询来自衡阳的有几位同学
SELECT address,COUNT(id) FROM student WHERE address = '衡阳';19、查询每门课的最低分的同学的学号与分数
-- 暂时不会 20、查询英语成绩等于100的同学的姓名、课程名、成绩;
SELECT student.name,course.c_name,score.grade FROM student,course,score WHERE course.c_name = '英语' AND score.grade =100 AND student.id = score.stu_id AND score.cor_id = course.c_id;21、查询所有学生的学号,姓名,选课数,总成绩
SELECT student.id,student.name,COUNT(course.c_name),SUM(score.grade) FROM student,course,score WHERE student.id = score.stu_id AND score.cor_id = course.c_id GROUP BY student.name ORDER BY student.id;22、查询选修了所有课程的学生姓名(先从course表统计课程的总数,然后基于score表按照student_id分组,统计课程数据等于课程总数即可)
SELECT student.name FROM student,score WHERE student.id = score.stu_id GROUP BY student.id HAVING COUNT(score.cor_id) =(SELECT COUNT(c_id) FROM course);

q

MYSQL简单题目和知识点相关推荐

  1. PAT乙级题目对应知识点分类梳理例程(更新至1102)

    PAT乙级题目对应知识点分类梳理 PAT乙级的90道题的知识点与对应的题号整理如下,便于做专项练习和巩固! 题型 备注 1.字符串函数 考察字符串相关知识,如逆转.字母与数字的判断与转化.字符串拼接. ...

  2. MySQL基础教程:知识点汇总

    MySQL常用知识点.函数汇总 MySQL基础教程:知识点汇总_mysql知识点梳理 一文学会使用MYSQL数据库,MySQL常用操作 MySQL数据库表的相关操作 MySQL数据库的基本查询 MyS ...

  3. 简易mysql优化_优化 MySQL:简单三个技巧

    原标题:优化 MySQL:简单三个技巧 技巧#1:为临时表分配足够的内存 在某些情况下,服务器在处理语句时会创建内部临时表.临时表用于内部操作如GROUP BY和distinct,还有一些ORDER ...

  4. MySQL简单查询性能分析

    MySQL简单查询性能分析  建立如此结构的数据表,并插入110万条随机记录,进行查询性能测试.   插入110万条随机记录后,数据表的大小为102MB. 现在使用phpMyAdmin自带的SQL查询 ...

  5. python alter table_python(pymysql)之mysql简单操作

    一.mysql简单介绍 说到数据库,我们大多想到的是关系型数据库,比如mysql.oracle.sqlserver等等,这些数据库软件在windows上安装都非常的方便,在Linux上如果要安装数据库 ...

  6. mysql 张三的语文成绩_八道 经典的 MYSQL 面试题目(有答案)

    八道 经典的 MYSQL 面试题目(有答案) ***答案统一在 最下面哦*** (1)表名:购物信息 购物人 商品名称 数量 A 甲 2 B 乙 4 C 丙 1 A 丁 2 B 丙 5 -- (其他用 ...

  7. MySQL复习值代码知识点(1)

    MySQL复习值代码知识点 一. 创建数据库 create database 数据库名: 二. 删除数据库 drop database 数据库名: 三. 选择相应的数据库 use 数据库名: 四. 创 ...

  8. LeetCode简单题目(#263 #268 #278 #283 #290)-5道(数字、字符串)

    leetcode题库中共有350道简单题目. 本文记录已解决的题目和代码. 本文中的序号是leetcode题目中的真实序号. 文章目录 263 丑数 描述 代码 大神代码 268 缺失数字 描述 代码 ...

  9. LeetCode简单题目(#235 #237 #242 #257 #258)-5道(树、数字、字符串)

    leetcode题库中共有350道简单题目. 本文记录已解决的题目和代码. 本文中的序号是leetcode题目中的真实序号. 文章目录 235 二叉搜索树的最近公共祖先 描述 代码 237 删除链表中 ...

  10. LeetCode简单题目(#225 #226 #231 #232 #234)-5道(栈、队列、树、数字)

    leetcode题库中共有350道简单题目. 本文记录已解决的题目和代码. 本文中的序号是leetcode题目中的真实序号. 文章目录 225 用队列实现栈 描述 代码 226 翻转二叉树 描述 代码 ...

最新文章

  1. Flask之Cookie与Session
  2. 2013-07-22 IT 要闻速记快想
  3. windows2008吃尽内存的解决办法
  4. 笔记-计算机软件技术基础(一)资源管理技术-操作系统
  5. Java中对象的比较 == 和 equals()
  6. [转载] numpy用法(logical_and, nonzero,arange, reshape)
  7. cad导出pdf_CAD如何批量导出PDF文件?别说PDF了!GIF我都能给你导出来
  8. 微信内置浏览器禁止调整字体大小的方法
  9. 打造江西数智产业高地,百度飞桨人工智能产业赋能中心落户南昌青山湖
  10. 【深度访问】Cocos2d-JS精品《航海王启航》:我们是要成为游戏王的团队
  11. 2013 【第四届蓝桥杯省赛】 C/C++ B组
  12. Kaggle文本语义相似度计算Top5解决方案分享
  13. 云函数调用失败的原因
  14. php7.1.6验证码错误,steam输入验证码不正确怎么办
  15. 智能家居系统的开源尝试
  16. Google Protocol Buffers三两事【知识笔记】
  17. 三菱PLC项目案例之手轮发脉冲控制三轴伺服电机
  18. FCF中文指南-第二章--FusionCharts Free安装
  19. [每日一题]113:有效的数独
  20. 使用plotly对美国疫情地图可视化

热门文章

  1. 同一台计算机同时安装多个打印机,r230驱动-同一台电脑可不可以装两台同品牌同型号的打印 – 手机爱问...
  2. call方法 java_漫谈JS中的call和apply方法
  3. jenkins插件安装失败更改插件源
  4. 22讲MySQL有哪些“饮鸩止渴”提高性能的方法
  5. Ansys Lumerical | 铌酸锂热调制波导仿真
  6. 2022当代科学技术前沿知识 课后测试
  7. MTK平台创建Vendor方法(最大化复用代码)
  8. 【Latex】Latex小白入门(4)——Latex中特殊符号的输入
  9. mybatis基础(下)
  10. 【linux内核分析与应用-陈莉君】内核同步概述