目录
?编辑
1.导入数据
2.简单查询(查询表中数据)
3.查看表结构
4.查询多个字段
5.条件查询?
6. 排序
7.数据处理函数?
8.分组函数(多行处理函数)
9.分组查询
10.总结
1.导入数据
?show databases;------->create database bjpowernode;------->use bjpowernode;-------->source 文件的绝对路径/相对路径
2.简单查询(查询表中数据)
select 字段名 from 表名;
select ,from是关键字。字段名和表名是标识符。
sql不区分大小写。
3.查看表结构
不看表中的数据,只看表的结构
desc 表名;
4.查询多个字段
(1)select 字段名,字段名 from 表名
字段名之间用“,”隔开
(2)给查询的列起别名
select deptno,dname as deptname from dept;
注意:
只是将显示的查询结果列名显示为deptname,原表列名还是叫:dname select语句是永远都不会进行修改操作的。(因为只负责查询)
as 可以省略。当别名内有空格时必须使用单引号或者双引号括起来,数据库中的字符串都是采用单引号括起来。这是标准的。双引号不标准。
5.条件查询?
select 字段名,字段名?from 表名 where 条件;
?? ?语法格式: ?? ??? ?select ?? ??? ??? ?字段1,字段2,字段3.... ?? ??? ?from? ?? ??? ??? ?表名 ?? ??? ?where ?? ??? ??? ?条件;
?? ?= 等于 ?? ?查询薪资等于800的员工姓名和编号? ?? ??? ?select empno,ename from emp where sal = 800; ?? ?查询SMITH的编号和薪资? ?? ??? ?select empno,sal from emp where ename = 'SMITH'; //字符串使用单引号
?? ?<>或!= 不等于 ?? ?查询薪资不等于800的员工姓名和编号? ?? ??? ?select empno,ename from emp where sal != 800; ?? ??? ?select empno,ename from emp where sal <> 800; // 小于号和大于号组成的不等号
?? ?< 小于 ?? ?查询薪资小于2000的员工姓名和编号? ?? ??? ?mysql> select empno,ename,sal from emp where sal < 2000;
?? ?<= 小于等于 ?? ?查询薪资小于等于3000的员工姓名和编号? ?? ??? ?select empno,ename,sal from emp where sal <= 3000;
?? ?> 大于 ?? ?查询薪资大于3000的员工姓名和编号? ?? ??? ?select empno,ename,sal from emp where sal > 3000;
?? ?>= 大于等于 ?? ?查询薪资大于等于3000的员工姓名和编号? ?? ??? ?select empno,ename,sal from emp where sal >= 3000;
?? ?between … and …. 两个值之间, 等同于 >= and <= ?? ?查询薪资在2450和3000之间的员工信息?包括2450和3000 ?? ??? ?第一种方式:>= and <= (and是并且的意思。) ?? ??? ??? ?select empno,ename,sal from emp where sal >= 2450 and sal <= 3000;
?? ??? ?第二种方式:between … and … ?? ??? ??? ?select? ?? ??? ??? ??? ?empno,ename,sal? ?? ??? ??? ?from? ?? ??? ??? ??? ?emp? ?? ??? ??? ?where? ?? ??? ??? ??? ?sal between 2450 and 3000; ?? ??? ??? ? ?? ??? ??? ?注意: ?? ??? ??? ??? ?使用between and的时候,必须遵循左小右大。 ?? ??? ??? ??? ?between and是闭区间,包括两端的值。
?? ?is null 为 null(is not null 不为空) ?? ?查询哪些员工的津贴/补助为null? ?? ??? ?mysql> select empno,ename,sal,comm from emp where comm = null;
?? ??? ?mysql> select empno,ename,sal,comm from emp where comm is null; ?? ?
?? ?and 并且 ?? ?查询工作岗位是MANAGER并且工资大于2500的员工信息? ?? ??? ?select? ?? ??? ??? ?empno,ename,job,sal? ?? ??? ?from? ?? ??? ??? ?emp? ?? ??? ?where? ?? ??? ??? ?job = 'MANAGER' and sal > 2500; ?? ??? ?
?? ?or 或者 ?? ?查询工作岗位是MANAGER和SALESMAN的员工? ?? ??? ?select empno,ename,job from emp where job = 'MANAGER'; ?? ??? ?select empno,ename,job from emp where job = 'SALESMAN';
?? ??? ?select? ?? ??? ??? ?empno,ename,job ?? ??? ?from ?? ??? ??? ?emp ?? ??? ?where? ?? ??? ??? ?job = 'MANAGER' or job = 'SALESMAN'; ?? ??? ? ?? ?? ? ?? ?and和or同时出现的话,有优先级问题吗? ?? ?查询工资大于2500,并且部门编号为10或20部门的员工? ?? ??? ?select? ?? ??? ??? ?* ?? ??? ?from ?? ??? ??? ?emp ?? ??? ?where ?? ??? ??? ?sal > 2500 and deptno = 10 or deptno = 20; ?? ??? ??? ?and优先级比or高。 ?? ??? ??? ?以上语句会先执行and,然后执行or; ?? ??? ?select? ?? ??? ??? ?* ?? ??? ?from ?? ??? ??? ?emp ?? ??? ?where ?? ??? ??? ?sal > 2500 and (deptno = 10 or deptno = 20); ?? ??? ? ?? ??? ?and和or同时出现,and优先级较高。如果想让or先执行,需要加“小括号” ?? ??? ?以后在开发中,如果不确定优先级,就加小括号就行了
?? ?in 包含,相当于多个 or (not in 不在这个范围中) ? ? ? ?? ??? ??? ?select empno,ename,job from emp where job = 'MANAGER' or job = 'SALESMAN'; ?? ??? ??? ?select empno,ename,job from emp where job in('MANAGER', 'SALESMAN'); ?? ??? ??? ?注意:in不是一个区间。in后面跟的是具体的值。
?? ??? ?查询薪资是800和5000的员工信息? ?? ??? ??? ?select ename,sal from emp where sal = 800 or sal = 5000; ?? ??? ??? ?select ename,sal from emp where sal in(800, 5000); //这个不是表示800到5000都找出来。 ?? ??? ??? ?select ename,sal from emp where sal in(800, 5000, 3000);
?? ??? ??? ?// not in 表示不在这几个值当中的数据。 ?? ??? ??? ?select ename,sal from emp where sal not in(800, 5000, 3000);
?? ?not 可以取非,主要用在 is 或 in 中 ?? ??? ?is null ?? ??? ?is not null ?? ??? ?in ?? ??? ?not in
?? ?like? ?? ??? ?称为模糊查询,支持%或下划线匹配 ?? ??? ?%匹配任意多个字符 ?? ??? ?下划线:任意一个字符。 ?? ??? ?(%是一个特殊的符号,_ 也是一个特殊符号)
?? ??? ?找出名字中含有O的? ?? ??? ?mysql> select ename from emp where ename like '%O%'; ?? ??? ?+-------+ ?? ??? ?| ename | ?? ??? ?+-------+ ?? ??? ?| JONES | ?? ??? ?| SCOTT | ?? ??? ?| FORD ?| ?? ??? ?+-------+
?? ??? ?找出名字以T结尾的? ?? ??? ??? ?select ename from emp where ename like '%T'; ?? ??? ??? ? ?? ??? ?找出名字以K开始的? ?? ??? ??? ?select ename from emp where ename like 'K%';
?? ??? ?找出第二个字每是A的? ?? ??? ??? ?select ename from emp where ename like '_A%'; ?? ??? ? ?? ??? ?找出第三个字母是R的? ?? ??? ??? ?select ename from emp where ename like '__R%'; ? ? ? ?
?? ??? ?找出名字中有“_”的? ?? ??? ??? ?select name from t_student where name like '%_%'; //这样不行。
?? ??? ??? ?mysql> select name from t_student where name like '%\_%'; // \转义字符。 ?? ??? ??? ?+----------+ ?? ??? ??? ?| name ? ? | ?? ??? ??? ?+----------+ ?? ??? ??? ?| jack_son | ?? ??? ??? ?+----------+
6. 排序
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 asc;
多个字段排序
select??ename,sal?from?emp?order by?sal asc, ename asc; // sal在前,起主导,只有sal相等的时候,才会考虑启用ename排序。
7.数据处理函数?
数据处理函数又被称为单行处理函数
??单行处理函数的特点:一个输入对应一个输出。
??和单行处理函数相对的是:多行处理函数。(多行处理函数特点:多个输入,对应1个输出!) 常见单行处理函数
lower 转换小写
select lower(ename) as ename from emp;
upper 转换大写
select * from t_student;
select upper(name) as name from t_student;
?? ?+----------+ ? ? ? ?| name ? ? | ?? ??? ?+----------+ ?? ??? ?| ZHANGSAN | ?? ??? ?| LISI ? ? | ?? ??? ?| WANGWU ? | ?? ??? ?| JACK_SON | ?? ??? ?+----------+
substr 取子串(substr( 被截取的字符串, 起始下标,截取的长度))
select substr(ename, 1, 1) as ename from emp;注意:起始下标从1开始,没有0.
首字母大写
select name from t_student; ?? ??? ??? ?select upper(substr(name,1,1)) from t_student; ?? ??? ??? ?select substr(name,2,length(name) - 1) from t_student; ?? ??? ??? ?select concat(upper(substr(name,1,1)),substr(name,2,length(name) - 1)) as result from t_student; ?? ??? ??? ?+----------+ ?? ??? ??? ?| result ? | ?? ??? ??? ?+----------+ ?? ??? ??? ?| Zhangsan | ?? ??? ??? ?| Lisi ? ? | ?? ??? ??? ?| Wangwu ? | ?? ??? ??? ?| Jack_son | ?? ??? ??? ?+----------+
concat函数进行字符串的拼接
select concat(empno,ename) from emp;
length 取长度
select length(ename) enamelength from emp;
trim 去空格
select * from emp where ename = ' ?KING';
select * from emp where ename = trim(' ? KING');
str_to_date 将字符串转换成日期 date_format 格式化日期 format 设置千分位
case..when..then..when..then..else..end
round 四舍五入
select round(1236.567, 2) as result from emp; //保留2个小数 select round(1236.567, -1) as result from emp; // 保留到十位。
rand() 生成随机数
select round(rand()*100,0) from emp; // 100以内的随机数
ifnull 可以将 null 转换成一个具体值 ifnull是空处理函数。专门处理空的。 在所有数据库当中,只要有NULL参与的数学运算,最终结果就是NULL。
ifnull函数用法:ifnull(数据, 被当做哪个值) 如果“数据”为NULL的时候,把这个数据结构当做哪个值。
补助为NULL的时候,将补助当做0
?select ename, (sal + ifnull(comm, 0)) * 12 as yearsal from emp;
8.分组函数(多行处理函数)
多行处理函数的特点:输入多行,最终输出一行。
5个: ?? ??? ?count?? ?计数 ?? ??? ?sum?? ?求和 ?? ??? ?avg?? ?平均值 ?? ??? ?max?? ?最大值 ?? ??? ?min?? ?最小值 ?? ? ?? ?注意: ?? ??? ?分组函数在使用的时候必须先进行分组,然后才能用。 ?? ??? ?如果你没有对数据进行分组,整张表默认为一组。
第一点:分组函数自动忽略NULL,你不需要提前对NULL进行处理。
第二点:分组函数中count(*)和count(具体字段)有什么区别?
count(具体字段):表示统计该字段下所有不为NULL的元素的总数。 ?? ??? ??? ?count(*):统计表当中的总行数。(只要有一行数据count则++) ?? ??? ??? ??? ??? ??? ?因为每一行记录不可能都为NULL,一行数据中有一列不为NULL,则这行数据就是有效的。
9.分组查询
书写顺序,执行顺序
?
?分组函数不能直接使用在where后面,因为分组函数在使用的时候必须先分组之后才能使用。 ?where执行的时候,还没有分组。所以where后面不能出现分组函数。
在一条select语句当中,如果有group by语句的话,select后面只能跟:参加分组的字段,以及分组函数。其它的一律不能跟。
having
使用having可以对分完组之后的数据进一步过滤。having不能单独使用,having不能代替where,having必须和group by联合使用。使用having可以对分完组之后的数据进一步过滤having不能单独使用,having不能代替where,having必须和group by联合使用。.
where和having,优先选择where,where实在完成不了了,再选择having。
10.总结
|