查询关键字:
1. 删除重复内容:distinct
2. 模糊查询:like
3. between and
4.筛选查询条件在in括号里面的人的信息
5. 查询员工表中年龄字段为(或者不为)null的员工信息
6. 查询员工工资从高到低(倒序)排序显示:正序、倒序
7. 字符串长度:length
8. 拼接字符串:concat
9. 小写转大写:upper
10. 大写转小写:lower
11. 截位:substring
12.去掉空格或者其它字符:trim
13. 替换字符:replace
14. 四舍五入:round
15. 向上取整、向下取整:ceil、floor
16. 截断:truncate
17. 截取:substr
18. 取余函数:mod
19. 日期函数:
此刻时间:now
返回日期,不包含时间:curdate
返回时间,不包含日期:curtime
返回年:year
返回月:month
格式化日期:date_format
字符串转日期:str_to_date
20. if函数
21. case语句
22. 分组函数:
求和函数:sum
平均数:avg
最大值:max
最小值:min
求一列有多少条数据:count
23.分组查询:分组查询,分组查询必须和分组函数一起来用才可以(用来查询分组信息)
24. 过滤条件:having。可以放分组函数,where不可以
25.多表连接
26.交叉连接
27.避免交叉连接,即内连接
28. 等值内连接
29. 不等值内连接
30. 外连接、左外连接、右外连接
31. 联合查询
32. 自连接
33. 子查询
34. 标量子查询
35. all、any、in
36. 列子查询
37. 行子查询可以使用等号
38. select后子查询
39. from后子查询
40. 相关子查询:exists
41. 分页:limit
42. 关键字的书写顺序及执行顺序
43. 插入语句
44. 插入多条数据
45. 删除数据
46. 更新数据
47. 开启/回滚事务
48. 创建视图
49. 级联视图
50. 本地检查
51. 级联检查
52. 更新视图
53. 删除视图
54. 查看视图
55. 查看视图的定义
56.约束(非空约束、唯一约束、主键约束、默认约束、外键约束、级联删除)
57.DDL(创建数据库、查看有几个数据库、使用数据库、创建一个表、查看当前数据库有哪些表、删除当前数据库中的表)
58.修改表的属性(加字段、修改表的字段名称和类型、删除列、)
59.变量(系统变量:全局变量、会话变量;自定义变量:用户变量、局部变量)
60.查看数据库中的变量(全局变量、会话变量、模糊查询、给全局变量或者会话变量赋值,)
61.存储过程(创建存储过程)
62. INOUT的使用
63. PLSQL:过程语言
64. 游标
习题索引:
1. //查询一个数据库中的所有内容
2. //删除重复的内容
3. //查询名字为De Haan,并且工资为90000的人的信息。
4. //查询员工表中,名字为Hunold或Ernst的人的信息
5. // 给查询的列明换一个别名
6. //查询员工表中名字不等于周杰伦的人的信息
7. //查询工资大于1000的人
8. //查询部门编号等于100的人
9. //查询部门编号是50的部分的名称
10. //查询年龄大于30岁并且部门编号不等于50的人
11. //模糊查询:查询员工表中叫周什么的人的信息
12. //查询员工表中叫周_(姓名只有两个字)的信息
13. //查询员工表中以D开头的人的信息
14. //查询员工姓名带有k字母的人
15. //查询姓名第二位为a的员工的工资、姓名和年龄
16. //查询部门表中的所有信息
17. //查询部门名为a开头的部门名称
18. //查询员工工资在10000到100000之间的人的信息,between and 包含临界值
19. //查询员工id是100或106的人的信息
20. //查询姓名为k开头的员工的年龄为30或者35的人的信息
21. //查询员工表中年龄字段为null的员工信息
22. //查询员工表中年龄字段不为null的员工信息
23. //查询员工工资从高到低(倒序)排序显示
24. //查询员工工资从低到高(正序)排序显示,如果不写排序关键字的话就是按照正序输出
25. //显示出表employees部门编号在80-100之间的姓名、职位
26. //查询名字包含k的员工信息,并先按工资降序输出
27. //显示出表employees的manager_id是100,101,110的员工姓名、职位
28. //选择工资不在5000到12000的员工的姓名和工资,不包括边界值
29. //选择姓名中有字母a员工姓名
30. //选择在20或50号部门工作的员工姓名和部门号
31. //查询员工表中的员工姓名的长度包括空格
32. //查询员工表中工资大于5000的人的人的姓名加上好厉害呀
33. //将员工的姓名按首字母排序,并输出姓名的长度和员工姓名
34. //将部门名称中首字母带有A(a)的部门名称,将所有A(a)替换为B然后把该部门名称输出
35. //查询出emp表中,工资不在1000到3000之间的员工,其工资和姓名(姓名要求全部大写,工资包含临界值)
36. //查询出emp表中,工资大于10000或者小于3000的员工,其姓名从1到5截位后的结果,及其职位的长度(工资包含临界值)
37. //查询出emp表中,所有人工资除以3后,保留2位小数后结果的长度(需要精准2位)。
38. //查询出员工表中, 所有员工的编号, 姓名(要求所有字母大写,只要1到4位),职位长度除以3取余。
39. //查询员工表中名字为Ernst 的 编号, 姓名, 职位, 及部门编号。
40. //查询员工表中, 工资在10000到20000之间的员工,其姓名, 工资除以3后保留两位小数的结果。
41. //查询名字是De Haan的员工,则工资加666,否则工资不变。
42. //查询员工表中工资等于4200的人,输出你好棒,工资等于4800的人,输出太棒了,否则输出加油
43. //查询员工表中,如果工资大于10000的人,输出嘻嘻,否则输出哈哈
44. //查询员工表中工资大于10000,工资列显示“高”否则显示低。
45. //当员工表中存在工资为9000的人,输出其姓名,否则输出工资
46. //当员工年薪大于288000的人输出高,有小于204000.00的人输出较低,否则输出继续
47. //工资是10000-20000输出A,否则输出B,并在显示中加入员工年龄,员工工资。
48. //查询员工表中工资最高的人的信息。
49. //查询员工表中年龄大于30岁的人的平均工资
50. //查询员工表中年龄等于30岁的一共多少人。
51. //查询公司员工工资的最大值,最小值,平均值,总和
52. //查询员工数量和工资平均值
53. //查询每个部门的人数
54. //查询每个部门下的工资总和
55. //查询人数大于10的部门的信息
56. //查询具有各个职位的员工人数。
57. //查询各职位的员工工资的最大值,最小值,平均值,总和。
58. //查询各部门平均工资小于30000的部门编号。
59. //求出各部门中平均工资大于6000的部门以及其平均工资
60. //查询各部门部门编号,员工数量和工资平均值
61. //查询员工所对应的部门的名称
62. //查询员工所对应的工资等级alter
63. //查询员工所在部门的部门名字、员工的名字。
64. //查询年龄为30岁的人对应的部门名称,部门编号
65. //查询员工姓名为Kochhar的人对应的部门名称
66. //查询部门所在城市名称
67. //查询部门名为SAL或IT的员工信息
68. //查询90号部门job_id和location_id
69. //查询名称为"Mar"的部门所对应的城市名称、部门编号
70. //查询员工所对应的职位全称、员工姓名、职位id(没有对应则不显示)
71. //查询员工所对应的部门名称、职位全称(没有对应则不显示)
72. //查询年龄大于30的人所对应的部门名称、员工姓名、员工编号,薪资
73. //查询年薪大于120000的人的部门编号、部门名称、员工姓名
74. //查询员工表中对应的部门名称(员工信息全部展示)
75. //查询各部门的最大工资,平均工资。
76. //查询各部门员工工资小于5000的人数。
77. //查询员工对应的职位全称、员工姓名,员工薪资(将员工信息全部展示出来)
78. //查询员工所对应的职位全称、员工姓名、职位id
79. //查询员工所对应的部门名称、职位全称
80. //查询员工姓名,老板姓名在一列显示出来;员工年龄,老板年龄在一列显示出来
81. //查询员工表中员工以及对应的经理的姓名
82. //查询哪个城市没有部门,并输出其城市的名称,位置编号。 子查询
83. //查询出emp表中工资大于5000
,并且小于10000的员工的姓名和工资
84. //查询员工编号为100的人所对应的部门编号、部门名称
85. //查询老板年龄和员工年纪,在一列显示出来(不去重复)
86. //查询员工对应的部门编号和部门名称。
87. //查询工资比105号员工高的所有人信息
88. //查询工资比Austin高的的人的信息
89. //查询工资为10000的人的部门名称,员工姓名。
90. //查询年薪比100号员工高的所有人信息->
91. //查询工资最低的员工信息
92. //查询比103号或104号员工高的员工的信息
93. //查询年龄、工资都与Hunold相同的员工信息
94. //年龄比100号或106号员工小的员工的信息
95. //查询工资和部门都与De Haan相同的员工信息
96. // location_id是1400或1700的部门中的所有员工姓名
97. //查询员工工资比本部门平均工资高(不包含临界值)的员工的员工号,姓名和工资
98. //查询比103号年龄大,并且工资高的人的信息
99. //查询与103号年龄和工资都相同的人的信息
100. //查询部门名为 SAL 或IT 的员工信息。
101. //查询 90 号部门job_id 和 location_id
102. //查询名称为“Mar”的部门所对应的城市名称、部门编号。
103. //查询比103号员工年薪高,年龄大的员工编号、姓名
104. //利用部门表查询每个部门的员工个数、部门编号、部门名称
105. //查询每个职位的员工个数、职位编号、职位名称
106. //查询工资最高的员工的姓名,要求列名显示为“姓名”
107. //查询员工所对应的部门名称、职位全称(没有对应则不显示)。
108. //查询位置表中每个位置的位置编号、部门数量、国家名。
109. //每个部门的平均工资的工资等级
110. //查询部门表是否存在年龄大于21岁的员工,如果存在则输出该部门的信息。
111. //查询和姓名中包含字母 u 的员工在相同部门的员工的员工号和姓名。
112. //查询和 Hunold 相同部门的员工姓名和工资
113. //查询工资比公司平均工资高的员工的员工号,姓名和工资
114. //查询平均工资最高的部门信息
115. //查询所有部门所对应的城市的位置
116. //查询比105号员工的名字长度长并且工资高的员工信息
117. //查询年龄大于20岁的员工部门
118. //查询员工表中前四条数据
119. //查询员工名字里带a,并且年龄在25-40之间的人的信息
120. //每个部门的平均工资的工资等级
121. //查询城市名称是Tokyo的部门编号
122. //查询部门表是否存在年龄大于30岁的员工,如果存在则输出该部门的信息
123. //查询各部门工资总和以及部门编号
124. //查询具有各个职位的员工人数
125. //查询各职位的员工工资的最大值、最小值、平均值、总和
126. //查询各部门平均工资小于5000的部门编号
127. //查询员工表中从第4条开始,到第7条的数据
128. //查询各部门编号,员工数量和工资平均值
129. //查询所有部门所对应的员工的部门的名称、部门号和员工信息
130. //查询各部门员工工资小于5000的人的平均工资
131. //查询所有部门的编号、员工数量、和平均工资
132. //查询员工编号最小,并且工资最高的员工信息
133. //查询各部门中年龄大于30岁的人的平均工资
134. //求出各部门中平均工资大于7000的部门以及其平均工资
135. //将员工表中工资比较高的5个人显示出来
136. //将员工表中工资最高的5个人按照编号降序查询
137. //查询员工表中id为103号员工的信息
138. //用存储过程显示名字为“De Haan”的人的信息
139. //用存储过程实现根据名字“Hunold”的员工,返回该员工所对应的部门名称
第一天:
// 查询一个数据库中的所有内容
SELECT *
FROM employees;
// 删除重复的内容
SELECT distinct last_name
from employees;
-- 查询名字为De Haan,并且工资为90000的人的信息。
select *
from employees
where last_name = 'De Haan'
and salary = 17000;
-- 查询员工表中,名字为Hunold或Ernst的人的信息
select *
from employees
where last_name = 'Hunold'
or last_name = 'Ernst';
// 给查询的列明换一个别名
select distinct last_name as '员工姓名'
from employees;
-- 查询员工表中名字不等于周杰伦的人的信息
select *
from employees
where last_name <> '周杰伦';
-- 查询工资大于1000的人
select *
from employees
where salary > 1000;
-- 查询部门编号等于100的人
select *
from employees
where department_id = 100;
-- 查询部门编号是50的部分的名称
select department_name
from departments
where department_id = 50;
-- 查询年龄大于30岁并且部门编号不等于50的人
select *
from employees
where year > 30 and department_id<> 50;
-- 模糊查询:查询员工表中叫周什么的人的信息
select *
from employees
where last_name like '周%';
-- 查询员工表中叫周_(姓名只有两个字)的信息
select *
from employees
where last_name like '周_';
-- 查询员工表中以D开头的人的信息
select *
from employees
where last_name like 'D%';
-- 查询员工姓名带有k字母的人
select *
from employees
where last_name like '%k%';
-- 查询姓名第二位为a的员工的工资、姓名和年龄
select salary,last_name,year
from employees
where last_name like '_a%';
-- 查询部门表中的所有信息
select *
from departments;
-- 查询部门名为a开头的部门名称
select department_name
from departments
where department_name like 'a%';
-- 查询员工工资在10000到100000之间的人的信息,between and 包含临界值
select *
from employees
where salary between 10000 and 100000;
-- 和下面这条语句相同
select *
from employees
where salary >= 10000 and salary <=100000;
-- 筛选查询条件在in括号里面的人的信息
-- 查询员工id是100或106的人的信息
select *
from employees
where employee_id in(100,106,101,100,104,105,107);
-- 查询姓名为k开头的员工的年龄为30或者35的人的信息
select *
from employees
where year in (30, 35) and last_name like'k%';
-- 查询员工表中年龄字段为null的员工信息
select *
from employees
where year is null;
-- 查询员工表中年龄字段不为null的员工信息
select *
from employees
where year is not null;
-- 查询员工工资从高到低(倒序)排序显示
select *
from employees
order by salary desc;
-- 查询员工工资从低到高(正序)排序显示,如果不写排序关键字的话就是按照正序输出
select *
from employees
order by salary asc;
-- 显示出表employees部门编号在80-100之间的姓名、职位alter
select last_name,job_id
from employees
where department_id between 80 and 100;
-- 查询名字包含k的员工信息,并先按工资降序输出
select *
from employees
where last_name like '%k%'
order by salary desc;
-- 显示出表employees的manager_id是100,101,110的员工姓名、职位alter
select last_name,job_id
from employees
where manager_id in (100,101,110);
-- 选择工资不在5000到12000的员工的姓名和工资,不包括边界值
select *
from employees
where salary not between 5000 and 12000;
-- 选择姓名中有字母a员工姓名
select last_name
from employees
where last_name like '%a%';
-- 选择在20或50号部门工作的员工姓名和部门号
select last_name,department_id
from employees
where department_id in (60,100);
-- 查询员工表中的员工姓名的长度包括空格
select length(last_name),last_name
from employees;
-- length()包括空格
select length('tom');
-- 查询员工表中工资大于5000的人的人的姓名加上好厉害呀
select concat(last_name,'好厉害呀')
from employees
where salary > 5000;
-- 将小写转大写
select upper(last_name)
from employees;
-- 将大写转小写
select lower(last_name)
from employees;
-- substring,第一位索引为1,第二个参数是索引开始位置,第三个参数是长度
select substr('我是小明',2);
select substr('我是小明',2,2);
-- trim去掉空格
select trim(' 小明 ');
select length(trim(' 小明 '));
-- trim去掉字符,both的效果和不写是一样的
select trim('a' from 'aaaaaaaaaa小明aaaaaaaaaaa');
select trim(leading 'a' from 'aaaaaaaaaa小明aaaaaaaaaaa');
select trim(trailing 'a' from 'aaaaaaaaaa小明aaaaaaaaaaa');
select trim(both 'a' from 'aaaaaaaaaa小明aaaaaaaaaaa');
-- replace
select replace('我是小明','小明','小红');
-- 作业
-- 将员工的姓名按首字母排序,并输出姓名的长度和员工姓名
select length(last_name),last_name
from employees
order by last_name asc;
-- 将部门名称中首字母带有A(a)的部门名称,将所有A(a)替换为B然后把该部门名称输出
select *
from departments;
select replace(upper(department_name),'A','B')
from departments
where department_name like 'a%';
-- 查询出emp表中,工资不在1000到3000之间的员工,其工资和姓名(姓名要求全部大写,工资包含临界值)
select salary,upper(last_name)
from employees
where salary not between 1000 and 3000;
-- 查询出emp表中,工资大于10000或者小于3000的员工,其姓名从1到5截位后的结果,及其职位的长度(工资包含临界值)
select *
from employees;
select substr(last_name,1,5) ,length(job_id)
from employees
where salary >= 10000 or salary <=3000;
第二天:
-- round,一个参数直接四舍五入返回整数,两个参数的话第二位为保留小数的位数
select round(12.5533, 2);
-- 向上取整数
select ceil(1.5);
-- 向下取整
select floor(-1.5);
-- 截断truncate,从哪里开始就不要了,是数学函数,作用于小数部分,可以理解为保留几位小数
select truncate(12.589,1);
-- 截取,从哪里开始要,是字符函数
select substr('我是小明',2);
-- 取余函数mod,被除数的正负和余数的正负一致
select mod(-10,3);
-- 作业------------------------
-- 查询出emp表中,所有人工资除以3后,保留2位小数后结果的长度(需要精准2位)。
select *
from employees;
select length(truncate(salary/3,2)),salary
from employees;
-- 查询出员工表中, 所有员工的编号, 姓名(要求所有字母大写,只要1到4位),职位长度除以3取余。
selectemployee_id,substr(upper(last_name),1,4),mod(length(job_id),3)
from employees;
-- 查询员工表中名字为Ernst 的编号, 姓名, 职位, 及部门编号。
selectemployee_id,last_name,job_id,department_id
from employees
where last_name = 'Ernst';
-- 查询员工表中, 工资在10000到20000之间的员工,其姓名, 工资除以3后保留两位小数的结果。
selectlast_name,salary,truncate(salary/3,2)
from employees
where salary between 10000 and 20000;
-----------------------------
-- 日期函数
-- 此刻时间
select now();
-- 返回日期,不包含时间
select curdate();
-- 返回时间,不包含日期
select curtime();
-- 返回年,括号里面必须要有时间的参数
select year(now());
select year('2017/6/24 13/25.26');
-- 返回月alter
select month(now());
select month('2017/6/24 13/25.26');
-- 格式化日期alter
select date_format(now(),'%Y,%m,%d');
select date_format(now(),'%Y:%m:%d%H:%i:%s');
-- 字符串转日期alter
select str_to_date('2017-6-24 13:25:26','%Y-%m-%d');
-- if函数alter
select if(1=1,true,'FF');
select if(1=2,1,0);
-- 查询名字是De Haan的员工,则工资加666,否则工资不变。
select *
from employees;
select if(last_name='De Haan', salary +666,salary),last_name
from employees;
-- case语句alter
-- 第一种格式:相当于switch
-- 查询员工表中工资等于4200的人,输出你好棒,工资等于4800的人,输出太棒了,否则输出加油alter
select *
from employees;
select
case salary
when 4800
then '太棒了'
when 4200
then '你好棒'
else '加油哦'
end
from employees;
-- 第二种格式:相当于if语句
-- 查询员工表中,如果工资大于10000的人,输出嘻嘻,否则输出哈哈
select
case when salary > 10000
then '嘻嘻'
else '哈哈'
end
from employees;
-- 作业--------------------------------
-- 查询员工表中工资大于10000,工资列显示“高”否则显示低。
-- 第一种
select if(salary > 10000,'工资高','工资低'),salary
from employees;
-- 第二种
select
case when salary > 10000
then '高'
else '低'
end
salary
from employees;
-- 当员工表中存在工资为9000的人,输出其姓名,否则输出工资
select if(salary = 9000,last_name,salary)
from employees;
-- 当员工年薪大于288000的人输出高,有小于204000.00的人输出较低,否则输出继续加油。
select
case when salary * 12 > 288000
then '高'
when salary * 12 < 204000.00
then '低'
else '继续加油'
end
from employees;
-- 工资是10000-20000输出A,否则输出B,并在显示中加入员工年龄,员工工资。
select year,salary,
case when salary > 10000 and salary <20000
then 'A'
else 'B'
end
salary
from employees;
-- 作业----------------------------------
-- 分组函数
-- 求和函数,一个单元格就是一个标量,分组函数是排除null的
select sum(salary)
from employees;
-- 字符串或者数字加上null值都会变成null值
select 10 + null;
--求平均值,默认情况下,除数不会把null计算在内
select *
fromemployees;
--这样写,就可以把null计算在内
select avg(if(salary is null,0,salary))
fromemployees;
select avg(salary)
fromemployees;
--求最大值
select max(salary)
fromemployees;
--求最小值alter
select min(salary)
fromemployees;
--max和min也可以用于计算字符串的大小alter
--最大的是汉字,最小的是数字,中间是英文字符,
--以a——z排序,增大,从第一位开始比,第一位相同,比较第二位
select min(last_name)
from employees;
select min(last_name)
from employees;
-- 在数据库里,两个字符串相直接相加,结果为0
-- 必须用concat函数
-- sum和avg不可以用于求字符串,max和min可以
-- count()括号里面可以写*,同样可以查询一列有多少条数据,但效率更低
-- 求一列有多少条数据
select count(employee_id)
from employees;
-- 作业----------------------------
-- 查询员工表中工资最高的人的信息。
select *
from employees;
-- 1.查询最高工资alter
-- 2.工资等于最高工资的人的信息alter
select *
from employees
where salary = (select max(salary)
from employees);
-- 查询员工表中年龄大于30岁的人的平均工资
select avg(salary)
from employees
where year > 30;
-- 查询员工表中年龄等于30岁的一共多少人。
select count(year)
from employees
where year = 30;
-- 查询公司员工工资的最大值,最小值,平均值,总和
selectmax(salary),min(salary),avg(salary),sum(salary)
from employees;
-- 查询员工数量和工资平均值
select count(last_name),avg(salary)
from employees;
-- ----------------------------------------------
-- 分组查询,分组查询必须和分组函数一起来用才可以
-- 查询每个部门的人数
select department_id,count(*)
from employees
group by department_id;
--如果这么用的话,那么只会显示每组的信息的第一条,其余信息均不显示
select *
from employees
group by department_id;
-- 查询每个部门下的工资总和
select department_id,sum(salary)
from employees
group by department_id;
-- having 过滤条件,having可以放分组函数,where不可以
-- 查询人数大于10的部门的信息
select department_id
from employees
group by department_id
having count(employee_id) > 1;
-- 作业-----------------------------------alter
-- 查询具有各个职位的员工人数。
select *
from employees;
select job_id,count(employee_id)
from employees
group by job_id;
-- 查询各职位的员工工资的最大值,最小值,平均值,总和。
selectjob_id,max(salary),min(salary),avg(salary),sum(salary)
from employees
group by job_id;
-- 查询各部门平均工资小于30000的部门编号。
select *
from employees;
select department_id
from employees
group by department_id
having avg(if(salary is null, 0, salary))< 30000;
-- 求出各部门中平均工资大于6000的部门以及其平均工资
select department_id,avg(salary)
from employees
group by department_id
having avg(if(salary is null, 0, salary))> 6000;
-- 查询各部门部门编号,员工数量和工资平均值
selectdepartment_id,count(last_name),avg(salary)
from employees
group by department_id;
----------------------------------------------------
-- 多表连接
-- 交叉连接,要避免交叉连接
select count(*)
from employees cross join departments;
-- 可以用,号代替crossjoin
select count(*)
from employees, departments;
-- 避免交叉连接,加上有效的限制条件
-- 即,所谓的内连接
select *
from employees inner join departments
on employees.department_id =departments.department_id
第三天:
-- 等值内连接
-- 查询员工所对应的部门的名称
select departments.department_name
from employees inner join departments
on employees.department_id =departments.department_id;
-- 另外一种简写的方法
select d.department_name
from employees as e, departments as d
where e.department_id = d.department_id;
-- 不等值内连接
-- 查询员工所对应的工资等级alter
select j.grade_level,e.last_name
from employees as e inner join job_gradesas j
on e.salary between j.lowest_sal andj.highest_sal;
-- 作业-------------------------------------------------
-- 查询员工所在部门的部门名字、员工的名字。
select *
from departments;
select d.department_name, e.last_name
from employees as e inner join departmentsas d
on e.department_id = d.department_id;
-- 查询年龄为30岁的人对应的部门名称,部门编号
select d.department_name, d.department_id
from employees as e inner join departmentsas d
on e.department_id = d.department_id
where e.year = 30;
-- 查询员工姓名为Kochhar的人对应的部门名称。
select d.department_name
from employees as e inner join departmentsas d
on e.department_id = d.department_id
where e.last_name = 'Kochhar';
-- 查询部门所在城市名称alter
select *
from locations;
select d.department_name,l.city
from departments as d inner join locationsas l
on d.location_id = l.location_id;
-- 查询部门名为SAL或IT的员工信息alter
select *
from employees as e inner join departmentsas d
on e.department_id = d.department_id
where d.department_name in ('SAL','IT');
select *
from employees as e inner join departmentsas d
on e.department_id = d.department_id
where d.department_name in ('SAL','IT');
select *
from employees as e inner join departmentsas d
on e.department_id = d.department_id
and d.department_name in ('SAL','IT');
-- 查询90号部门job_id和location_id
select *
from departments;
select *
from employees;
select d.location_id, e.job_id
from employees as e inner join departmentsas d
on e.department_id = d.department_id
where d.department_id = 90;
-- 查询名称为"Mar"的部门所对应的城市名称、部门编号alter
select d.department_id,l.city
from departments as d inner join locationsas l
on d.location_id = l.location_id
where d.department_name = 'Mar';
-- 查询员工所对应的职位全称、员工姓名、职位id(没有对应则不显示)alter
select *
from jobs;
select j.job_title,j.job_id
from employees as e inner join jobs as j
on e.job_id = j.job_id;
-- 查询员工所对应的部门名称、职位全称(没有对应则不显示)
select *
from departments;
select *
from employees;
select *
from jobs;
select e.last_name, d.department_name, j.job_title
from employees as e inner join departmentsas d inner join jobs as j
on e.job_id =j.job_id and e.department_id =d.department_id;
-- 查询年龄大于30的人所对应的部门名称、员工姓名、员工编号,薪资alter
selectd.department_name,e.last_name,e.employee_id,e.salary
from employees as e inner join departmentsas d
on e.department_id = d.department_id
and e.year >30;
-- 查询年薪大于120000的人的部门编号、部门名称、员工姓名alter
selecte.last_name,d.department_id,d.department_name
from employees as e inner join departmentsas d
on e.department_id = d.department_id
where salary * 12 > 120000;
---------------------------------------------------------------
-- 外连接
-- 左外连接:左侧的表所有记录都会展示出来,符合条件的记录会与右侧的表相关联,
-- 不符合条件的记录将会和右侧的表空记录相关联。
-- 查询员工表中对应的部门名称(员工信息全部展示)
-- 内连接的情况,必须一一对应才显示
select e.last_name,d.department_name
from employees as e inner join departmentsas d
on e.department_id = d.department_id;
-- 左外连接:左边的相关信息全部显示,右边的没有以null代替
select e.last_name,d.department_name
from employees as e left join departmentsas d
on e.department_id = d.department_id;
-- 右外连接alter
select e.last_name,d.department_name
from employees as e right join departmentsas d
on e.department_id = d.department_id;
-- 作业-----------------------------------------------alter
-- 查询各部门的最大工资,平均工资。
select department_id,max(salary),avg(salary)
from employees
group by department_id;
-- 查询各部门员工工资小于5000的人数。
select department_id,count(employee_id)
from employees
where salary < 5000
group by department_id;
-- 这是错的
select department_id,count(salary <5000)
from employees
group by department_id;
select *
from employees;
-- 查询员工对应的职位全称、员工姓名,员工薪资(将员工信息全部展示出来)
select e.last_name, j.job_title, e.salary
from employees as e left join jobs as j
on e.job_id = j.job_id;
-- 查询员工所对应的职位全称、员工姓名、职位id 。
select e.last_name, j.job_title, e.job_id
from employees as e left join jobs as j
on e.job_id = j.job_id;
-- 查询员工所对应的部门名称、职位全称。
select *
from departments;
select e.last_name, j.job_title,d.department_name
from employees as e inner join jobs as jinner join departments as d
on e.job_id = j.job_id and e.department_id= d.department_id;
-- 联合查询
-- 查询员工姓名,老板姓名在一列显示出来;员工年龄,老板年龄在一列显示出来
-- 放在同一列的最好是同一类型的数据
select last_name,year from employees
union
select name, boss_year from boss;
-- union可以去除重复数据,union
all不会
select last_name,year from employees
union all
select name, boss_year from boss;
-- 自连接
-- 查询员工表中员工以及对应的经理的姓名
select emp.last_name as '员工姓名',
emp.manager_id as '员工经理编号',
manager.last_name as '经理的姓名',
manager.employee_id as '经理的编号'
from employees as emp inner join employeesas manager
on emp.employee_id = manager.manager_id;4
-- 作业------------------------------------------------alter
-- 查询哪个城市没有部门,并输出其城市的名称,位置编号。 子查询
select *
from locations;
select *
from departments;
select d.department_id, d.location_id,l.location_id
from departments as d left join locationsas l
on d.location_id = l.location_id;
-- 查询出emp表中工资大于5000 ,并且小于10000的员工的姓名和工资。
select last_name, salary
from employees
where salary > 5000 and salary <10000;
-- 查询员工编号为100的人所对应的部门编号、部门名称。
select *
from employees;
select e.last_name, d.department_id,d.department_name
from employees as e inner join departmentsas d
on e.department_id = d.department_id
where e.employee_id = '1';
-- 查询老板年龄和员工年纪,在一列显示出来(不去重复)。
select *
from boss;
select name, boss_year
from boss
union all
select last_name,year
from employees;
-- 查询员工对应的部门编号和部门名称。
selecte.last_name,e.department_id,d.department_name
from employees as e inner join departmentsas d
on e.department_id = d.department_id;
-----------------------------------------------------
-- 子查询
-- 查询工资最高的人的信息alter
-- 1. 查询最高工资alter
-- 2. 查询1.的信息alter
select *
from employees
where salary = (select max(salary)
from employees);
-- 所谓标量:一行一列这么一个单元格就称之为一个标量
-- 子查询的子句返回的结果集是一个标量,这个子查询就是标量子查询
select max(salary)
from employees;
-- 查询工资比105号员工高的所有人信息alter
select salary
from employees
where employee_id = 105;
select *
from employees
where salary > (select salary
from employees
where employee_id = 105);
-- 作业----------------------------------
-- 查询工资比Austin高的的人的信息
select salary
from employees
where last_name = 'Austin';
-- 必须保证大于一个值,即一个标量
-- any的用法
-- any:大于最小,大于最小的。
select *
from employees
where salary > any (select salary
from employees
where last_name = 'Austin');
-- all的用法
select *
from employees
where salary > all (select salary
from employees
where last_name = 'Austin');
-- 等于的情况:等于any 和 in 是等价的
select *
from employees
where salary in(select salary
from employees
where last_name = 'Austin');
-- 查询工资为10000的人的部门名称,员工姓名。
select *
from employees;
select e.last_name, d.department_name
from employees as e inner join departmentsas d
on e.department_id = d.department_id
where e.salary = 24000;
-- 查询年薪比100号员工高的所有人信息->
select *
from employees
where (salary * 12) > (
select salary * 12
from employees
where employee_id = 1);
-- 查询工资最低的员工信息
select min(salary)
from employees;
select *
from employees
where salary = (select min(salary)
from employees);
-- 列子查询:子查询的结果是一列多行
-- 查询比103号或104号员工高的员工的信息alter
select salary
from employees
where employee_id in(103,104);
select *
from employees
where salary > any(select salary
from employees
where employee_id in(103,104));
-- 作业-------------------------------------------alter
-- 查询年龄、工资都与Hunold相同的员工信息alter
select *
from employees;
select salary
from employees
where last_name = 'Hunold';
select year
from employees
where last_name = 'Hunold';
select *
from employees
where year = (select year
from employees
where last_name = 'Hunold')
and salary = (select salary
from employees
where last_name = 'Hunold');
-- 年龄比100号或106号员工小的员工的信息alter
select year
from employees
where employee_id in(100,106);
select *
from employees
where year > any(select year
from employees
where employee_id in(100,106));
-- 查询工资和部门都与De Haan相同的员工信息
select *
from employees;
select *
from employees
where salary in(select salary
from employees
where last_name = 'De Haan')
and department_id in (select department_id
from employees
where last_name = 'De Haan');
-- location_id是1400或1700的部门中的所有员工姓名alter
select e.last_name
from departments as d inner join employeesas e
on e.department_id = d.department_id
where d.location_id in(1400, 1700);
-- 查询员工工资比本部门平均工资高(不包含临界值)的员工的员工号,姓名和工资
select department_id, avg(salary)
from employees
group by department_id;
select employee_id, last_name, salary
from employees
where salary > any (select department_id,avg(salary)
from employees
group by department_id)
group by department_id;
-- 百度上的答案
SELECTemployee_id,last_name,salary,e.department_id
FROM employees e
INNER JOIN (
SELECT AVG(salary) ag,department_id
FROM employees
GROUP BY department_id
) ag_dep
ON e.department_id = ag_dep.department_id
WHERE salary > ag_dep.ag;
-- 最后一行的where条件也可以写在on里面,用and连接
SELECTemployee_id,last_name,salary,e.department_id
FROM employees e
INNER JOIN (
SELECT AVG(salary) ag,department_id
FROM employees
GROUP BY department_id
) ag_dep
ON e.department_id = ag_dep.department_id
and salary > ag_dep.ag;
-- ceshi
select *
from employees
group by department_id;
select *
from employees;
第四天:
select *
from employees
where employee_id = 1;
-- 查询比103号年龄大,并且工资高的人的信息alter
-- 行子查询不可以使用大于、小于、大于等于、小于等于这种比较符号
select year, salary
from employees
where employee_id = 1;
-- 这种情况是不可以的
select *
from employees
where (year, salary) >
(select year, salary
from employees
where employee_id = 1);
-- 需要把两个条件分开
select *
from employees;
select *
from employees
where year > (select year from employeeswhere employee_id = 1)
and salary > (select salary fromemployees where employee_id = 1);
-- 行子查询可以使用等号
-- 查询与103号年龄和工资都相同的人的信息alter
select *
from employees
where (year, salary) =
(select year, salary
from employees
where employee_id = 1);
-- 作业--------------------------------------------------------alter
-- 查询部门名为 SAL 或 IT 的员工信息。
select *
from employees as e inner join departmentsas d
on e.department_id = d.department_id
where d.department_name in ('SAL', 'IT');
-- 查询 90 号部门 job_id 和 location_id。
select *
from departments;
select e.department_id,e.job_id,d.location_id
from employees as e inner join departmentsas d
on e.department_id = d.department_id
where e.department_id = 90;
-- 查询名称为“Mar”的部门所对应的城市名称、部门编号。
select *
from departments;
select *
from locations;
select l.city, d.department_id
from departments as d inner join locationsas l
on d.location_id = l.location_id
where d.department_name = 'Mar';
-- 查询比103号员工年薪高,年龄大的员工编号、姓名。
select *
from employees;
select employee_id, last_name
from employees
where year > (select year from employeeswhere employee_id = 103)
and salary > (select salary fromemployees where employee_id = 103);
-------------------------------------------------------
-- select后子查询
-- 利用部门表查询每个部门的员工个数、部门编号、部门名称
select d.department_id, d.department_name,
(select count(employee_id)
from employees
where d.department_id =employees.department_id)
from departments as d;
-- 作业----------------------------------------------------------alter
-- 查询每个职位的员工个数、职位编号、职位名称。
select *
from departments;
select *
from jobs;
select j.job_id, j.job_title,
(select count(job_id)
from employees
where j.job_id = employees.job_id)
from jobs as j;
-- 查询工资最高的员工的姓名,要求列名显示为“姓名”
select max(salary)
from employees;
select last_name as '姓名'
from employees
where salary = (select max(salary)
from employees);
-- 查询员工所对应的部门名称、职位全称(没有对应则不显示)。
-- 内连接
select e.last_name, d.department_name,j.job_title
from employees as e inner join departmentsas d inner join jobs as j
on e.department_id = d.department_id ande.job_id = j.job_id;
-- 查询位置表中每个位置的位置编号、部门数量、国家名。
select *
from locations;
select l.location_id, l.country_id,
(select count(department_id)
from departments as d
where d.location_id = l.location_id)
from locations as l;
----------------------------------------------------------------------
-- from后子查询
-- 每个部门的平均工资的工资等级
-- on既可以写两个表之间的相同列明,也可以写,一个表的某列,在另一个表的两列之间(此处是指的所有on)
-- 一般将分组查询的表格作为from后子查询的子表
-- select后子查询,两表之间的关联写在子句里面,from后子查询两表之间的关联写在外面
select *
from job_grades;
select avg(salary)
from employees
group by department_id;
select *
from (select avg(salary) as ag
from employees
group by department_id) as ag_emp innerjoin job_grades as j
on ag_emp.ag between j.lowest_sal andj.highest_sal;
-- 相关子查询
-- 相关子查询的子表写在where后面
-- 相关子查询的效率特别高,输出只有两个布尔值,ture和false
-- 查询部门表是否存在年龄大于21岁的员工,如果存在则输出该部门的信息。
select *
from departments
where exists (
select *
from employees
where employees.department_id =departments.department_id
and year > 21
);
-- 作业------------------------------------------------------------------alter
-- 查询和姓名中包含字母 u 的员工在相同部门的员工的员工号和姓名。
select department_id
from employees
where last_name like '%u%';
select employee_id, last_name
from employees
where department_id in (selectdepartment_id
from employees
where last_name like '%u%');
-- 查询和 Hunold 相同部门的员工姓名和工资
select department_id
from employees
where last_name = 'Hunold';
select last_name, salary
from employees
where department_id = (select department_id
from employees
where last_name = 'Hunold');
-- 查询工资比公司平均工资高的员工的员工号,姓名和工资。
select avg(salary)
from employees;
select employee_id, last_name, salary
from employees
where salary > (select avg(salary)
from employees);
-- 查询平均工资最高的部门信息
select department_id, avg(salary)
from employees
group by department_id;
select max(aa),department_id
from (select department_id, avg(salary) asaa
from employees
group by department_id) as avg_sal;
select max(aa),department_id as dd
from (
select department_id, avg(salary) as aa
from employees
group by department_id) as avg_sal;
select d.*
from departments as d inner join (
select max(aa),department_id as dd
from (
select department_id, avg(salary) as aa
from employees
group by department_id) as avg_sal) bb
on d.department_id = bb.dd;
-- 老师的写法
select d.*
from departments as d, employees as e
where d.department_id = e.department_id
group by d.department_id
having avg(e.salary) =
(select max(emp_ag.ag)
from (select avg(salary) ag
from employees
group by department_id) as emp_ag);
-----------------------------------------------------------------------------
-- 练习题---------------------------------------------------------------------alter
-- 4.查询所有部门所对应的城市的位置alter
select department_id, department_name, city
from departments as d inner join locationsas l
on d.location_id = l.location_id;
-- 5.查询比105号员工的名字长度长并且工资高的员工信息alter
select length(last_name)
from employees
where employee_id = '105';
select salary
from employees
where employee_id = '105';
select *
from employees
where length(last_name) > (selectlength(last_name)
from employees
where employee_id = '105')
and salary > (select salary
from employees
where employee_id = '105');
-- 6.查询年龄大于20岁的员工部门alter
select department_id
from employees
where year > 20;
select last_name, e.department_id,department_name
from employees as e inner join departmentsas d
on e.department_id = d.department_id
where year > 20;
-- 7.查询员工表中前四条数据alter
select *
from employees
limit 0,4;
-- 8.查询员工名字里带a,并且年龄在25-40之间的人的信息
select *
from employees
where year between 25 and 40;
select *
from employees
where last_name like '%a%' and
year between 25 and 40;
-- 9.每个部门的平均工资的工资等级alter
select avg(salary) as ag
from employees
group by department_id;
select aa.department_id, ag, grade_level
from (select avg(salary) as ag,department_id
from employees
group by department_id) as aa inner joinjob_grades as j
on aa.ag between j.lowest_sal andj.highest_sal;
-- 10.查询城市名称是Tokyo的部门编号
select *
from departments;
select *
from locations;
select *
from locations
where city = 'Tokyo';
select department_id
from departments as d inner join locationsas l
on d.location_id = l.location_id
where l.city = 'Tokyo';
-- 11.查询部门表是否存在年龄大于30岁的员工,如果存在则输出该部门的信息alter
select *
from departments
where exists (
select *
from employees
where employees.department_id =departments.department_id
and year > 30
);
-- 12.查询各部门工资总和以及部门编号alter
select department_id, count(salary)
from employees
group by department_id;
-- 13.查询具有各个职位的员工人数alter
select job_id, count(employee_id)
from employees
group by job_id;
-- 14.查询各职位的员工工资的最大值、最小值、平均值、总和alter
select job_id, max(salary), min(salary),avg(salary), sum(salary)
from employees
group by job_id;
-- 15.查询各部门平均工资小于5000的部门编号alter
select avg(salary)
from employees
group by department_id;
select *
from employees
group by department_id
having salary < (select avg(salary)
from employees
group by department_id);
select avg(aa.ss),department_id
from (select department_id, avg(salary) asss
from employees
group by department_id) as aa
group by department_id
having avg(aa.ss) < 5000;
select department_id, avg(salary) as ss
from employees
group by department_id;
select department_id
from employees
group by department_id
having avg(salary) < 5000;
-- 16.查询员工表中从第4条开始,到第7条的数据alter
select *
from employees;
select *
from employees
limit 3,4;
-- 17.查询各部门编号,员工数量和工资平均值alter
select department_id, count(employee_id),avg(salary)
from employees
group by department_id;
select d.department_id,count(e.employee_id), avg(e.salary)
from employees as e right join departmentsas d
on e.department_id = d.department_id
group by department_id;
-- 18.查询所有部门所对应的员工的部门的名称、部门号和员工信息alter
select d.department_name, d.department_id,e.*
from departments as d left join employeesas e
on d.department_id = e.department_id;
-- 19.查询各部门员工工资小于5000的人的平均工资
select *
from employees
where salary < 5000;
select aa.dd, avg(aa.ss)
from (select department_id as dd, salary asss
from employees
where salary < 5000) as aa
group by aa.dd;
select avg(salary)
from employees
where salary < 5000
group by department_id;
-- 20.查询所有部门的编号、员工数量、和平均工资alter
select d.department_id,count(e.employee_id), avg(e.salary)
from employees as e right join departmentsas d
on e.department_id = d.department_id
group by department_id;
selectavg(salary),department_id,count(employee_id)
from employees
group by department_id;
-- 21.查询员工编号最小,并且工资最高的员工信息alter
select min(employee_id)
from employees;
select max(salary)
from employees;
select *
from employees
where employee_id = (
select min(employee_id)
from employees)
and salary = (select max(salary)
from employees);
-- 22.查询各部门中年龄大于30岁的人的平均工资alter
select department_id, avg(salary)
from employees
group by department_id
having year > 30;
-- 23.求出各部门中平均工资大于7000的部门以及其平均工资
select department_id, avg(salary) as ss
from employees
group by department_id;
select avg(aa.ss),department_id
from (select department_id, avg(salary) asss
from employees
group by department_id) as aa
group by department_id
having avg(aa.ss) > 7000;
select department_id,avg(salary)
from employees
group by department_id
having avg(if(salary is null, 0, salary))> 7000;
-----------------------------------------------------------
-- 分页:limit一般写在所有的关键字的最后面
-- 一个参数limit,从头开始取几条数据
select *
from employees
limit 5;
-- 两个参数.索引从第几位开始,第一位的索引为0,取几条数据
select *
from employees
limit 0,5;
/*一般来说,关键字的顺序
select
from
where
group by
having
order by
limit
*/
/*
sql的执行顺序:其它按顺序执行完之后,最后执行select
*/
select *
from employees;
select avg(last_name)
from employees;
第五天:
-- 事务
-- 插入语句
select *
from boss;
-- 第一种写法
insert into boss
(id, name, boss_year) values (99,'大吉哥', 22);
-- 第二种写法
insert into boss
set id = 12, name = '张老板', boss_year = 35;
-- 前两种写法不用每个字段都插入值,第三种写法必须全部写,如果id列为自增的话,那么最好写default,而不是死值
-- 第三种写法alter
insert into boss
values (22, '小兰',31);
insert into boss
values (default, '小兰', 31);
-- 插入多条数据alter
insert into boss
(name, boss_year) values ('小利', 80), ('小郭', 75), ('小王', 88);
-- 删除数据,一般只能写id等唯一标识字段
delete from boss
where id = 123;
-- 更新数据
-- 删除和更新都必须写限制条件where
update boss
set name = '大吉哥'
where id = 100;
-- 事务的commit和rollback
-- 开启事务alter
select *
from employees;
begin;
update employees
set salary = 0
where employee_id = 103;
update employees
set salary = salary + 9000
where employee_id = 104;
rollback;
-- 事务的隔离级别
-- 1.读未提交————可能读到垃圾数据:事务A未提交的数据,事务B可以读取到
-- 这里读取到的数据叫作“脏数据”
-- 脏读是指一个事务处理过程里读取了另一个未提交的事务中的数据alter
-- 2.读已提交:事务A提交的数据,事务B才能读取到
-- 这种隔离级别高于读未提交alter
-- 换句话说,对方事务提交之后的数据,当前事务才能读取到alter
-- 这种级别可以避免脏数据alter
-- 这种隔离级别会导致“不可重复读取”:意思就是,数据变了之后,读取也会读取变了的数据
-- Oracle默认隔离级别
-- 3.可重复读
-- 事务A提交之后的数据,事务B读取不到alter
-- 事务B是可重复读取数据alter
-- 换句话说,对方提交之后的数据,我还是读取不到alter
-- MySQL默认级别alter
-- 虽然可以达到可重复读取,但是会导致“幻读”
-- 幻读:事务A把表中的全部信息更新掉,这个过程中事务B插入一条信息,事务A查的时候发现了一个多的没有改掉,以为自己产生了幻觉
-- 4.串行化:事务A在操作数据库时,事务B只能排队等待alter
-- 这种隔离级别很少使用,吞吐量太低,用户体验差alter
-- 这种级别可以避免“幻读”,每一次读取的数据库中真实存在的数据,事务A和事务B串行而不是并发
-- inner join两表连接是没有对应就不显示吗?是的
select *
from employees;
select *
from departments;
select *
from employees as e inner join departmentsas d
on e.department_id = d.department_id;
-- 事务的属性alter
-- 1.原子性alter
-- 原子性的事务是一个不可分割的工作单位,单位中的操作要么都发生,要么都不发生alter
-- 2.一致性alter
-- 事务必须使数据库从一个一致性状态变换到另外一个一致性状态alter
-- 3.隔离性alter
--
-- 视图:存在的是sql的逻辑。合作的时候,对访问进行封装,不直接开放整个表。
-- 创建视图
create view my_view1
as
select * from employees;
select *
from my_view1;
create view my_view2
as
select * from boss;
select *
from my_view2;
/*
select *
from my_view1;
insert into
my_view1 (last_name)
values ('小明');
*/
select *
from my_view2;
insert into
my_view2 (name)
values ('小明');
-- 作业------------------------------------------------------------alter
-- 将员工表中工资比较高的5个人显示出来alter
create view my_view3
as
select *
from employees
order by salary desc
limit 5;
select*
from my_view3;
-- 将员工表中工资最高的5个人按照编号降序查询
select *
from employees
order by salary desc
limit 5;
select aa.*
from (select *
from employees
order by salary desc
limit 5) as aa
order by aa.employee_id desc;
create view my_view4
as
select aa.*
from (select *
from employees
order by salary desc
limit 5) as aa
order by aa.employee_id desc;
select *
from my_view4;
-------------------------------------------------------------------------
-- 级联视图alter
-- my_view5父视图
create view my_view5
as
select *
from employees
where salary > 10;
select *
from my_view5;
-- my_view6子视图
create view my_view6
as
select *
from my_view5
where salary > 20000;
select *
from my_view6;
-- 本地检查:local检查只考虑自己本身的限制条件,不考虑父视图的限制条件
-- 视图本身也可以插入数据,并且会检查自己范围是否符合要求
create view my_viewF
as
select *
from employees
where salary > 10;
insert into my_viewf (last_name, salary)
values ('珠兰', 15);
select *
from my_viewF;
create view my_viewS
as
select *
from my_viewF
where salary < 20
with local check option;
insert into my_viewS (last_name, salary)
values ('杨金祥', 5);
select *
from my_viewS;
-- 级联检查:不仅考虑本视图的限制条件,而且考虑父视图的限制条件
create view my_views2
as
select *
from my_viewf
where salary < 20
with cascaded check option;
insert into my_viewS (last_name, salary)values ('fdasf', 25);
select *
from my_views2;
-- 更新视图:如果里面有多表连接或者子查询等关键字均不可更新视图
update my_views2
set last_name = '小李'
where employee_id = 103;
-- 删除视图
drop view my_view2, my_view3, my_view4;
drop view my_view5, my_view6, my_viewf,my_views, my_views2;
-- 查看视图
create view my_view1
as
select *
from boss;
--有哪些视图
show tables;
select *
from my_view1;
--sql(查询语言)
-- 查看视图的定义
show create view my_view1;
第六天:
-- 约束alter
-- 限制一列或者几列的数据不能插入null值
-- 非空约束(NN)
select *
from boss;
insert into boss
(name, boss_year) values ('李老板', 23);
insert into boss
(name) values ('刘老板');
insert into boss
(name, boss_year, bosscol) values ('非老板', 23, 23);
-- 唯一约束(UQ)
-- 主键约束:限制一列数据——非空约束 + 唯一约束——相当于一行的唯一标识()
-- 数据库内的每张表必须要有主键(主键可以是一个字段,也可以是多个字段)
-- 一张表内主键有多个字段,这样的主键叫作复合主键
-- 默认约束(default/Expresssion),一般来说字符型默认null,整数默认0,小数默认0.0;
delete from boss where name = '小兰';
select *
from newboss;
insert into newboss values (11, 22);
insert into newboss
(boss) values (11);
-- 外键约束:限制两个表的数据,从表的外键来自于主表关联列的值,
-- 并且不能直接删除主表里的值,必须先删除对应从表里的数据
-- 级联删除:直接删除主表中的值,那么对应从表中的值也就跟着没了
select *
from classes;
select *
from student;
--
delete from classes where id = 2;
delete from student where class_id = 3;
delete from classes where id = 1;
-- 列级约束:限制单列的约束就是列级约束
-- 表级约束:限制多个列的约束就是表级约束
-- DDL(数据定义语言)
-- create database test;
-- SQL(数据查询语言)
-- DML(数据操纵语言)
-- 创建数据库
create database test;
-- 查看有几个数据库
show databases;use test;
-- 在mysql里,schema和database意义相同,作用相同
create schema test2;
show schemas;
-- 使用数据库
use test;
-- 创建一个表alter
create table ddl_table(
id int primary key auto_increment,
name varchar(20) not null
);
-- 查看当前数据库有哪些表alter
show tables;
select *
from ddl_table;
-- 删除数据库中的表
-- 1.ddl方式:删除表中所有的数据,只删除数据,不删除表的结构
truncate ddl_table;
show tables;
-- 2.删除此表,删除表的结构
drop table ddl_table;
-- 3.dml方式:删除数据,不删除表的结构
delete from ddl_table;
-- 3种方式的共同点:都可以删除数据:
-- 不同点:①delete是dml语言,可以回滚。truncate和、drop是ddl语言,不能回滚。
-- ②delete和truncate只删除数据,不删除表的结构。而drop是既删除数据又删除表结构。
-- delete不加where,即便不选安全模式,也不能删除整张表。
insert into ddl_table(name) values ('小明'),('小红');
select * from ddl_table;
begin;
drop table ddl_table;
rollback;
select *
from ddl_table;
-- 修改表的属性
-- 加字段
alter table ddl_table
add year int;
select *
from ddl_table;
-- 添加多个字段
alter table ddl_table
add(
classs_idint,
card_id int
);
-- 修改表的字段名称和类型
-- modify可以修改类型
alter table ddl_table
modify name varchar(30);
-- modify既可以修改字段类型,也可以修改字段名称
alter table ddl_table
change name test_name varchar(30);
-- 删除列
-- 删除一列(好像只删除数据,不能删除列结构)
alter table ddl_table
drop column card_id;
alter table ddl_table
drop column class_id;
-- 删除多列alter
alter table ddl_table
drop column id,
drop column test_name;
select *
from ddl_table;
-- DDL: creat,truncate,drop
-- 存储过程
-- 变量有系统变量和自定义变量之分。系统变量有全局变量和会话变量;自定义变量有用户变量和局部变量。
-- 会话就是一个连接
-- 全局变量用于整个服务,
-- 会话变量用于当前会话
-- 自定义变量也只在当前会话有效,关了会话之后就没了
-- 查看数据库的全局变量
show global variables;
-- 查看数据库的会话变量
show session variables;
-- 会话变量和全局变量是一样的,一旦关闭workbench就没了。
-- 全局变量更改之后需要重启数据库的服务才可以恢复。但工作的时候不可能重启数据库
-- 查看数据库的字符集全局变量,用模糊查询
show global variables like '%char%';
-- 查看数据库的事务隔离级别
show global variables like '%iso%';
-- 查看某个全局变量的值
select @@global.transaction_isolation;
select @@session.transaction_isolation;
-- 给一个全局变量赋值
set @@global.transaction_isolation ='READ-COMMITTED';
set @@session.transaction_isolation ='READ-COMMITTED';
-- 定义一个自定义变量:作用于当前会话
-- 赋值与声明
set @test_param := '小明';
-- 调用alter
select @test_param;
-- 自定义两个变量,然后求它们的和
set @sum_param := 1;
set @sum2 := 2;
select @sum_param + @sum2;
-- 存储过程:事先经过编译好的sql语句的结合
-- 好处:①提高代码重用性;②简化操作;③减少编译次数。
-- 创建存储过程
-- 可以在左侧的Stored
Procedures查看所有的存储过程
-- 参数模式有三种类型:IN OUTINOUT
-- IN:输入模式
-- OUT:输出模式
delimiter $$
create procedure my_por1( IN in_param varchar(30))
-- 存储过程体
begin
-- 查询员工表中id为103号员工的信息
select *
from employees
where employee_id = in_param;
end $$
delimiter ;
-- 调用存储过程
call my_por1(103);
select *
from employees;
-- 输出模式
delimiter $$
create procedure my_por2( IN in_param varchar(30),
OUT out_param varchar(30))
-- 存储过程体
begin
-- 查询员工表中id为103号员工的信息
select last_name into out_param
from employees
where employee_id = in_param;
end $$
delimiter ;
set @param := null;
call my_por2(103, @param);
select @param;
-- 作业----------------------------------------------------------
-- 用存储过程显示名字为“De
Haan”的人的信息
delimiter $$
create procedure my_por3( IN in_param varchar(30))
-- 存储过程体
begin
select *
from employees
where last_name = in_param;
end $$
delimiter ;
call my_por3('De Haan');
select *
from employees;
-- 用存储过程实现根据名字“Hunold”的员工,返回该员工所对应的部门名称
delimiter $$
create procedure my_por4( IN in_param varchar(30),
OUT out_param varchar(30))
begin
select d.department_name into out_param
from employees as e inner join departmentsas d
on e.department_id = d.department_id
and e.last_name = in_param;
end $$
delimiter ;
set @my_out1 := null;
call my_por4('Hunold', @my_out1);
select @my_out1;
select *
from employees;
select *
from departments;
-- 如果要返回一行多列的数据
delimiter $$
create procedure my_por5( IN in_param varchar(30),
OUT out_param varchar(30),
OUT out_param1varchar(30),
OUT out_param2varchar(30))
begin
select d.department_name, d.department_id,d.location_id into out_param,out_param1, out_param2
from employees as e inner join departmentsas d
on e.department_id = d.department_id
and e.last_name = in_param;
end $$
delimiter ;
set @my_out1 := null;
set @my_out2 := null;
set @my_out3 := null;
call my_por5('Hunold', @my_out1, @my_out2,@my_out3);
select @my_out1, @my_out2,@my_out3;
select *
from employees;
select *
from departments;
-- 用存储过程实现根据名字“Hunold”的员工,返回该员工所对应的工资等级
delimiter $$
create procedure my_por6( IN in_param varchar(30),
OUTout_param varchar(30))
begin
select j.grade_level into out_param
from employees as e inner join job_gradesas j
on e.salary between j.lowest_sal andj.highest_sal
and e.last_name = in_param;
end $$
delimiter ;
set @my_out4 := null;
call my_por6('Kochhar', @my_out4);
select @my_out4;
select j.grade_level
from employees as e inner join job_grades asj
on e.salary between j.lowest_sal andj.highest_sal
where e.last_name = 'Kochhar';
select *
from employees;
select *
from job_grades;
------------------------------------------------------------------------
第七天:
-- 传入一个参数,如果大于3则返回100,否则返回500
-- 用户变量作用于当前会话,局部变量作用于begin和end之间
-- INOUT的使用
delimiter $$
create procedure my_pro8(INOUT in_paramvarchar(20))
begin
declareparam varchar(20);
if in_param > 3
then set param := 100;
else set param := 500;
end if;
set in_param := param;
end $$
delimiter ;
set @param = 3;
call my_pro8(@param);
select @param;
-- PLSQL while
-- PLSQL:过程语言,在存储过程中使用的语言,也就是和Java一样有循环、分支这些语句,但是很少用到
delimiter $$
create procedure my_pro11_while()
begin
declarei int;
set i := 0;
while i < 10 do
insertinto boss (name) values (i);
set i = i + 1;
endwhile;
end $$
delimiter ;
call my_pro11_while();
select *
from boss;
-- 游标:遍历表中的每一行,并且把每一行查到的数据都用一个单独的表显示出来
DELIMITER $$
create PROCEDURE my_pro12()
begin
-- 声明一个标志done,用来判断游标是否遍历完
DECLARE done INT DEFAULT 0;
-- 声明一个变量,用来存放从游标中提取的数据
-- 特别注意这里的名字不能与由游标中使用的列明相同,
-- 否则得到的数据都是NULL
DECLARE lastName varchar(30) DEFAULT NULL;
DECLARE salaryParam int DEFAULT NULL;
-- 声明游标对应的 SQL 语句
DECLARE cur CURSOR FOR
select last_name, salary from employees;
-- 在游标循环到最后会将 done 设置为1
DECLARE CONTINUE HANDLER FOR NOT FOUND SETdone = 1;
-- 执行查询
open cur;
-- 遍历游标每一行
REPEAT
-- 把一行的信息存放在对应的变量中
FETCH cur INTO lastName, salaryParam;
if not done then
-- 这里就可以使用 lastName, salaryParam 对应的信息了
select lastName, salaryParam;
end if;
UNTIL done END REPEAT;
CLOSE cur;
end $$
DELIMITER ;
call my_pro12();
-- JDBC(Java数据库连接)