首页 > 代码库 > SQL基础学习笔记(一)
SQL基础学习笔记(一)
感觉SQL,学的云里雾里的,整理一下笔记吧。
SQL语言分为三种:
DML: Data Manipulation Language 数据操纵语言
DDL: Data Definition Language 数据定义语言
DCL: Data Control Language 数据控制语言
select * (表示查询表中所有的列 ) from employees; select employee_id , last_name,email from employees;(查询指定)SELECT 标识 选择哪些列。
FROM 标识从哪个表中选择。
注意:
SQL 语言大小写不敏感。
SQL 可以写在一行或者多行
关键字不能被缩写也不能分行
各子句一般要分行写
使用缩进提高语句的可读性。
多表查询,有n个表,就要注意有n-1个链接关系(注意笛卡尔集)
不注意笛卡尔集情况,假设员工表有107个员工数据,部门表有27个部门ID数据,员工表通过department_id和部门表链接,
不写链接关系,
select e.department_id,d.department_name from employees e,departments d;
107*27 = 2889,多对多关系,致使本来是两个表共享的同一列,成为两个列
解决笛卡尔集问题的两种方式:
方式一:
select e.employee_id , d.department_id , d.department_name from employees e , departments d where e.department_id = d.department_id
方式二:
select e.employee_id , d.department_id , d.department_name from employees e join departments d on e.department_id = d.department_id
加多少表就join ... on
select employee_id , d.department_id , department_name ,city from employees e join departments d on e.department_id = d.department_id join locations l on d.location_id = l.location_id
using方式
<span style="font-family:KaiTi_GB2312;font-size:18px;"><strong>select employee_id , department_id , department_name from employees join departments using(department_id)</strong></span>
这种方式有缺陷,比如说,employee表员工的id是employee_id ,而departments表的员工id是dpart_id
using(),就不好用了
还有一种
select employee_id , department_id , department_name from employees natural join departments
这种方式自动加入多种等价关系
外连接:
比如当一个没有部门时,那个人的信息就会不显示,而使用外连接,就可以将其显示
左外连接:PS:outer可以省略
select employee_id , d.department_id , department_name from employees e , departments d where e.department_id = d.department_id(+) --where e.department_id(+) = d.department_id
SQL99语法,解决左外连接
select employee_id , d.department_id , department_name from employees e left outer join departments d on e.department_id = d.department_id
右外连接:
select employee_id , d.department_id , department_name from employees e right outer join departments d on e.department_id = d.department_id
满外连接;‘
select employee_id , d.department_id , department_name from employees e full outer join departments d on e.department_id = d.department_id
自连接:
查询chen员工的老板的个人信息
select emp.last_name, mana.last_name , mana.salary,mana.email from employees emp ,employees mana where emp.manager_id = mana.employee_id and lower(emp.last_name) = 'chen'
分组函数(多行函数):
分组函数作用于一组数据,并对一组数据返回一个值
max(salary) , min() , count(*)->任意数据类型
avg(),sum() ->数组
查询相应的列,只要不是组函数,都应该出现在group by中
但是
select avg(salary) "averge" from employees group by department_id order by department_id
可以
过滤:有where,having
区别:不能再where中使用组函数,可以在having中使用
--求出各部门中平均工资大于6000的部门,以及其平均工资select department_id , avg(salary) from employees having avg(salary) > 6000 group by(department_id)
where必须放在from 后面
嵌套组函数
--所有部门中工资最大值
select max(avg(salary)) from employees group by department_id
计算1995,1996,1997,1998雇佣的人数
select count(*) "total" , count(decode(to_char(hire_date,'yyyy'),'1995',1,null)) "1995", count(decode(to_char(hire_date,'yyyy'),'1996',1,null)) "1996", count(decode(to_char(hire_date,'yyyy'),'1997',1,null)) "1997", count(decode(to_char(hire_date,'yyyy'),'1998',1,null)) "1998" from employees where to_char(hire_date,'yyyy') in('1995','1996','1997','1998')
注意,count(decode(to_char(hire_date,‘yyyy‘),‘1995‘,1,0)) "1995" 不是null,如果是0,相当于
count(0)与count(*)一样,来一条数据就加1
如果子查询返回的结果是空值,不会报错
创建表
/* --第一种方式 create table emp1( id number(10), name varchar2(20), salary number(10,2), hire_date date ) */ --第二种方式,以现有employees表来创建表,并且把原来的表的数据,都导入新表中了 create table emp2 as select employee_id id ,last_name name , hire_date , salary from employees
如果不想要所有的数据,可以加过滤条件
create table emp3 as select employee_id id ,last_name name , hire_date , salary from employees where department_id = 80
如果不想要任何数据:可以使过滤条件找不到,或者是where 条件,条件只要是空,就行,比如where 1=2,肯定没有满足的条件
create table emp4 as select employee_id id ,last_name name , hire_date , salary from employees where department_id = 800000
修改表
--修改
ALTER TABLE emp1 --ADD (eamil varchar2(20))--增加 --modify (id number(15))--修改 --modify (salary number(20,2) default 2000)--默认初始值2000,之前的数据是不会改变的,只改变后来的数据 --modify (email number(20))--修改数据类型,前提是email没有数据,有数据就改不了
除了修改数据类型,前提是不能有数据,其他的有没有数据都行
删除列
ALTER TABLE emp1 DROP COLUMN eamil
重命名列
ALTER TABLE emp1 rename column salary to sal
rollback对DDL无效,查阅资料,补充重点
删除表
<span style="font-family:KaiTi_GB2312;font-size:18px;"><strong>drop table emp5;</strong></span>
清空表 ->清空标表中数据
<span style="font-family:KaiTi_GB2312;font-size:18px;"><strong>SQL> truncate table emp3;</strong></span>
作用:表结构不变,清空所有数据
SQL基础学习笔记(一)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。