MySQL简单查询语句练习

数据查询语法(DQL)

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

语法:

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

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

WHERE condition /*行条件*/

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

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

ORDER BY sorting_columns /*对结果分组*/

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

创建名:

l 学生表: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);

l 雇员表: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);

l 部分表: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子句中可以使用如下运算符及关键字:

l =、!=、<>、<、<=、>、>=;

l BETWEEN…AND;

l IN(set);

l IS NULL;

l AND;

l OR;

l NOT;

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

  SELECT * FROM stu

WHERE gender=‘female‘ AND ge<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。

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 聚合函数

聚合函数是用来做纵向运算的函数:

l COUNT():统计指定列不为NULL的记录行数;

l MAX():计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算;

l MIN():计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算;

l SUM():计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0;

l AVG():计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0;

6.1 COUNT

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

l 查询emp表中记录数:

SELECT COUNT(*) AS cnt FROM emp;

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

SELECT COUNT(comm) cnt FROM emp;

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

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

SELECT COUNT(*) FROM emp

WHERE sal > 2500;

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

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

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

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

6.2 SUM和AVG

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

l 查询所有雇员月薪和:

SELECT SUM(sal) FROM emp;

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

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

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

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

l 统计所有员工平均工资:

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

或者

SELECT AVG(sal) FROM emp;

6.3 MAX和MIN

l 查询最高工资和最低工资:

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

7 分组查询

当需要分组查询时需要使用GROUP BY子句,例如查询每个部门的工资和,这说明要使用部分来分组。

7.1 分组查询

l 查询每个部门的部门编号和每个部门的工资和:

SELECT deptno, SUM(sal)

FROM emp

GROUP BY deptno;

l 查询每个部门的部门编号以及每个部门的人数:

SELECT deptno,COUNT(*)

FROM emp

GROUP BY deptno;

l 查询每个部门的部门编号以及每个部门工资大于1500的人数:

SELECT deptno,COUNT(*)

FROM emp

WHERE sal>1500

GROUP BY deptno;

7.2 HAVING子句

l 查询工资总和大于9000的部门编号以及工资和:

SELECT deptno, SUM(sal)

FROM emp

GROUP BY deptno

HAVING SUM(sal) > 9000;

  

注:having与where的区别:

1.having是在分组后对数据进行过滤.

where是在分组前对数据进行过滤

2.having后面可以使用分组函数(统计函数)

where后面不可以使用分组函数。

WHERE是对分组前记录的条件,如果某行记录没有满足WHERE子句的条件,那么这行记录不会参加分组;而HAVING是对分组后数据的约束。

8 LIMIT

LIMIT用来限定查询结果的起始行,以及总行数。

8.1 查询5行记录,起始行从0开始

SELECT * FROM emp LIMIT 0, 5;

注意,起始行从0开始,即第一行开始!

8.2 查询10行记录,起始行从3开始

SELECT * FROM emp LIMIT 3, 10;

8.3 分页查询

如果一页记录为10条,希望查看第3页记录应该怎么查呢?

l 第一页记录起始行为0,一共查询10行;

l 第二页记录起始行为10,一共查询10行;

l 第三页记录起始行为20,一共查询10行;

8.3 分页查询

查询语句书写顺序:select – from- where- group by- having- order by-limit

查询语句执行顺序:from - where -group by - having - select - order by-limit

时间: 2024-12-26 16:48:15

MySQL简单查询语句练习的相关文章

mysql 简单查询语句

