mysql2

DQL操作

DQL数据查询语言 (重要)

数据库执行DQL语句不会对数据进行改变,而是让数据库发送结果集给客户端。

查询返回的结果集是一张虚拟表。

 

查询关键字:SELECT

语法: SELECT 列名 FROM表名

【WHERE --> GOUP BY -->HAVING--> ORDER BY   LIMIT】

 

语法:

SELECT selection_list /*要查询的列名称*/

  FROM table_list /*要查询的表名称*/

  WHERE condition /*行条件*/

  GROUP BY grouping_columns /*对结果分组*/

  HAVING condition /*分组后的行条件*/

  ORDER BY sorting_columns /*对结果排序*/

  LIMIT offset_start, row_count /*结果限定*/

 

创建名:

  1. 学生表:stu

字段名称

字段类型

说明

sid

char(6)

学生学号

sname

varchar(50)

学生姓名

age

int

学生年龄

gender

varchar(50)

学生性别

 

CREATE TABLE stu (

sid CHAR(6),

sname VARCHAR(50),

age INT,

gender VARCHAR(50)

);

INSERT INTO stu VALUES('S_1001', 'liuYi', 35, 'male');

INSERT INTO stu VALUES('S_1002', 'chenEr', 15, 'female');

INSERT INTO stu VALUES('S_1003', 'zhangSan', 95, 'male');

INSERT INTO stu VALUES('S_1004', 'liSi', 65, 'female');

INSERT INTO stu VALUES('S_1005', 'wangWu', 55, 'male');

INSERT INTO stu VALUES('S_1006', 'zhaoLiu', 75, 'female');

INSERT INTO stu VALUES('S_1007', 'sunQi', 25, 'male');

INSERT INTO stu VALUES('S_1008', 'zhouBa', 45, 'female');

INSERT INTO stu VALUES('S_1009', 'wuJiu', 85, 'male');

INSERT INTO stu VALUES('S_1010', 'zhengShi', 5, 'female');

INSERT INTO stu VALUES('S_1011', 'xxx', NULL, NULL);

 

  1. 雇员表:emp

字段名称

字段类型

说明

empno

int

员工编号

ename

varchar(50)

员工姓名

job

varchar(50)

员工工作

mgr

int

领导编号

hiredate

date

入职日期

sal

decimal(7,2)

月薪

comm

decimal(7,2)

奖金

deptno

int

部分编号

 

CREATE TABLE emp(

empno INT,

ename VARCHAR(50),

job VARCHAR(50),

mgr INT,

hiredate DATE,

sal DECIMAL(7,2),

comm decimal(7,2),

deptno INT

) ;

INSERT INTO emp values(7369,'SMITH','CLERK',7902,'1980-12-17',800,NULL,20);

INSERT INTO emp values(7499,'ALLEN','SALESMAN',7698,'1981-02-20',1600,300,30);

INSERT INTO emp values(7521,'WARD','SALESMAN',7698,'1981-02-22',1250,500,30);

INSERT INTO emp values(7566,'JONES','MANAGER',7839,'1981-04-02',2975,NULL,20);

INSERT INTO emp values(7654,'MARTIN','SALESMAN',7698,'1981-09-28',1250,1400,30);

INSERT INTO emp values(7698,'BLAKE','MANAGER',7839,'1981-05-01',2850,NULL,30);

INSERT INTO emp values(7782,'CLARK','MANAGER',7839,'1981-06-09',2450,NULL,10);

INSERT INTO emp values(7788,'SCOTT','ANALYST',7566,'1987-04-19',3000,NULL,20);

INSERT INTO emp values(7839,'KING','PRESIDENT',NULL,'1981-11-17',5000,NULL,10);

INSERT INTO emp values(7844,'TURNER','SALESMAN',7698,'1981-09-08',1500,0,30);

INSERT INTO emp values(7876,'ADAMS','CLERK',7788,'1987-05-23',1100,NULL,20);

