MySql--基本查询
2017-05-12 20:07
423 查看
My SQL的基本查询
一、SQL的分类
数据查询语言(DQL Data Query Language):select 数据操纵语言(DML Data Manipulation Language):insert,delete,update(针对表中的数据) 数据定义语言(DDL Data Definition Language):create,drop,alter(针对表的结构) 事务控制语言(TCL Transactional Control Language):commit,rollback 数据控制语言(DCL Data Control Language):grant,revoke
二、常用命令
查看当前数据库管理系统中得所有数据库:show databases; 创建数据库:create database 数据库名; 选择数据库:use 数据库名; 导入数据:source 路径; 删除数据库:drop database 数据库名; 查询当前使用的数据库:select database(); 查看当前数据库中的表:show tables; 查看表结构:desc 表名; 退出数据库:exit/ctrl+c/quit 查看其它库中的表:show tables from 数据库名; 查看表的创建语句:show create table 表名;
三、DQL
查询字段:select 字段名 from 表名; 一个:select ename from emp; 多个:select empno,ename from emp; 所有:select * from emp;
别名的使用:
select empno,ename,sal*12 as yearsal from emp; as关键字可以省略 别名为中文,需要加上'' select empno,ename,sal*12 '年薪' from emp; 注意:SQL语句中带有select,不会修改底层表中的数据, 只是将表中的记录检索出来;
1、条件查询:
My SQL的基本查询
使用where关键字:查询工资等于5000的员工信息: select empno,ename,sal from emp where sal=5000; 工资为double类型,也可以带上'';但最好不要 select empno,ename,sal from emp where sal>'3000'; 工资大于等于3000并且小于等于5000: select empno,ename,sal from emp where sal>=3000 and sal<=5000; 或:select empno,ename,sal from emp where sal between 3000 and 5000; 注意:between...and...必须前面是小的,后面是大的 between...and..也可用在字符上:前闭后开: select ename from emp where ename between 'A' and 'K'; 结果中包含A但不包含K
null:不是一个值,表示什么也不是,空
找出补助是空的所有员工: select ename,comm from emp where comm is null; 查询补助不是空的员工: select ename,comm from emp where comm is not null;
and:并且 or:或者 (and优先级高于or)
找出从事salesman和manage的员工 select ename,job from emp where job='salesman' or job='manager'; 找出工资大于1800的员工,要求部门编号是20或者30的 select empno,ename,sal,deptno from emp where sal>1800 and (deptno=20 or deptno=30);
in:在某个范围中搜索
找出工作岗位是manager和工作岗位是salesman的员工: select ename,job from emp where job='manager' or job='salesman'; 使用in: select ename,job from emp where job in('manager','salesman'); 找出工资为1500和5000的员工: select ename,sal from emp where sal in(1500,5000); 找出工资不是1500和5000的员工: select ename,sal from emp where sal not in(1500,5000);
like:模糊查询
%:0~N个任意字符 _:任意一个字符 找出名字里含有O的员工: select ename from emp where ename like '%O%'; 找出第一个字母为S的员工: select ename from emp where ename like'S%'; 找出最后一个字母为T的员工: select ename from emp where ename like '%T'; 找出第二个字母为A的员工: select ename from emp where ename like '_A%'; 找出第三个字母为A的员工: select ename from emp where ename like '__A%'; 找出倒数第二个字母为N的员工: select ename from emp where ename like '%N_';
2、排序:
排序采用order by子句,order by后面跟上排序字段,排序字段可以放多个,多个采用逗号间隔,order by默认采用升序(asc),如果存在where子句,那么order by必须放到where语句的后面通过薪水排序: select ename,sal from emp order by sal; 通过薪水排序(降序): select ename,sal from emp order by sal desc; 通过薪水降序,如果薪水一样的,再按名字升序排 select ename,sal from emp order by sal desc,ename asc; 按所选的第二个字段排(ename,sal中的sal) 数字表示查询结果中的字段的编号,从1开始 select ename,sal from emp order by 2;
3、数据处理函数/单行处理函数:
单行处理函数:只针对当前行进行处理
转小写:(底层数据库没改,只是将查询结果显示成小写) select lower(ename) from emp; 转大写: select upper(ename) as ename from emp; substr: select substr(ename,1,1) from emp; 找出员工名字第二个字母为A的员工: select ename from emp where substr(ename,2,1)='A'; length: select length(ename) from emp; trim: select ename from emp where ename =trim(' smith '); 保留两位小数: select round(123.456,2); 不保留小数:(0可以不写) select round(123.456,0); 保留到个位,十位,百位:-1,-2,-3 select round(123.456,-1) 120 select round(123.456,-2) 100 select round(153.456,-2) 200 生成随机数: select rand(); ifnull: 补助是空的显示为0: select ename,ifnull(comm,0) from emp; 注意:null参与运算,结果还是null 补助为空的,每月发100: select sal + ifnull(comm,100) from emp; 计算年薪: select ename,(sal+ifnull(comm,0))*12 as yearsal from emp;
关于数据库的日期处理
每一个数据库处理日期的时候,采用的机制都是不同的,日期处理都有自己的一套机制,所以在实际的开发中,表中的字段定义为date类型的情况很少。因为一旦使用日期类型,那么java程序将不能够通用。在实际开发中,一般会使用”日期字符串”来表示日期。
mysql数据库管理系统中对日期的处理提供了两个重要的函数:
str_to_date date_format
java中的日期格式:
YYYY 年 MM 月 dd 日 HH 时 mm 分 ss 秒 SSS 毫秒
java中
将字符串转换成日期类型: SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Date date = sdf.parse("1970-10-10"); 日期格式化: SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date nowTime = new Date(); String strTime = sdf.format(nowTime);
mysql的日期格式:
%Y 年 %m 月 %d 日 %H 时 %i 分 %s 秒
str_to_date函数:
作用:将“日期字符串”转换成“日期类型”数据。(varchar--->date) 执行结果:为date类型 使用格式:str_to_date('日期字符串','日期格式')
例:
查询出1980-12-17入职的员工(hiredate为date类型): select ename,hiredate from emp where hiredate='1980-12-17'; 能查出结果:mysql默认的日期格式:%Y-%m-%d,以上的日期字符串'1980-12-17'正好和默认的日期格式一样, 存在了自动类型转换,自动将日期字符串转换成了日期类型,所以以上查询可以查询出结果。 select ename,hiredate from emp where hiredate='12-17-1980'; 发生错误: '12-17-1980'日期字符串和mysql默认的日期格式不同, hiredate是date类型,'12-17-1980'是一个字符串varchar类型, 类型不匹配,无法查询出结果,发生错误。 纠正: select ename,hiredate from emp where hiredate=str_to_date('12-17-1980','%m-%d-%Y');
str_to_date函数通常使用在插入操作中。字段是date类型,不接收字符串varchar类型,需要先通过该函数将varchar变成date再插入数据。才能成功。
date_format函数:
作用:将日期类型date转换成具有特定格式的日期字符串varchar(date--->varchar) 运算结果:varchar类型(具备特定格式的) 语法:date_format(日期类型数据,'日期格式')
例:
查询员工的入职日期,以'10-12-1980'的格式显示 select ename,date_format(hiredate,'%m-%d-%Y') as hiredate from emp; 查询员工的入职日期,以'10/12/1980'的格式显示 select ename,date_format(hiredate,'%m/%d/%Y') as hiredate from emp; 以下两个DQL语句的执行结果相同: select ename,hiredate from emp;(hiredate自动转换成varchar类型,采用'%Y-%m-%d'格式) select ename,date_format(hiredate,'%Y-%m-%d') as hiredate from emp;
结论:date_format函数主要使用在查询操作中。客户需要日期以特定格式展示的时候,需要使用该函数。
4、分组函数/聚合函数/多行处理函数:
count sum max min avg:(自动忽略null)求和:select sum(sal) from emp; 求平均值:select avg(sal) from emp; 最高薪水:select max(sal) from emp; 最低薪水:select min(sal) from emp; 统计:select count(ename) from emp;
注意:count
查询该字段中不为null的元素总数:select count(comm) from emp; 查询满足条件的所有记录总数:select count(*) from emp where comm is null;
分组函数不能直接使用在where子句中:
select ename,sal from emp where sal>avg(sal);报错!
distinct:去除重复记录,只能出现在所有字段的最前方
select distinct job from emp; 统计公司一共有多少岗位: select count(distinct job) from emp;
分组查询:
主要涉及两个子句:group by和having
group by:通过某个或者某些字段进行分组 having:和where相同,都是为了完成数据的过滤, where和having后面都是添加条件 where在group by之前完成过滤 having在group by之后完成过滤
例:
找出每个工作岗位的最高薪水: 先按照工作岗位分组,使用max函数求每一组的最高薪水: select max(sal) from emp group by job; 工作岗位也可以写到select后面,因为正好工作岗位也是5个不同的值 select job,max(sal) from emp group by job; ename不可以写到select后面,因为不属于分组字段 select ename,job,max(sal) from emp group by job; --mysql中可以,语法在这方面比较松散,不严格,但是查询结果没有意义 --oracle中不可以,语法严格,执行的时候报错。
总结:如果语句中有group by子句,select后面只能跟参与分组的字段和分组函数。
例:
计算每个部门的平均薪水(按照部门编号分组,对每一组求平均薪水): select deptno,avg(sal) as avgsal from emp group by deptno; 计算出不同部门中的不同工作岗位的最高薪水: select deptno,job,max(sal) from emp group by deptno,job; //deptno,job两个字段联合起来分组。 找出每个工作岗位的最高薪水,除manager之外: select job,max(sal) from emp where job<>'manager' group by job; 找出每个工作岗位的平均薪水,要求显示平均薪水大于1500: select job,avg(sal) from emp where avg(sal)>1500 group by job; 报错!where关键字后不能直接使用分组函数 分组函数必须在分组完成后执行,而分组需要group by,而group by在where后面执行 使用having: select job,avg(sal) from emp group by job having avg(sal)>1500;
注意:尽量在where中过滤,无法过滤的数据,通常都是需要先分组之后再过滤的,这个时候可以选择使用having。(效率问题)
总结:一个完整的DQL语句的总结:
select ... from ... where ... group by .. having ... order by... 第一:以上的关键字顺序不能变,严格遵守 第二:执行顺序: 1.from 从某张表中检索数据 2.where 经过某条件进行过滤 3.group by 然后分组 4.having 分组之后不满意再过滤 5.select 查询出来 6.order by 排序输出
相关文章推荐
- Mysql多表查询 --一个例子基本搞通mysql语句
- mysql中创建表实例全析及查询基本操作
- MySQL基本SQL语句之单表查询、多表查询和子查询
- mysql一些基本数据查询
- mysql去除重复查询的SQL语句基本思路
- J2EE入门视频教程第五讲——MySQL中的数据类型及命令行基本查询语句
- mysql 数据库笔记-基本查询(分组、聚合函数)
- MySQL基本SQL语句之单表查询、多表查询和子查询
- mysql基本查询
- Mysql-基本查询 4/10
- mysql笔记二:基本数据库、表查询操作
- MySQL的一些基本语法(7)-查询数据
- mysql 基本查询
- 对MySQL慢查询日志进行分析的基本教程
- mysql基本结构化查询语言
- MySQL笔记之基本查询的应用详解
- MYSQL基本查询语句练习1--用到的表和建表语句
- MySQL 数据库基本查询语句汇总
- MySQL笔记 插入,查询,基本语句