1.根据小时分组 select DATE_FORMAT(Y_CDATETIME,'%Y%m%d %H') HOUR,count(*) as '总量' FROM orderdata WHERE Y_CDATETIME >='2017-04-27' and Y_CDATETIME < '2017-04-28' GROUP BY HOUR; 2.根据查询结果降序排列 SELECT * FROM( select DATE_FORMAT(Y_CDATETIME,'%Y%m%d %H') HOUR,cou

T-SQL简单查询语句(模糊查询)

1 T-SQL简单查询语句 2 3 简单查询: 4 5 1.最简单查询(查所有数据) 6 select * from 表名: 注:* 代表所有列 7 select * from info 8 9 2.查询指定列 10 select code,name from info 11 12 3.修改结果集的列名 13 select code as '代号',name as '姓名' from info 14 15 4.条件查询 16 select * from info where code='p003

23个MySQL常用查询语句

一查询数值型数据: SELECT * FROM tb_name WHERE sum > 100; 查询谓词:>,=,<,<>,!=,!>,!<,=>,=< 二查询字符串 SELECT * FROM tb_stu  WHERE sname  =  '小刘' SELECT * FROM tb_stu  WHERE sname like '刘%' SELECT * FROM tb_stu  WHERE sname like '%程序员' SELECT * F

简单查询语句(三)

前言 对于一些原理性文章园中已有大量的文章尤其是关于索引这一块,我也是花费大量时间去学习,对于了解索引原理对于后续理解查询计划和性能调优有很大的帮助,而我们只是一些内容进行概括和总结,这一节我们开始正式步入学习SQL中简单的查询语句,简短的内容,深入的理解. 简单查询语句 所有复杂的语句都是由简单的语句组成基本都是由SELECT.FROM.WHERE.GROUP BY.HAVING.ORDER BY等组成,当然还包括一些谓词等等.比如当我们要查询某表中所有数据时我们会像如下进行. SELECT

MySQL嵌套查询语句

MySQL嵌套查询语句统计每个省的人口最多的与最少的城市 SELECT District,NAME,Population FROM city WHERE Population IN (SELECT MIN(Population) FROM city WHERE city.CountryCode='CHN' GROUP BY city.District) UNION SELECT District,NAME,Population FROM city WHERE Population IN (SEL

nodejs Sequelize 简单查询语句和 mysql常用的几个查询命令

我是前端,但总有需求让做后端的活,所以顺带着熟悉了下简单的查询语句 贴出来,如果有需要可以参考下,备注很详细,就不多解释了废话不多说贴代码: #去除unionid 重复的搜索结果 #query_resultsign 表名 select *, count(unionid) from query_resultsign where issign='false' group by unionid ; #去除unionid 重复的搜索结果 #query_resultsign 表名 select *, co

MySQL简单查询详解

MySQL的查询操作 单表查询:简单查询 多表查询:连接查询 联合查询 布尔条件表达式操作符    = 等值比较    <=>:跟空值比较不会产生额外信息的等值比较    <>:不等值    <:     <=:    >    >=    IS NULL    IS NOT NULL        LIKE:        支持的通配符: %(任意长度的任意字符),_(任意单个字符)    RLIKE,REGEXP: 支持使用正则表达式    IN: 判断

MySQL简单查询和单表查询

MySQL记录操作 概览 MySQL数据操作: DML 在MySQL管理软件中,可以通过SQL语句中的DML语言来实现数据的操作,包括 使用INSERT实现数据的插入 UPDATE实现数据的更新 使用DELETE实现数据的删除 使用SELECT查询数据以及. 插入数据insert 1. 插入完整数据(顺序插入) 语法一: INSERT INTO 表名(字段1,字段2,字段3-字段n) VALUES(值1,值2,值3-值n); 语法二: INSERT INTO 表名 VALUES (值1,值2,值

【MySQL】查询语句优化 &#132411;

原文: http://blog.gqylpy.com/gqy/389 ???????MySQL的性能优化包罗甚广:索引优化.查询优化.查询缓存.服务器设置优化.操作系统及硬件优化.应用层优化(web服务器.缓存)等等.本文提到的优化技巧更适用于开发人员,都是从网络上收集和自己整理的,主要是查询语句上面的优化,其它层面的优化技巧在此不做记录. 整理如下 合理创建索引 count 的优化 避免使用不兼容的数据类型 索引字段上进行运算会使索引失效 尽量避免使用 !=.is null.is not nu