INSERT INTO emp values(7900,'JAMES','CLERK',7698,'1981-12-03',950,NULL,30);

INSERT INTO emp values(7902,'FORD','ANALYST',7566,'1981-12-03',3000,NULL,20);

INSERT INTO emp values(7934,'MILLER','CLERK',7782,'1982-01-23',1300,NULL,10);

 

  1. 部分表:dept

字段名称

字段类型

说明

deptno

int

部分编码

dname

varchar(50)

部分名称

loc

varchar(50)

部分所在地点

 

CREATE TABLE dept(

deptno INT,

dname varchar(14),

loc varchar(13)

);

INSERT INTO dept values(10, 'ACCOUNTING', 'NEW YORK');

INSERT INTO dept values(20, 'RESEARCH', 'DALLAS');

INSERT INTO dept values(30, 'SALES', 'CHICAGO');

INSERT INTO dept values(40, 'OPERATIONS', 'BOSTON');

 

1 基础查询

1.1 查询所有列

SELECT * FROM stu;

 

1.2 查询指定列

SELECT sid, sname, age FROM stu;

 

2 条件查询

2.1 条件查询介绍

条件查询就是在查询时给出WHERE子句,在WHERE子句中可以使用如下运算符及关键字:

  1. =、!=、<>、<、<=、>、>=;
  2. BETWEEN…AND;
  3. IN(set);
  4. IS NULL;  
  5. AND;
  6. OR;
  7. NOT;

 

2.2 查询性别为女,并且年龄小于50的记录

SELECT * FROM stu

WHERE gender='female' AND  age<50;

 

2.3 查询学号为S_1001,或者姓名为liSi的记录

SELECT * FROM stu

WHERE sid ='S_1001' OR sname='liSi';

 

2.4 查询学号为S_1001,S_1002,S_1003的记录

SELECT * FROM stu

WHERE sid IN ('S_1001','S_1002','S_1003');

 

2.5 查询学号不是S_1001,S_1002,S_1003的记录

SELECT * FROM tab_student

WHERE s_number NOT IN ('S_1001','S_1002','S_1003');

 

2.6 查询年龄为null的记录

SELECT * FROM stu

WHERE age IS NULL;

 

2.7 查询年龄在20到40之间的学生记录

SELECT *

FROM stu

WHERE age>=20 AND age<=40;

或者

SELECT *

FROM stu

WHERE age BETWEEN 20 AND 40;

 

2.8 查询性别非男的学生记录

SELECT *

FROM stu

WHERE gender!='male';

或者

SELECT *

FROM stu

WHERE gender<>'male';

或者

SELECT *

FROM stu

WHERE NOT gender='male';

 

2.9 查询姓名不为null的学生记录

SELECT *

FROM stu

WHERE NOT sname IS NULL;

或者

SELECT *

FROM stu

WHERE sname IS NOT NULL;

 

3 模糊查询

当想查询姓名中包含a字母的学生时就需要使用模糊查询了。模糊查询需要使用关键字LIKE。

通配符:

_ 任意一个字母

   %:任意0~n个字母

 '张%'

3.1 查询姓名由5个字母构成的学生记录

SELECT *

FROM stu

WHERE sname LIKE '_____';

模糊查询必须使用LIKE关键字。其中 “_”匹配任意一个字母,5个“_”表示5个任意字母。

 

3.2 查询姓名由5个字母构成,并且第5个字母为“i”的学生记录

SELECT *

FROM stu

WHERE sname LIKE '____i';

 

3.3 查询姓名以“z”开头的学生记录

SELECT *

FROM stu

WHERE sname LIKE 'z%';

其中“%”匹配0~n个任何字母。

 

3.4 查询姓名中第2个字母为“i”的学生记录

SELECT *

FROM stu

WHERE sname LIKE '_i%';

 

3.5 查询姓名中包含“a”字母的学生记录

SELECT *

FROM stu

