一、sql語法
1 select */列名1,列名2... from 表名[連接查詢 內連接/左連接 on條件] 必選的 2 3 where 條件 子查詢/in/exists/between ... and .. 可選的 4 5 group by 分組列1,分組列2... 可選的 6 7 having 字句 可以對分組結果進行篩選 可選的 8 9 order by 排序列1,排序列2... 可選的
各個關鍵字的數據必須要保證
二、寫sql語句的步驟
1、要先確定從哪個表中查詢數據,是要從一個表查詢,還是要從多個表查詢,如果是多個表必須用連接查詢。
2、確定是否需要分組查詢
3、寫where條件
4、寫需要返回的列
三、連接查詢
連接查詢分兩類,交叉連接和普通連接查詢
1、交叉連接
交叉連接可以用逗號分隔多個表,也可以用關鍵字cross join ,交叉連接返回兩個表數據的笛卡爾集。
2、連接查詢
連接查詢分內連接和外連接,外連接有分為左外連接,右外連接,全連接
最常用的是內連接和左外連接
內連接返回所有滿足連接條件的記錄
select * from 表1 [inner] join 表2 on 表1. 外鍵=表2.主鍵
1 --查詢所有有部門的員工的信息 2 select * from emp e inner join dept d on e.deptno=d.deptno;
左外連接返回左表的所有數據+右表匹配到的數據,如果左表匹配不到右表的數據,顯示為空
1 --查詢所有員工信息,如果員工有部門信息,顯示出來,否則不顯示 2 select * from emp e left join dept d on e.deptno=d.deptno;
右外連接同左外連接
全連接返回左表的所有數據+ 右表的所有數據,如果匹配不到對方的數據,則顯示為空
1 --查詢所有員工和部門信息,如果匹配不到顯示為空 2 select * from emp e full join dept d on e.deptno=d.deptno;
三、in
iin用在連接條件中,表示某個字段的值在in提供的列表之中。
1 select * from 表 where 列名 in (值1,值2...);
in后還可以是一個子查詢,子查詢一般會返回多個結果。
1 舉例:查詢部門編號在10,20,30之中的用戶的信息 2 select * from emp where deptno in (10,20,30);
in 和=的區別,in后面可以跟多個值,=后面只能有一個值
1 舉例:查詢部門名稱為BOSTON或者CHICAGO的員工的信息 2 select e.* from emp e inner join dept d on e.deptno=d.deptno where d.loc ='BOSTON' or d.loc='CHICAGO' 3 使用in: 4 select * from emp where deptno in (select deptno from dept where loc in ('BOSTON','CHICAGO'));
四、between ... and ...
一般也用在條件中,between開始值and結束值,開始值和結束值一般是數字,也可以是其他類型(字符串,日期)
字符串比較和字符串的長度無關,會從第一個字符開始向后比較,如果相同再比較下一個。
1 舉例:查詢基本工資在1500到2000之間的員工的信息 2 select * from emp where sal between 1500 and 2000;
1 查詢 1981年到1998年之間雇佣的員工的信息 2 --把字符串轉換為日期之后再比select * from emp e where e.hiredate between 3 to_date('1981-01-01','yyyy-mm-dd') and to_date('1998-12-31','yyyy-mm-dd'); 4 --把日期轉換為字符串之后再比select * from emp e where to_char(e.hiredate,'yyyy-mm-dd') between 5 '1981-01-01' and '1998-12-31';
五、group by
group by 分組查詢
select 結果列 from 表 where 條件 group by 列1,列2...
注意:結果列只能是兩種形式:
1、要么是分組的列
2、如果要返回其他列,需要對其他列使用聚合函數
1 舉例:統計各部門不同職位的人有多少個 2 select deptno,job,count(empno) from emp group by deptno,job 3 select dname,job,count(empno) from emp e inner join dept d on e.deptno=d.deptno 4 group by e.deptno,dname,job;
having 子句可以對分組查詢的結果進行過濾
1 select dname,job,count(empno) c from emp e inner join dept d on e.deptno=d.deptno 2 group by e.deptno,dname,job 3 having count(empno) >2 4 ;
六、order by
order by 排序,可以對多列排序order by 列1 升序/降序,列2 升序/降序 默認是升序asc.
1 --先按員工基本工資倒序,再按獎金倒select * from emp order by sal desc,comm desc;