sql行查询
❶ sql查询语句
一、简单查询语句
1. 查看表结构
SQL>DESC emp;
2. 查询所有列
SQL>SELECT * FROM emp;
3. 查询指定列
SQL>SELECT empmo, ename, mgr FROM emp;
SQL>SELECT DISTINCT mgr FROM emp; 只显示结果不同的项
4. 查询指定行
SQL>SELECT * FROM emp WHERE job='CLERK';
5. 使用算术表达式
SQL>SELECT ename, sal*13+nvl(comm,0) FROM emp;
nvl(comm,1)的意思是,如果comm中有值,则nvl(comm,1)=comm; comm中无值,则nvl(comm,1)=0。
SQL>SELECT ename, sal*13+nvl(comm,0) year_sal FROM emp; (year_sal为别名,可按别名排序)
SQL>SELECT * FROM emp WHERE hiredate>'01-1月-82';
6. 使用like操作符(%,_)
%表示一个或多个字符,_表示一个字符,[charlist]表示字符列中的任何单一字符,[^charlist]或者[!charlist]不在字符列中的任何单一字符。
SQL>SELECT * FROM emp WHERE ename like 'S__T%';
7. 在where条件中使用In
SQL>SELECT * FROM emp WHERE job IN ('CLERK','ANALYST');
8. 查询字段内容为空/非空的语句
SQL>SELECT * FROM emp WHERE mgr IS/IS NOT NULL;
9. 使用逻辑操作符号
SQL>SELECT * FROM emp WHERE (sal>500 or job='MANAGE') and ename like 'J%';
10. 将查询结果按字段的值进行排序
SQL>SELECT * FROM emp ORDER BY deptno, sal DESC; (按部门升序,并按薪酬降序)
二、复杂查询
1. 数据分组(max,min,avg,sum,count)
SQL>SELECT MAX(sal),MIN(age),AVG(sal),SUM(sal) from emp;
SQL>SELECT * FROM emp where sal=(SELECT MAX(sal) from emp));
SQL>SELEC COUNT(*) FROM emp;
2. group by(用于对查询结果的分组统计) 和 having子句(用于限制分组显示结果)
SQL>SELECT deptno,MAX(sal),AVG(sal) FROM emp GROUP BY deptno;
SQL>SELECT deptno, job, AVG(sal),MIN(sal) FROM emp group by deptno,job having AVG(sal)<2000;
对于数据分组的总结:
a. 分组函数只能出现在选择列表、having、order by子句中(不能出现在where中)
b. 如果select语句中同时包含有group by, having, order by,那么它们的顺序是group by, having, order by。
c. 在选择列中如果有列、表达式和分组函数,那么这些列和表达式必须出现在group by子句中,否则就是会出错。
使用group by不是使用having的前提条件。
3. 多表查询
SQL>SELECT e.name,e.sal,d.dname FROM emp e, dept d WHERE e.deptno=d.deptno order by d.deptno;
SQL>SELECT e.ename,e.sal,s.grade FROM emp e,salgrade s WHER e.sal BETWEEN s.losal AND s.hisal;
4. 自连接(指同一张表的连接查询)
SQL>SELECT er.ename, ee.ename mgr_name from emp er, emp ee where er.mgr=ee.empno;
5. 子查询(嵌入到其他sql语句中的select语句,也叫嵌套查询)
5.1 单行子查询
SQL>SELECT ename FROM emp WHERE deptno=(SELECT deptno FROM emp where ename='SMITH');查询表中与smith同部门的人员名字。因为返回结果只有一行,所以用“=”连接子查询语句
5.2 多行子查询
SQL>SELECT ename,job,sal,deptno from emp WHERE job IN (SELECT DISTINCT job FROM emp WHERE deptno=10);查询表中与部门号为10的工作相同的员工的姓名、工作、薪水、部门号。因为返回结果有多行,所以用“IN”连接子查询语句。
in与exists的区别: exists() 后面的子查询被称做相关子查询,它是不返回列表的值的。只是返回一个ture或false的结果,其运行方式是先运行主查询一次,再去子查询里查询与其对 应的`结果。如果是ture则输出,反之则不输出。再根据主查询中的每一行去子查询里去查询。in()后面的子查询,是返回结果集的,换句话说执行次序和 exists()不一样。子查询先产生结果集,然后主查询再去结果集里去找符合要求的字段列表去。符合要求的输出,反之则不输出。
5.3 使用ALL
SQL>SELECT ename,sal,deptno FROM emp WHERE sal> ALL (SELECT sal FROM emp WHERE deptno=30);或SQL>SELECT ename,sal,deptno FROM emp WHERE sal> (SELECT MAX(sal) FROM emp WHERE deptno=30);查询工资比部门号为30号的所有员工工资都高的员工的姓名、薪水和部门号。以上两个语句在功能上是一样的,但执行效率上,函数会高 得多。
5.4 使用ANY
SQL>SELECT ename,sal,deptno FROM emp WHERE sal> ANY (SELECT sal FROM emp WHERE deptno=30);或SQL>SELECT ename,sal,deptno FROM emp WHERE sal> (SELECT MIN(sal) FROM emp WHERE deptno=30);查询工资比部门号为30号的任意一个员工工资高(只要比某一员工工资高即可)的员工的姓名、薪水和部门号。以上两个语句在功能上是 一样的,但执行效率上,函数会高得多。
5.5 多列子查询
SQL>SELECT * FROM emp WHERE (job, deptno)=(SELECT job, deptno FROM emp WHERE ename='SMITH');
5.6 在from子句中使用子查询
SQL>SELECT emp.deptno,emp.ename,emp.sal,t_avgsal.avgsal FROM emp,(SELECT emp.deptno,avg(emp.sal) avgsal FROM emp GROUP BY emp.deptno) t_avgsal where emp.deptno=t_avgsal.deptno AND emp.sal>t_avgsal.avgsal ORDER BY emp.deptno;
5.7 分页查询
数据库的每行数据都有一个对应的行号,称为rownum.
SQL>SELECT a2.* FROM (SELECT a1.*, ROWNUM rn FROM (SELECT * FROM emp ORDER BY sal) a1 WHERE ROWNUM<=10) a2 WHERE rn>=6;
指定查询列、查询结果排序等,都只需要修改最里层的子查询即可。
5.8 用查询结果创建新表
SQL>CREATE TABLE mytable (id,name,sal,job,deptno) AS SELECT empno,ename,sal,job,deptno FROM emp;
5.9 合并查询(union 并集, intersect 交集, union all 并集+交集, minus差集)
SQL>SELECT ename, sal, job FROM emp WHERE sal>2500 UNION(INTERSECT/UNION ALL/MINUS) SELECT ename, sal, job FROM emp WHERE job='MANAGER';
合并查询的执行效率远高于and,or等逻辑查询。
5.10 使用子查询插入数据
SQL>CREATE TABLE myEmp(empID number(4), name varchar2(20), sal number(6), job varchar2(10), dept number(2)); 先建一张空表;
SQL>INSERT INTO myEmp(empID, name, sal, job, dept) SELECT empno, ename, sal, job, deptno FROM emp WHERE deptno=10; 再将emp表中部门号为10的数据插入到新表myEmp中,实现数据的批量查询。
5.11 使用了查询更新表中的数据
SQL>UPDATE emp SET(job, sal, comm)=(SELECT job, sal, comm FROM emp where ename='SMITH') WHERE ename='SCOTT';
❷ SQL鏁版嵁镆ヨ㈣瑷涓鍙浠ラ檺鍒舵煡璇㈢粨鏋沧樉绀虹殑琛屾暟镄勫叧阌瀛楁槸浠涔堬纻
鍦⊿QL鏁版嵁镆ヨ㈣瑷涓锛岀敤浜庨檺鍒舵煡璇㈢粨鏋沧樉绀虹殑琛屾暟镄勫叧阌瀛楁槸LIMIT銆侺IMIT鍏抽敭瀛楀彲浠ョ敤浜庨檺鍒舵煡璇㈢粨鏋滆繑锲炵殑琛屾暟銆傞氩父锛屽畠涓岙ELECT璇鍙ヤ竴璧蜂娇鐢锛岃娉曞备笅锛
sql
澶嶅埗
SELECT column1, column2, ...
FROM table_name
LIMIT number_of_rows;
鍏朵腑锛宑olumn1, column2, ...鏄瑕佹煡璇㈢殑鍒楀悕锛宼able_name鏄瑕佹煡璇㈢殑琛ㄥ悕锛宯umber_of_rows鏄瑕佽繑锲炵殑琛屾暟銆
渚嫔傦纴浠ヤ笅镆ヨ㈣鍙ュ皢杩斿洖employees琛ㄤ腑鍓5琛屾暟鎹锛
sql
澶嶅埗
SELECT *
FROM employees
LIMIT 5;
璇锋敞镒忥纴LIMIT鍏抽敭瀛楄缮鍙浠ヤ笌OFFSET鍏抽敭瀛椾竴璧蜂娇鐢锛岀敤浜庢寚瀹氢粠镆ヨ㈢粨鏋滈泦涓镄勫摢涓浣岖疆寮濮嬭繑锲炶屻备緥濡傦纴浠ヤ笅镆ヨ㈣鍙ュ皢杩斿洖浠庣6琛屽紑濮嬬殑10琛屾暟鎹锛
sql
澶嶅埗
SELECT *
FROM employees
LIMIT 10 OFFSET 5;
❸ SQL server鏁版嵁搴撴煡璇㈣鍙ヤ娇鐢ㄦ柟娉曡︾粏璁茶В
涓銆 绠鍗曟煡璇
绠鍗旷殑Transact-SQL镆ヨ㈠彧鍖呮嫭阃夋嫨鍒楄〃銆丗ROM瀛愬彞鍜学HERE瀛愬彞銆傚畠浠鍒嗗埆璇存槑镓镆ヨ㈠垪銆佹煡璇㈢殑琛ㄦ垨瑙嗗浘銆佷互鍙婃悳绱㈡浔浠剁瓑銆
渚嫔傦纴涓嬮溃镄勮鍙ユ煡璇testtable琛ㄤ腑濮揿悕涓衡滃紶涓夆濈殑nickname瀛楁靛拰email瀛楁点
SELECT nickname,email
FROM testtable
WHERE name='寮犱笁'
(涓) 阃夋嫨鍒楄〃
阃夋嫨鍒楄〃(select_list)鎸囧嚭镓镆ヨ㈠垪锛屽畠鍙浠ユ槸涓缁勫垪钖嶅垪琛ㄣ佹槦鍙枫佽〃杈惧纺銆佸彉閲(鍖呮嫭灞閮ㄥ彉閲忓拰鍏ㄥ眬鍙橀噺)绛夋瀯鎴愩
1銆侀夋嫨镓链夊垪
渚嫔傦纴涓嬮溃璇鍙ユ樉绀篓esttable琛ㄤ腑镓链夊垪镄勬暟鎹:
SELECT *
FROM testtable
2銆侀夋嫨閮ㄥ垎鍒楀苟鎸囧畾瀹冧滑镄勬樉绀烘″簭
镆ヨ㈢粨鏋滈泦钖堜腑鏁版嵁镄勬帓鍒楅‘搴忎笌阃夋嫨鍒楄〃涓镓鎸囧畾镄勫垪钖嶆帓鍒楅‘搴忕浉钖屻
渚嫔:
SELECT nickname,email
FROM testtable
3銆佹洿鏀瑰垪镙囬
鍦ㄩ夋嫨鍒楄〃涓锛屽彲閲嶆柊鎸囧畾鍒楁爣棰樸傚畾涔夋牸寮忎负:
鍒楁爣棰=鍒楀悕
鍒楀悕 鍒楁爣棰
濡傛灉鎸囧畾镄勫垪镙囬树笉鏄镙囧嗳镄勬爣璇嗙︽牸寮忔椂锛屽簲浣跨敤寮曞彿瀹氱晫绗︼纴渚嫔傦纴涓嫔垪璇鍙ヤ娇鐢ㄦ眽瀛楁樉绀哄垪镙囬:
SELECT 鏄电О=nickname,鐢靛瓙闾浠=email
FROM testtable
4銆佸垹闄ら吨澶嶈
SELECT璇鍙ヤ腑浣跨敤ALL鎴朌ISTINCT阃夐”𨱒ユ樉绀鸿〃涓绗﹀悎𨱒′欢镄勬墍链夎屾垨鍒犻櫎鍏朵腑閲嶅岖殑鏁版嵁琛岋纴榛樿や负ALL銆备娇鐢―ISTINCT阃夐” 镞讹纴瀵逛簬镓链夐吨澶岖殑鏁版嵁琛屽湪SELECT杩斿洖镄勭粨鏋滈泦钖堜腑鍙淇濈暀涓琛屻
5銆侀檺鍒惰繑锲炵殑琛屾暟
浣跨敤TOP n [PERCENT]阃夐”闄愬埗杩斿洖镄勬暟鎹琛屾暟锛孴OP n璇存槑杩斿洖n琛岋纴钥孴OP n PERCENT镞讹纴璇存槑n鏄琛ㄧず涓锏惧垎鏁帮纴鎸囧畾杩斿洖镄勮屾暟绛変簬镐昏屾暟镄勭栌鍒嗕箣鍑犮
渚嫔:
SELECT TOP 2 *FROM testtable SELECT TOP 20 PERCENT * FROM testtable
(浜)FROM 瀛愬彞
FROM瀛愬彞鎸囧畾SELECT璇鍙ユ煡璇㈠强涓庢煡璇㈢浉鍏崇殑琛ㄦ垨瑙嗗浘銆傚湪FROM瀛愬彞涓链澶氩彲鎸囧畾256涓琛ㄦ垨瑙嗗浘锛屽畠浠涔嬮棿鐢ㄩ楀彿鍒嗛殧銆
鍦‵ROM瀛愬彞钖屾椂鎸囧畾澶氢釜琛ㄦ垨瑙嗗浘镞讹纴濡傛灉阃夋嫨鍒楄〃涓瀛桦湪钖屽悕鍒楋纴杩欐椂搴斾娇鐢ㄥ硅薄钖嶉檺瀹氲繖浜涘垪镓灞炵殑琛ㄦ垨瑙嗗浘銆备緥濡傚湪usertable鍜 citytable琛ㄤ腑钖屾椂瀛桦湪cityid鍒楋纴鍦ㄦ煡璇涓や釜琛ㄤ腑镄刢ityid镞跺簲浣跨敤涓嬮溃璇鍙ユ牸寮忓姞浠ラ檺瀹:
SELECT username,citytable.cityid
FROM usertable,citytable
WHERE usertable.cityid=citytable.cityid
鍦‵ROM瀛愬彞涓鍙鐢ㄤ互涓嬩袱绉嶆牸寮忎负琛ㄦ垨瑙嗗浘鎸囧畾鍒钖:
琛ㄥ悕 as 鍒钖
琛ㄥ悕 鍒钖
渚嫔备笂闱㈣鍙ュ彲鐢ㄨ〃镄勫埆钖嶆牸寮忚〃绀轰负:
SELECT username,b.cityid
FROM usertable a,citytable b
WHERE a.cityid=b.cityid
SELECT涓崭粎鑳戒粠琛ㄦ垨瑙嗗浘涓妫绱㈡暟鎹锛屽畠杩樿兘澶熶粠鍏跺畠镆ヨ㈣鍙ユ墍杩斿洖镄勭粨鏋滈泦钖堜腑镆ヨ㈡暟鎹銆
渚嫔:
SELECT a.au_fname+a.au_lname
FROM authors a,titleauthor ta
(SELECT title_id,title
FROM titles
WHERE ytd_sales10000
) AS t
WHERE a.au_id=ta.au_id
AND ta.title_id=t.title_id
姝や緥涓锛屽皢SELECT杩斿洖镄勭粨鏋滈泦钖堢粰浜堜竴鍒钖峵锛岀劧钖庡啀浠庝腑妫绱㈡暟鎹銆
(涓) 浣跨敤WHERE瀛愬彞璁剧疆镆ヨ㈡浔浠
WHERE瀛愬彞璁剧疆镆ヨ㈡浔浠讹纴杩囨护鎺変笉闇瑕佺殑鏁版嵁琛屻备緥濡备笅闱㈣鍙ユ煡璇㈠勾榫勫ぇ浜20镄勬暟鎹:
SELECT *
FROM usertable
WHERE age20
WHERE瀛愬彞鍙鍖呮嫭钖勭嶆浔浠惰繍绠楃:
姣旇缉杩愮畻绗(澶у皬姣旇缉):銆=銆=銆併=銆併!銆!
锣冨洿杩愮畻绗(琛ㄨ揪寮忓兼槸钖﹀湪鎸囧畾镄勮寖锲):BETWEEN钬AND钬
NOT BETWEEN钬AND钬
鍒楄〃杩愮畻绗(鍒ゆ柇琛ㄨ揪寮忔槸钖︿负鍒楄〃涓镄勬寚瀹氶”):IN (椤1,椤2钬︹)
NOT IN (椤1,椤2钬︹)
妯″纺鍖归厤绗(鍒ゆ柇鍊兼槸钖︿笌鎸囧畾镄勫瓧绗﹂氶厤镙煎纺鐩哥):LIKE銆丯OT LIKE
绌哄煎垽鏂绗(鍒ゆ柇琛ㄨ揪寮忔槸钖︿负绌):IS NULL銆丯OT IS NULL
阃昏緫杩愮畻绗(鐢ㄤ簬澶氭浔浠剁殑阃昏緫杩炴帴):NOT銆丄ND銆丱R
1銆佽寖锲磋繍绠楃︿緥:age BETWEEN 10 AND 30鐩稿綋浜巃ge=10 AND age=30
2銆佸垪琛ㄨ繍绠楃︿緥:country IN ('Germany','China')
3銆佹ā寮忓尮閰岖︿緥:甯哥敤浜庢ā绯婃煡镓撅纴瀹冨垽鏂鍒楀兼槸钖︿笌鎸囧畾镄勫瓧绗︿覆镙煎纺鐩稿尮閰嶃傚彲鐢ㄤ簬char銆乿archar銆乼ext銆乶text銆 datetime鍜宻malldatetime绛夌被鍨嬫煡璇銆
涓娄竴椤12 涓嬩竴椤