目录

【数据库】3.基础DQL语句的编写

查询语句的结构

SELECT  ...
FROM ...
WHERE ...
GROUP BY ...
HAVING ...
ORDER BY ...

简单查询语句(DQL)

基础查询语句

SELECT col1,col2,col3,col4... FROM tbname;

tbname表查询上述多个字段的值。

SELECT * FROM tbname;

tbname表中查询所有数据。(实际开发中不建议使用星号,因为查询效率较低)

数学运算和重命名

SELECT col1,col2 * 10 AS newcol FROM tbname;

执行该条语句的查询结果中,所有查得数据中col2的数值将被乘以10,得到的字段重命名为newcol

注意

  • 任意一条SQL语句以;结尾,且SQL语句不区分大小写
  • 若要将字段重命名为中文的话,需要将新字段名用单引号括住as '新字段名'

条件查询语句

基础条件查询语句

SELECT <colname> FROM <tbname> WHERE <condition>;

条件查询的语句执行顺序:from -> where -> select

--从emp中找出所有sal > 200的数据的ename
select ename from emp where sal > 200;
--从emp找出所有sal不等于200的数据的ename
select ename from emp where sal <> 200;--sql特有的运算符
select ename from emp where sal != 200;

--从emp中查找ename为'tom'的数据的sal
select sal from emp where ename = 'tom';

Between…and..语句

--找出sal在200-300之间(包括200和300)的数据的ename
select ename from emp where sal >= 200 and sal <= 300;
select ename from emp where sal between 200 and 300;--记住between...and...用在数值时是闭区间!!

--找出ename首字母在'A'到'C'之间(包含'A',不包含'C')的ename
select ename from emp where ename >= 'A' and ename <= 'C'; --写<='C'和<'C'的查询结果一致
select ename from emp where ename between 'A' and 'C';--between and 用在字符是左闭右开

in关键字

in后接数个查询关键词,用于查询条件字段符合其中某个关键词的数据。

--找出sal是1000或者2000的ename
select ename from emp where sal = 1000 or sal = 2000;
select ename from emp where sal in (1000,2000);

distinct关键字

distinct后接需要去重的字段名。可以去除重复字段

--找出emp中所有不同的job
select distinct job from emp;
select job from emp group by job;
--找出emp中不同deptno中不同的job
select distinct deptno,job from emp;-- deptno和job联合去重,查询结果中不会出现deptno和job均相同的数据项
--统计job的数量
select count(distinct job) from emp;-- 只会计数不同的job

判断是否为空

--找出sal为空的ename
select ename from emp where sal is null;
--找出sal不为空的ename
select ename from emp where sal is not null;
--找出deptno为20并且sal为0或者为空的ename
select ename from emp where deptno = 20 and (sal is null or sal = 0);

模糊查询

SELECT <colname> FROM <tbname> WHERE <condition_col> LIKE <condition>

在模糊查询当中,需要掌握两个特殊的字符:

  • %代表任意多个字符
  • _代表任意一个字符。 若需要查找这两个字符,需要加反斜杠\转义。

like关键字

--找出ename中含有O的所有ename
select ename from emp where ename like '%O%';
--找出ename中第二个字符为A的所有ename
select ename from emp where ename like '_A%';
--找出ename最后一个字符为A的所有ename
select ename from emp where ename like '%A';
--找出ename中含有下划线的ename
select ename from emp where ename like '%\_%';

排序输出

SELECT <colname> FROM <tbname> ORDER BY <sortkey_col> <order=asc>;

其中,最后的<order>有两种取值:

  • asc表示升序
  • desc表示降序

可以同时设置多个排序关键字,靠前的排序关键字将被看作主要排序关键字。

该条的语句执行顺序:from -> where -> select -> order by

注意:ORDER BY默认为升序排序

--根据sal升序排序,查询emp表里的ename和sal
select ename,sal from emp order by sal;
select ename,sal from emp order by 2;--这里的2,指查询字段的第二个,也就是sal
select ename,sal from emp order by sal asc;
select ename,sal from emp order by 2 asc;
--根据sal降序排序,查询emp表里的ename和sal
select ename,sal from emp order by sal desc;
--根据sal降序排序,当sal相同时,根据ename升序排序
select ename,sal from emp order by sal desc,ename asc;--sal为主要关键字

分页查询

limit可以用于取查询结果中的部分数据,语法如下:

SELECT <colname> FROM <tbname> ORDER BY <sortkey_col> <order=asc> LIMIT <startindex=0> , <length>;

limt的执行在order by之后。

--查询sal前五名的ename
select ename from emp order by sal desc limit 0,5;
select ename from emp order by sal desc limit 5;
--查询sal第4到第9名的ename
select ename from emp order by sal desc limit 3,6;

limit可以进行分页,如需要结果每页显示pagesize条记录,则第pageNo页的内容范围就是:

limit (pageNo-1)*pagesize , pagesize

如每页5条,第2页的内容范围就是:limit (2-1)*5 , 5