WHERE sname LIKE '%a%';

 

4 字段控制查询

4.1 去除重复记录

去除重复记录(两行或两行以上记录中系列的上的数据都相同),例如emp表中sal字段就存在相同的记录。当只查询emp表的sal字段时,那么会出现重复记录,那么想去除重复记录,需要使用DISTINCT:

SELECT DISTINCT sal FROM emp;

 

4.2 查看雇员的月薪与佣金之和

  因为sal和comm两列的类型都是数值类型,所以可以做加运算。如果sal或comm中有一个字段不是数值类型,那么会出错。

SELECT *,sal+comm FROM emp;

 

comm列有很多记录的值为NULL,因为任何东西与NULL相加结果还是NULL,所以结算结果可能会出现NULL。下面使用了把NULL转换成数值0的函数IFNULL:

SELECT *,sal+IFNULL(comm,0) FROM emp;

 

4.3 给列名添加别名

在上面查询中出现列名为sal+IFNULL(comm,0),这很不美观,现在我们给这一列给出一个别名,为total:

SELECT *, sal+IFNULL(comm,0) AS total FROM emp;

给列起别名时,是可以省略AS关键字的:

SELECT *,sal+IFNULL(comm,0)  total FROM emp;

 

5 排序

5.1 查询所有学生记录,按年龄升序排序

SELECT *

FROM stu

ORDER BY sage ASC;

或者

SELECT *

FROM stu

ORDER BY sage;

 

5.2 查询所有学生记录,按年龄降序排序

SELECT *

FROM stu

ORDER BY age DESC;

 

5.3 查询所有雇员,按月薪降序排序,如果月薪相同时,按编号升序排序

SELECT * FROM emp

ORDER BY sal DESC,empno ASC;

 

6 聚合函数  sum avg max min count

聚合函数是用来做纵向运算(对一列进行处理)的函数:

  1. COUNT():统计指定列不为NULL的记录行数;
  2. MAX():计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算;
  3. MIN():计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算;
  4. SUM():计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0;
  5. AVG():计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0;

 

6.1 COUNT

当需要纵向统计时可以使用COUNT()。

  1. 查询emp表中记录数:

SELECT COUNT(*) AS cnt FROM emp;

#该行有一个值不为null记录值都是1,这里算的是和

 

  1. 查询emp表中有佣金的人数:

SELECT COUNT(comm) cnt FROM emp;

注意,因为count()函数中给出的是comm列,那么只统计comm列非NULL的行数。

 

  1. 查询emp表中月薪大于2500的人数:

SELECT COUNT(*) FROM emp

WHERE sal > 2500;

 

  1. 统计月薪与佣金之和大于2500元的人数:

SELECT COUNT(*) AS cnt FROM emp WHERE sal+IFNULL(comm,0) > 2500;

 

  1. 查询有佣金的人数,以及有领导的人数:

SELECT COUNT(comm), COUNT(mgr) FROM emp;

 

6.2 SUM和AVG

当需要纵向求和时使用sum()函数。

  1. 查询所有雇员月薪和:

SELECT SUM(sal) FROM emp;

 

  1. 查询所有雇员月薪和,以及所有雇员佣金和:

SELECT SUM(sal), SUM(comm) FROM emp;

 

#两个值相等,说明前面的结果没有作为后面的影响

SELECT SUM(comm),SUM(sal) FROM emp;

SELECT SUM(sal),SUM(comm) FROM emp;

 

  1. 查询所有雇员月薪+佣金和:

SELECT SUM(sal+IFNULL(comm,0)) FROM emp;

 

SELECT SUM(sal+comm) FROM emp;#sal和null中有一个为null时它们的和为null,sum把它看成0

 

  1. 统计所有员工平均工资:

SELECT AVG(sal) FROM emp;

 

6.3 MAX和MIN

  1. 查询最高工资和最低工资:

SELECT MAX(sal), MIN(sal) FROM emp;

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值