数据查询语言(凡是带有select关键字的都是查询语言)
Select…
1.简单查询,查询一个字段:
Select 字段名 from 表名;
Select和from:关键字
字段名和表名:标识符(可改)
2.查询两个或多个字段:
以,隔开;
mysql> select deptno,dname from dept;
+--------+------------+
| deptno | dname |
+--------+------------+
| 10 | ACCOUNTING |
| 20 | RESEARCH |
| 30 | SALES |
| 40 | OPERATIONS |
3.查询全表信息:
mysql> select * from dept;
效率低,可读性差,不建议
+--------+------------+----------+
| DEPTNO | DNAME | LOC |
+--------+------------+----------+
| 10 | ACCOUNTING | NEW YORK |
| 20 | RESEARCH | DALLAS |
| 30 | SALES | CHICAGO |
| 40 | OPERATIONS | BOSTON |
mysql> select deptno,dname,loc from dept;
实际开发中建议讲*写成字段的形式。
+--------+------------+----------+
| deptno | dname | loc |
+--------+------------+----------+
| 10 | ACCOUNTING | NEW YORK |
| 20 | RESEARCH | DALLAS |
| 30 | SALES | CHICAGO |
| 40 | OPERATIONS | BOSTON |
+--------+------------+----------+、
4.查询的列起别名:
给查询结果的列重命名?
select ename,sal * 12 as yearsal from emp;
其中的as可省略。
别名中有中文?
select ename,sal * 12 as 年薪 from emp; // 错误
select ename,sal * 12 as '年薪' from emp;
注意:标准sql语句中要求字符串使用单引号括起来。虽然mysql支持双引号,尽量别用。
查询的字段中可以使用数学表达式:(as不改变原列名)
mysql> select ename as '姓名',sal*12 as '年薪' from emp;
+--------+----------+
| 姓名 | 年薪 |
+--------+----------+
| SMITH | 9600.00 |
| ALLEN | 19200.00 |
| WARD | 15000.00 |
| JONES | 35700.00 |
| MARTIN | 15000.00 |
| BLAKE | 34200.00 |
| CLARK | 29400.00 |
| MILLER | 15600.00 |
5.条件查询:
查询显示符合条件的数据;
Select 字段,字段 from 表名 where 条件;
执行顺序:先from,然后where,最后select
Between … and …
闭区间,其包括两端的值,必须遵循左大右小的原则,否则报错!
数据库中null不能使用等号进行衡量,需要使用is null
Null 代表啥也没有,不是值,无法用等号衡量。
and和or联合起来用:先执行and后执行or。
select
ename,sal,deptno
from
emp
where
sal > 1000 and deptno = 20 or deptno = 30; // 错误的
select
ename,sal,deptno
from
emp
where
sal > 1000 and (deptno = 20 or deptno = 30); // 正确的。
注意:当运算符的优先级不确定的时候加小括号。
in等同于or:in不是一个区间,in后面跟着一个具体的值。
select ename,job from emp where job = 'SALESMAN' or job = 'MANAGER';
select ename,job from emp where job in('SALESMAN', 'MANAGER');
select ename,job from emp where sal in(800, 5000);
// in后面的值不是区间,是具体的值。
+-------+-----------+
| ename | job |
+-------+-----------+
| SMITH | CLERK |
| KING | PRESIDENT |
+-------+-----------+
not in: 不在这几个值当中。
select ename,job from emp where sal not in(800, 5000);
模糊查询:like支持%或下划线匹配
%匹配任意多个字符
_任意一个字符
(%和_都属于一个特殊的字符)
select name from t_user where name like '%_%'; //错误
select name from t_user where name like '%\_%'; //正确
使用/_转义特殊字符
- 排序(升序、降序)
select
ename,sal
from
emp
order by
sal;
默认是升序!!!
注意:默认是升序。怎么指定升序或者降序呢?asc表示升序,desc表示降序。
select ename , sal from emp order by sal; // 升序
select ename , sal from emp order by sal asc; // 升序
select ename , sal from emp order by sal desc; // 降序。
按照工资的降序排列,当工资相同的时候再按照名字的升序排列。
select ename,sal from emp order by sal desc;
select ename,sal from emp order by sal desc , ename asc;
注意:越靠前的字段越能起到主导作用。只有当前面的字段无法完成排序的时候,才会启用后面的字段。
关键字顺序不能变!!!
select
字段 第三步
from
表名 第一步
where
条件 第二步
order by
.... 第四步
order by是最后执行的。
-
数据处理函数:
数据处理函数又称单行处理函数。
特点:一个输入对应一个输出
trim()去两边, LTRIM()去左边,RTRIM()去右边
Concat(字符串1,字符串2)函数:用来拼接字符串
Substr()取子串起始下标是由1开始
mysql的字符串转日期的函数用法_order by 字符串日期-CSDN博客
Str_to_date 字符串转日期
Date_format 日期转换成具有一定格式的字符串
MySQL format()函数_mysql format函数-CSDN博客
格式化数字: format(数字,‘格式’);
mysql> select ename,format(sal,'$999,999') as sal from emp;
Rand()函数生成0——1之间的随机数
下面的脚本使用 DATE_FORMAT() 函数来显示不同的格式。我们使用 NOW() 来获得当前的日期/时间:
DATE_FORMAT(NOW(),’%b %d %Y %h:%i %p’)
DATE_FORMAT(NOW(),’%m-%d-%Y’)
DATE_FORMAT(NOW(),’%d %b %y’)
DATE_FORMAT(NOW(),’%d %b %Y %T:%f’)
结果类似:
Dec 29 2018 11:45 PM
12-29-2018
29 Dec 18
29 Dec 2018 16:25:46.635
select
ename,job,sal,
(case job when 'manager' then sal*1.1when 'salesman' then sal*1.5 else sal end)
as result
from
emp;
相对函数叫做多行处理函数。
特点:多个输入对应一个输出,输入多行,输出单行
count 计数
sum 求和
avg 平均值
max 最大值
min 最小值
分组查询group by
- 分组函数自动忽略NULL,无需提前处理NULL!
- 分组函数中count(*)和count(具体字段)的区别?
-
分组函数不能直接使用在where子句中
- 分组查询******非常重要
Select…(字段)
from…(表名)
where….(条件)
group by…(分组查询,某个字段)having…(条件)
order by…(排序)
能使用where过滤掉的,先用where。
Where和having,优先选择where,where实在完成不了再考虑having
-
把查询结果去除重复记录distinct
去重关键字:Distinct
注意:原表数据不会被修改,只是查询结果去重
基本语句: