diff --git "a/48 \346\235\250\346\264\213/2023-2-22.md" "b/48 \346\235\250\346\264\213/2023-2-22.md" deleted file mode 100644 index 892cc13e5848fcaee76535f7f9a7c9d219481aef..0000000000000000000000000000000000000000 --- "a/48 \346\235\250\346\264\213/2023-2-22.md" +++ /dev/null @@ -1,98 +0,0 @@ -## 笔记 -select * from 表名 as 表的别名;#(表可以取别名,但是不能用任何引号,也不能有空格) -#查询降序排列 -select * from 表名 order by 字段 desc; -#distinct (去重) -select distinct 字段 from where 条件 ; #(注意distinct 只能放在第一个字段的前面,不能放在中间##和最后面,且只有一个字段使用) -/*myql运算符 %(只取余) -不等于:!=或<>不能用于判断null,不发生报错,返回null -安全等于 : <=> -取反 : !( ) -区间范围:between x and y; -not between x and y ; -集合范围:in(x,y,z); - -*/ - - -## 第一题 - -#drop table if exists `employee`; -CREATE database class4 charset utf8; -use class4; -#创建employee表 -CREATE TABLE employee( - id INT, - `name` VARCHAR(20), - sex VARCHAR(20), - tel VARCHAR(20), - addr VARCHAR(50), - salary FLOAT -); - -#添加信息 -INSERT INTO employee(id,`name`,sex,tel,addr,salary)VALUES -(10001,'张一一','男','13456789000','广东韶关',10010.58), -(10002,'刘小红','女','13454319000','广东江门',12010.21), -(10003,'李四','男','0751-1234567','广东佛山',10040.11), -(10004,'刘小强','男','0755-5555555','广东深圳',15010.23), -(10005,'王艳','男',NULL,'广东广州',14050.16); --- **要求1:**查询出薪资在12000~13000之间的员工信息。 -select * from employee where (salary >12000) and (salary <13000); --- **要求2:**查询出姓“刘”的员工的工号,姓名,家庭住址。 -select id,sex,addr,name from employee where name like '%刘%'; --- **要求3:**将“李四”的家庭住址改为“广东韶关” -update employee set addr ='广东韶关' where name='李四'; --- **要求4:**查询出名字中带“小”的员工 -select * from employee where name like '%小%'; --- **要求5:**查询出薪资高于11000的男员工信息 -select * from employee where (sex='男') and (salary >11000); --- **要求6:**查询没有登记电话号码的员工 -select * from employee where tel is null; --- **要求7:**查询薪资高于12000或者家是广东深圳、广州的男员工 -select * from employee where (salary >12000) or (addr='广东深圳,广州'); --- **要求8:**查询每个员工的年薪,显示“姓名、年薪” -select name,salary from employee ; - - - -## 第二题 - -create database class5 charset utf8; -use class5; -CREATE TABLE `countries_info`( - `name` VARCHAR(100), - `continent` VARCHAR(100), - `area` INT, - population INT, - gdp BIGINT -); - -INSERT INTO countries_info VALUES -('Afghanistan','Asia',652230,25500100,20343000000), -('Albania','Europe',28748,2831741,12960000000), -('Algeria','Africa',2381741,37100000,188681000000), -('Andorra','Europe',468,78115,3712000000), -('Angola','Africa',1246700,20609294,100990000000); --- 要求1:** 查询大国 的国家名称、人口和面积。 -select name,population,area from countries_info ; --- 如果一个国家满足下述两个条件之一,则认为该国是 大国 : -select * from countries_info where (area<= 30000000) or (population>25000000); --- - 面积至少为 300万平方公里(即,3000000 km2) --- --- - 人口至少为 2500 万(即 25000000) --- --- **要求2:**查询属于亚洲的国家名称、所属大陆、面积、人口和 GDP 值 -select * from countries_info where continent='Asia'; --- **要求3:**查询国土面积不足1万平方公里且人口不走10万人的国家信息 -select * from countries_info where (area<10000) and (population<100000); --- **要求4:**查询国家名字中包含“o“字母的国家信息 -select * from countries_info where name like '%o%'; --- **要求5:**查询GDP值超过100000.00000的国家信息 -select * from countries_info where gdp>10000000000; --- **要求6:**查询每个国家的人均贡献GDP值(GDP/人口总数)并显示为“国家名、人口、GDP值、人均贡献GDP值” -select name,population,gdp,gdp/population from countries_info; --- **要求7:**查询人均贡献GDP值低于1000的国家信息。 -select * from countries_info where gdp/population ; --- **要求8:**查询每个国家的人均国土面积(面积/人口总数)并显示为“国家名、面积、人口、人均国土面积值” -select name,area,population,area/population from countries_info ; \ No newline at end of file diff --git "a/48 \346\235\250\346\264\213/2023-3-20\344\275\234\344\270\232.md" "b/48 \346\235\250\346\264\213/2023-3-20\344\275\234\344\270\232.md" new file mode 100644 index 0000000000000000000000000000000000000000..0322a7cff6c3c16dab3a437c6c00230678ddf5e3 --- /dev/null +++ "b/48 \346\235\250\346\264\213/2023-3-20\344\275\234\344\270\232.md" @@ -0,0 +1,301 @@ +# 巩固题 + +## 1、输出你最想说的一句话! + +* 编写步骤: + +1. 定义类 Homework1 + +2. 定义 main方法 + +3. 控制台输出5行字符串类型常量值 + +4. ```java + public class HomeWork1 { + public static void main(String[] args) { + System.out.println("记得要开心"); + } + + } + ``` + + + +## 2、按步骤编写代码,效果如图所示: + +![](01_Java基础语法图片/1.jpg) + +* 编写步骤: + +1. 定义类 Homework2 + +2. 定义 main方法 + +3. 控制台输出5行字符串类型常量值 + +4. 控制台输出5行字符类型常量值 + +5. ```java + public class HomeWork2 { + public static void main(String[] args) { + System.out.println("善学如春起之苗"); + System.out.println("不见其增,日由所长"); + System.out.println("假学如磨刀之石"); + System.out.println("不见其损,年有所亏"); + System.out.println("加油吧!少年"); + System.out.println("J"); + System.out.println("A"); + System.out.println("V"); + System.out.println("A"); + System.out.println("!"); + } + ``` + + + } + + + +## 3、按步骤编写代码,效果如图所示: + +![](01_Java基础语法图片/3.jpg) + +- 编写步骤: + + 1. 定义类 Homework3 + + 2. 定义 main方法 + + 3. 控制台输出所有布尔类型常量值 + + 4. ```java + public class HomeWork3 { + public static void main(String[] args) { + System.out.println("ture"); + System.out.println("false"); + } + } + ``` + + + +## 4、按步骤编写代码,效果如图所示: + +![](01_Java基础语法图片/4.jpg) + +- 编写步骤: + + 1. 定义类 Homework4 + + 2. 定义 main方法 + + 3. 定义2个 byte类型变量,分别赋byte类型范围内最大值和最小值,并输出在控制台. + + 4. 定义2个 short类型变量,分别赋short类型范围内的值,并输出在控制台. + + 5. 定义2个 int类型变量,分别赋int类型范围内的值,并输出在控制台. + + 6. 定义2个 long类型变量,分别赋超过int类型范围的值,并输出在控制台. + + 7. ```java + public class HomeWork4 { + public static void main(String[] args) { + byte a=-128; + System.out.println(a); + byte b=127; + System.out.println(b); + short c=-32768; + System.out.println(c); + short d=32767; + System.out.println(d); + int e=-2147483648,f=2147483647; + System.out.println(e); + System.out.println(f); + long g=-2147483648l,h=2147483648l; + System.out.println(g); + System.out.println(h); + } + } + ``` + + + +## 5、按步骤编写代码,效果如图所示: + +![](01_Java基础语法图片/5.jpg) + + + +* 编写步骤: + 1. 定义类Homework5 + + 2. 定义 main方法 + + 3. 定义2个 float类型变量,分别赋值,并输出在控制台. + + 4. 定义2个 double类型变量,分别赋值,并输出在控制台. + + 5. ``` + public class HomeWork5 { + public static void main(String[] args) { + float a=-3.14f,b=3.14f; + double c=-3.4,d=3.4; + System.out.println(a); + System.out.println(b); + System.out.println(c); + System.out.println(d); + } + } + ``` + + + +## 6、交换两个变量的值 + +编写步骤: + +1. 定义类Homework6 + +2. 定义 main方法 + +3. 定义两个整数变量a,b并赋值 + +4. 控制台输出变量a,b互换前的值 + +5. 定义一个第三方变量temp + +6. 利用第三方变量temp使a,b的值互换 + +7. 控制台输出变量a,b互换后的值 + +8. ```java + public class HomeWork6 { + public static void main(String[] args) { + int a=10,b=20; + System.out.println(a); + System.out.println(b); + int temp; + temp=a; + a=b; + b=temp; + System.out.println(a); + System.out.println(b); + } + ``` + + + } + +## 7、按步骤编写代码,效果如图所示: + +![](01_Java基础语法图片/8.png) + + + +* 开发提示:四则运算的符号 + + ```java + 加: + + 减: - + 乘: * + 除: / + ``` + +* 编写步骤: + + 1. 定义类 Homework7 + + 2. 定义 main方法 + + 3. 定义2个int类型变量x、y,x赋值为100,y赋值为200 + + 4. 定义新变量add,保存变量x,y的和并打印到控制台 + + 5. 定义新变量sub,保存变量x,y的差并打印到控制台 + + 6. 定义新变量mul,保存变量x,y的积并打印到控制台 + + 7. 定义新变量div,保存变量x,y的商并打印到控制台 + + 8. ```java + public class HomeWork7 { + public static void main(String[] args) { + int x=100,y=200; + int add=x+y; + System.out.println("x,y的和为:"+add); + System.out.println("x,y的积为:"+x*y); + System.out.println("x,y的差为:"+(x-y)); + System.out.println("x,y的商为:"+(x/y)); + } + } + ``` + + + +## 8、按步骤编写代码,效果如图所示: + +![](01_Java基础语法图片/9.png) + +- 开发提示:四则运算的符号 + + ```java + 加: + + 减: - + 乘: * + 除: / + ``` + +- 编写步骤: + + 1. 定义类 Homework8 + + 2. 定义 main方法 + + 3. 定义2个double类型变量x、y,x赋值为100.8,y赋值为20.6 + + 4. 定义新变量add,保存变量x,y的和并打印到控制台 + + 5. 定义新变量sub,保存变量x,y的差并打印到控制台 + + 6. 定义新变量mul,保存变量x,y的积并打印到控制台 + + 7. 定义新变量div,保存变量x,y的商并打印到控制台 + + 8. ```java + public class HomeWork8 { + public static void main(String[] args) { + double x=100.8,y=20.6; + double add=x+y; + double sub=x-y,mul=x*y,div=x/y; + System.out.println(add); + System.out.println(sub); + System.out.println(div); + System.out.println(mul); + } + } + ``` + + + +## 9、简答题 + +(1)Java的基本数据类型有哪些?String是基本数据类型吗? + +```java +Java的基本数据类型有:byte,short,int,long,float,double,char,boolean + String不是基本数据类型 +``` + +(2)float f=3.4;是否正确,表达式15/2*2的值是多少 + +```java +float f=3.4; //错误,因为3.4默认是double类型 + System.out.println(15/2*2); //14,因为15/2结果是7 +``` + +(3)char型变量中是否可以存储一个汉字? + +``` +可以 +``` + diff --git "a/48 \346\235\250\346\264\213/20230325 \344\275\234\344\270\232.md" "b/48 \346\235\250\346\264\213/20230325 \344\275\234\344\270\232.md" new file mode 100644 index 0000000000000000000000000000000000000000..f7522520da08de0892476b58c1f4bc65ca2aff6d --- /dev/null +++ "b/48 \346\235\250\346\264\213/20230325 \344\275\234\344\270\232.md" @@ -0,0 +1,370 @@ +```sql +# 1 创建数据库,并设置字符集 + +create database yes charset utf8; +use yes; +# 2 使用数据库 + + +# 3 创建表结构 创建一个就插入一个表的数据 + +-- 创建价格表结构 +create table price( + id int primary key auto_increment, -- 价格编号 + price double -- 水果价格 +); + +-- 插入价格数据 +insert into price values(1,2.30); +insert into price values(2,3.50); +insert into price values(4,null); +insert into price values(3,5.5); + +-- 创建水果表结构 +create table fruit( + id int primary key auto_increment, -- 水果编号 + name varchar(20) not null, -- 水果名称 + price_id int, -- 价格编号 + foreign key(price_id) references price(id) +); + +-- 插入水果的数据 +insert into fruit values(1,'苹果',1); +insert into fruit values(2,'橘子',2); +insert into fruit values(3,'香蕉',null); + + + +-- 3.多表查询 + -- 3.1.笛卡尔积 + -- 需求:查询水果和价格信息 +select name,price,price_id from price p right join fruit f on p.id=f.price_id; + +-- 3.2.内连接 +-- 避免笛卡尔积问题怎么处理? + + + +-- 练习:查询苹果信息,显示苹果id和价格 +-- 分析:在水果表中可以查看苹果id 名字 ,在价格表中可以查看价格和价格id +select f.id,price from fruit f inner join price p on p.id=f.price_id; + +-- 3.3左外连接 +-- 练习:查询所有水果信息和对应价格信息 +-- fruit f 位于left左边,称为左表,左外连接以左表为主 +-- price p 位于left右边,称为右表 +-- f.* :获取fruit水果表中的所有数据 +-- p.price : 获取price价格表的字段price的值 +select * from fruit f left join price p on p.id=f.price_id; + +-- 练习:查询没有写价格的水果及价格(先查询所有水果的价格信息,再筛选。) +select * from fruit f left join price p on p.id=f.price_id where price is null; + + + +-- 3.4右外连接 +-- 练习:使用右外连接查询所有价格对应的水果名称和价格信息, +-- right join 表示右连接 +-- price p 称为右表 右外连接会查询右表即price表的全部数据以及和左表fruit f的交集 +select * from fruit right join price on fruit.id=price.id; +-- 练习:查询出没有对应水果的价格编号和价格,水果名 +select fruit.id,price,name from fruit left join price on fruit.id=price.id where price_id is null; +-- 练习:使用左外连接查询价格对应的水果,显示所有价格 +select * from fruit left join price on fruit.id=price.id; + + +-- 4.子查询 + + -- 创建部门表 1 + CREATE TABLE dept ( + id INT PRIMARY KEY AUTO_INCREMENT, -- 部门编号 + NAME VARCHAR(20) -- 部门名称 + ); + + INSERT INTO dept (NAME) VALUES ('开发部'),('市场部'),('财务部'); + + -- 创建员工表 n + CREATE TABLE emp ( + id INT PRIMARY KEY AUTO_INCREMENT, + NAME VARCHAR(10), + gender CHAR(1), -- 性别 + salary DOUBLE, -- 工资 + join_date DATE, -- 入职日期 + dept_id INT, -- 部门编号 + foreign key(dept_id) references dept(id) + ); + + INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('孙悟空','男',7200,'2013-02-24',1); + INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('猪八戒','男',3600,'2010-12-02',2); + INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('唐僧','男',9000,'2008-08-08',2); + INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('白骨精','女',5000,'2015-10-07',3); + INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('蜘蛛精','女',4500,'2011-03-14',1); + + +-- 1.查询工资最高的员工是谁 + -- 1.1 在emp员工表中查询最高工资 -- 9000 单行单列 +select max(salary) from emp ; + -- 1.2在emp员工表中根据上述查询的最高工资查询员工信息 +select * from emp where salary =(select max(salary) from emp); +-- 2.查询工资小于平均工资的员工有哪些? + -- 2.1在emp员工表中查询平均工资 -- 单行单列 5860 +select avg(salary) from emp; + -- 2.2在emp员工表中查询小于上述的平均工资查询员工信息 +select * from emp where salary <(select avg(salary) from emp); +-- 3.查询工资大于5000的员工,来自于哪些部门,显示部门的名字 + -- 3.1 在员工表emp中查询工资大于5000的员工部门编号 -- 1 2 单列多值 作为子查询的条件使用in +select id from emp where salary > 5000; + -- 3.2在dept部门表中根据上述查询的部门编号查询部门名字 +select * from dept where id in(select id from emp where salary > 5000); +-- 4. 查询开发部与财务部所有的员工信息 + -- 4.1 在dept表查询开发部和财务部的部门编号 -- 1 3 多行单列 作为子查询的条件使用in +select id from dept where name ='开发部' xor name ='财务部'; + -- 4.2在emp员工表中根据上述查询的部门编号查询员工信息 +select * from emp where id in(select id from dept where name ='开发部' xor name ='财务部'); + +-- 5.查询出2011年以后入职的员工信息,包括部门名称 + -- 5.1在emp表中查询2011年以后入职的员工信息 -- 多行多列,作为子查询一般使用as起别名作为临时表和其他表查询. + select * from emp where join_date >(select join_date from emp where join_date like'2011______'); + -- 5.2 将上述查询的结果作为临时表和dept表关联查询最后查询员工信息和部门名称 +select * from dept where id in(select dept_id from emp where join_date >(select join_date from emp where join_date like'2011______')) ; + +-- 5.多表练习 子查询 +-- 教师表 + create table teacher ( + id int(11) primary key auto_increment, -- 教师编号 + name varchar(20) not null unique -- 教师姓名 + ); + +-- 学生表 + create table student ( + id int(11) primary key auto_increment, -- 学生编号 + name varchar(20) NOT NULL unique, -- 学生姓名 + city varchar(40) NOT NULL, -- 学生城市 + age int -- 学生年龄 + ) ; + +-- 课程信息表 + create table course( + id int(11) primary key auto_increment, -- 课编号 + name varchar(20) not null unique, -- 课程名称 + teacher_id int(11) not null, -- 教师编号 + foreign key(teacher_id) references teacher (id) + ); + +-- 学生选课表 + create table studentcourse ( + student_id int NOT NULL, -- 学生编号 + course_id int NOT NULL, -- 课程编号 + score double NOT NULL, -- 考试成绩 + foreign key (student_id) references student (id), + foreign key (course_id) references course (id) + ); + + insert into teacher values(null,'关羽'); + insert into teacher values(null,'张飞'); + insert into teacher values(null,'赵云'); + + insert into student values(null,'小王','北京',20); + insert into student values(null,'小李','上海',18); + insert into student values(null,'小周','北京',22); + insert into student values(null,'小刘','北京',21); + insert into student values(null,'小张','上海',22); + insert into student values(null,'小赵','北京',17); + insert into student values(null,'小蒋','上海',23); + insert into student values(null,'小韩','北京',25); + insert into student values(null,'小魏','上海',18); + insert into student values(null,'小明','广州',20); + + insert into course values(null,'语文',1); + insert into course values(null,'数学',1); + insert into course values(null,'生物',2); + insert into course values(null,'化学',2); + insert into course values(null,'物理',2); + insert into course values(null,'英语',3); + + insert into studentcourse values(1,1,80); + insert into studentcourse values(1,2,90); + insert into studentcourse values(1,3,85); + insert into studentcourse values(1,4,78); + insert into studentcourse values(2,2,53); + insert into studentcourse values(2,3,77); + insert into studentcourse values(2,5,80); + insert into studentcourse values(3,1,71); + insert into studentcourse values(3,2,70); + insert into studentcourse values(3,4,80); + insert into studentcourse values(3,5,65); + insert into studentcourse values(3,6,75); + insert into studentcourse values(4,2,90); + insert into studentcourse values(4,3,80); + insert into studentcourse values(4,4,70); + insert into studentcourse values(4,6,95); + insert into studentcourse values(5,1,60); + insert into studentcourse values(5,2,70); + insert into studentcourse values(5,5,80); + insert into studentcourse values(5,6,69); + insert into studentcourse values(6,1,76); + insert into studentcourse values(6,2,88); + insert into studentcourse values(6,3,87); + insert into studentcourse values(7,4,80); + insert into studentcourse values(8,2,71); + insert into studentcourse values(8,3,58); + insert into studentcourse values(8,5,68); + insert into studentcourse values(9,2,88); + insert into studentcourse values(10,1,77); + insert into studentcourse values(10,2,76); + insert into studentcourse values(10,3,80); + insert into studentcourse values(10,4,85); + insert into studentcourse values(10,5,83); + + + + + +-- 1.查询获得最高分的学生信息。 + -- 1.1 在中间表中查询最高分-- 95 单行单列 +select max(score) from studentcourse; + -- 1.2 在中间表中根据上述查询的最高分查询学生id +select student_id from studentcourse where score=(select max(score) from studentcourse); + -- 1.3在学生表中根据上述查询的学生id查询学生信息 -- 一个班级最高分95,可以有多名学员,结果有可能是多行多列 +select * from student where id =(select student_id from studentcourse where score=(select max(score) from studentcourse)); + +-- 2.查询编号是2的课程比编号是1的课程最高成绩高的学生信息。 + -- 2.1在中间表查询课程编号是1的最高分数 -- 80 +select max(score) from studentcourse where course_id =1; + -- 2.2在中间表中查询课程编号是2并且分数大于上述结果的学生编号 -- 多行单列 +select student_id from studentcourse where course_id=2 and score >(select max(score) from studentcourse where course_id =1); + + -- 2.3 在学生表中根据上述查询的学生编号查询学生信息 +select * from student where id in(select student_id from studentcourse where course_id=2 and score >(select max(score) from studentcourse where course_id =1)); +-- 3.查询编号是2的课程比编号是1的课程最高成绩高的学生姓名和成绩。 + -- 3.1在中间表查询课程编号是1的最高分数 -- 80 +select max(score) from studentcourse where course_id =1; + -- 3.2在中间表中查询课程编号是2并且分数大于上述结果的学生编号和分数 -- 多行多列作为临时表 +select student_id,score from studentcourse where course_id=2 and score >(select max(score) from studentcourse where course_id =1); + -- 3.3 将上述查询的结果作为临时表 +-- 4.查询每个同学的学号、姓名、选课数、总成绩 +select student_id,count(course_id),sum(score) from studentcourse GROUP BY student_id ; + -- 4.1在中间表中根据学号分组查询学号 选课数 总成绩 -- 多行多列,作为临时表 + -- 4.2将上述查询的结果作为临时表和学生表进行关联查询 +select stu.name,a.* from student stu join (select student_id,count(course_id),sum(score) from studentcourse GROUP BY student_id) as a on stu.id=a.student_id; +/* + 注意:如果子查询中查询的结果字段是聚合函数,并且最后结果需要使用聚合函数,那么必须使用as给聚合函数的字段起别名 + */ + + + +drop database yes; +-- 6.多表练习 连接查询 + -- 部门表 + CREATE TABLE dept ( + id INT PRIMARY KEY PRIMARY KEY, -- 部门id + dname 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, -- 员工id + ename VARCHAR(50), -- 员工姓名 + job_id INT, -- 职务id + mgr 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.查询所有员工信息。显示员工编号,员工姓名,工资,职务名称,职务描述。 + -- 1.1 确定几张表关联查询:2张表 emp job + select * from emp join job; + -- 1.2 确定连接查询的条件即避免笛卡尔积的条件 emp.job_id = job.id + select * from emp join job on emp.job_id = job.id; + -- 1.3 确定要查询的结果字段:员工编号,员工姓名,工资,职务名称,职务描述 +select j.id,ename,salary,jname,description from emp e join job j on e.job_id=j.id; + +-- 2.查询所有员工信息。显示员工编号,员工姓名,工资,职务名称,职务描述,部门名称,部门位置 + -- 2.1 确定几张表关联查询:3张表 emp job dept +select * from emp e join job j on e.job_id=j.id left join dept d ON d.id=e.dept_id; + -- 2.2 确定连接查询的条件即避免笛卡尔积的条件 emp.job_id = job.id and emp.dept_id=dept.id +select * from emp e join job j on e.job_id=j.id left join dept d ON d.id=e.dept_id; + -- 2.3 确定要查询的结果字段:员工编号,员工姓名,工资,职务名称,职务描述,部门名称,部门位置 +select j.id,ename,salary,jname,description,dname,loc from emp e join job j left join dept d on e.job_id = j.id and e.dept_id = d.id; +/* + 连接查询规律: + 1.确定几张表关联 + 2.确定连接查询的条件 + 3.确定要查询的结果字段 + 4.如果是n张表关联,那么避免笛卡尔积的条件的个数是:n-1 + */ + + +-- 3.查询所有员工信息。显示员工姓名,工资,职务名称,职务描述,部门名称,部门位置,工资等级。 + -- 1.确定几张表关联 4张表 emp job dept salarygrade + -- 2.确定连接查询的条件 :emp.job_id = job.id and emp.dept_id=dept.id + -- 其他条件:e.salary between salarygrade.losalary and salarygrade.hisalary + -- 3.确定要查询的结果字段 +select e.name 员工姓名,e.salary 工资,j.janme 职务名称,j.desciption 职务描述,d.loc 部门位置,d.dname 部门名称,s.grade 工资等级 from emp e,job j,dept d,salarygrade s where emp.job_id = job.id and emp.dept_id=dept.id and e.salary between salarygrade.losalary and salarygrade.hisalary; +-- 4.查询出每个部门的部门编号、部门名称、部门位置、部门人数 + -- 4.1 在emp表中按照部门编号分组查询部门编号和每个部门人数 + -- 4.2 几张表关联:dept 上述临时表 + -- 4.3 条件 dept.id和临时表的dept_id相等 + -- 4.4 分析查询的结果部门编号、部门名称、部门位置、部门人数 + select dept.id 部门编号,dept.dname 部门名称,dept.loc 部门位置,count(emp.id) from dept,emp where dept.id=emp.id and group by dept.id; + +``` +