先来了解下mysq中几个常用命令
退出mysql:exit;
查看mysql中有哪些数据库?
show databases;
注意:以分号结尾,分号是英文的分号。
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
+--------------------+
mysql默认自带了4个数据库。
使用某个数据库
mysql> use test;
Database changed
表示正在使用一个名字叫做test的数据库。
创建数据库
mysql> create database bjpowernode;
Query OK, 1 row affected (0.00 sec)
查看某个数据库下有哪些表?
mysql> show tables;
查看mysql数据库的版本号:
mysql> select version();
查看当前使用的是哪个数据库?
mysql> select database();
mysql> show
->
-> \c
mysql>
\c用来终止一条命令的输入。
bjpowernode.sql 这个文件中是提前准备的数据库表。
怎么将sql文件中的数据导入呢?
mysql> source D:\course\03-MySQL\document\bjpowernode.sql(这是我的路径,改成你自己文件所在位置)
注意:路径中不要有中文!!!!
下面可以获取文件
链接:https://pan.baidu.com/s/182xf5PuvEbfMXnBal1w2IQ
提取码:java
这边需要注意你要使用哪个数据库中的表,你需要先使用这个数据库也就是use +数据库名
不然会报错!!!!!
关于导入的这几张表?
mysql> show tables;
+-----------------------+
| Tables_in_bjpowernode |
+-----------------------+
| dept |
| emp |
| salgrade |
+-----------------------+
dept是部门表
emp是员工表
salgrade 是工资等级表
怎么查看表中的数据呢?
select * from 表名; //统一执行这个SQL语句。
不看表中的数据,只看表的结构,有一个命令:
desc 表名;
简单查询
查询一个字段?
select 字段名 from 表名;
其中要注意:
select和from都是关键字。
字段名和表名都是标识符。
强调:
对于SQL语句来说,是通用的,
所有的SQL语句以“;”结尾。
另外SQL语句不区分大小写,都行。
查询部门名字?
mysql> select dname from dept;
+------------+
| dname |
+------------+
| ACCOUNTING |
| RESEARCH |
| SALES |
| OPERATIONS |
+------------+
4 rows in set (0.00 sec)
查询两个字段,或者多个字段怎么办?
使用逗号隔开“,”
查询部门编号和部门名?
select deptno,dname from dept;
+--------+------------+
| deptno | dname |
+--------+------------+
| 10 | ACCOUNTING |
| 20 | RESEARCH |
| 30 | SALES |
| 40 | OPERATIONS |
+--------+------------+
查询所有字段怎么办?
第一种方式:可以把每个字段都写上
select a,b,c,d,e,f... from tablename;
第二种方式:可以使用*
select * from dept;
这种方式的缺点:
1、效率低
2、可读性差。
给查询的列起别名?
mysql> select deptno,dname as deptname from dept;
as关键字可以省略
假设起别名的时候,别名里面有空格,怎么办?
select deptno,dname 'dept name' from dept; //加单引号
select deptno,dname "dept name" from dept; //加双引号
(如果需要起中文名也需要用单引号扩起来)
条件查询
什么是条件查询?
不是将表中所有数据都查出来。是查询出来符合条件的。
语法格式:
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 <=
注意:
使用between and的时候,必须遵循左小右大。
between and是闭区间,包括两端的值。
查询哪些员工的津贴/补助不为null?
select empno,ename,sal,comm from emp where comm is not null;
(这边不能用comm <> null这种表达方法)
注意:在数据库当中null不能使用等号进行衡量。需要使用is null
因为数据库中的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';
and和or同时出现的话,有优先级问题吗?
查询工资大于2500,并且部门编号为10或20部门的员工?
select
*
from
emp
where
sal > 2500 and deptno = 10 or deptno = 20;
分析以上语句的问题?
and优先级比or高。
以上语句会先执行and,然后执行or。(如果要避免这种情况可以用小括号解决优先级问题)
in 包含,相当于多个 or (not in 不在这个范围中)
查询工作岗位是MANAGER和SALESMAN的员工?
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后面跟的是具体的值
like
称为模糊查询,支持%或下划线匹配
%匹配任意多个字符
下划线:任意一个字符。
(%是一个特殊的符号,_ 也是一个特殊符号)
找出名字中含有O的?
mysql> select ename from emp where ename like '%O%';
找出名字以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 '%\_%'; // \转义字符。(需要转移字符)
排序
查询所有员工薪资,排序?
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, ename asc; // sal在前,起主导,只有sal相等的时候,才会考虑启用ename排序。
关键字顺序不能变:
select
...
from
...
where
...
order by
...
以上语句的执行顺序必须掌握:
第一步:from
第二步:where
第三步:select
第四步:order by(排序总是在最后执行!)
数据处理函数
数据处理函数又被称为单行处理函数
单行处理函数的特点:一个输入对应一个输出。
和单行处理函数相对的是:多行处理函数。(多行处理函数特点:多个输入,对应1个输出!)
单行处理函数
lower 转换小写
mysql> select lower(ename) as ename from emp;
14个输入,最后还是14个输出。这是单行处理函数的特点。
upper 转换大写
mysql> select * from t_student;
+----------+
| name |
+----------+
| zhangsan |
| lisi |
| wangwu |
| jack_son |
+----------+
mysql> 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.
concat函数进行字符串的拼接
select concat(empno,ename) from emp;
length 取长度
select length(ename) enamelength from emp;
trim 去空格(ltrim去左空格 rtrim去右空格)
mysql> select * from emp where ename = ' KING';
case..when..then..when..then..else..end
当员工的工作岗位是MANAGER的时候,工资上调10%,当工作岗位是SALESMAN的时候,工资上调50%,其它正常。
(注意:不修改数据库,只是将查询结果显示为工资上调)
select
ename,
job,
sal as oldsal,
(case job when 'MANAGER' then sal*1.1 when 'SALESMAN' then sal*1.5 else sal end) as newsal
from
emp;
round 四舍五入
select round(1236.567, 0) as result from emp; //保留整数位。
select round(1236.567, 1) as result from emp; //保留1个小数
select round(1236.567, 2) as result from emp; //保留2个小数
select round(1236.567, -1) as result from emp; // 保留到十位。
rand() 生成随机数
mysql> select round(rand()*100,0) from emp; // 100以内的随机数
ifnull 可以将 null 转换成一个具体值
ifnull是空处理函数。专门处理空的。
在所有数据库当中,只要有NULL参与的数学运算,最终结果就是NULL。
注意:NULL只要参与运算,最终结果一定是NULL。为了避免这个现象,需要使用ifnull函数。
ifnull函数用法:ifnull(数据, 被当做哪个值)
如果“数据”为NULL的时候,把这个数据结构当做哪个值。
补助为NULL的时候,将补助当做0
select ename, (sal + ifnull(comm, 0)) * 12 as yearsal from emp;
分组函数(多行处理函数)
多行处理函数的特点:输入多行,最终输出一行。
5个:
count 计数
sum 求和
avg 平均值
max 最大值
min 最小值
注意:
分组函数在使用的时候必须先进行分组,然后才能用。
如果你没有对数据进行分组,整张表默认为一组。
找出最高工资?
mysql> select max(sal) from emp;
计算工资和:
mysql> select sum(sal) from emp;
计算平均工资:
mysql> select avg(sal) from emp;
+-------------+
| avg(sal) |
+-------------+
| 2073.214286 |
+-------------+
14个工资全部加起来,然后除以14。
分组函数在使用的时候需要注意哪些?
第一点:分组函数自动忽略NULL,你不需要提前对NULL进行处理。
第二点:分组函数中count(*)和count(具体字段)有什么区别?
mysql> select count(*) from emp;
+----------+
| count(*) |
+----------+
| 14 |
+----------+
mysql> select count(comm) from emp;
+-------------+
| count(comm) |
+-------------+
| 4 |
+-------------+
count(具体字段):表示统计该字段下所有不为NULL的元素的总数。
count(*):统计表当中的总行数。(只要有一行数据count则++)
因为每一行记录不可能都为NULL,一行数据中有一列不为NULL,则这行数据就是有效的。
第三点:分组函数不能够直接使用在where子句中。
第四点:所有的分组函数可以组合起来一起用。
select sum(sal),min(sal),max(sal),avg(sal),count(*) from emp;
+----------+----------+----------+-------------+----------+
| sum(sal) | min(sal) | max(sal) | avg(sal) | count(*) |
+----------+----------+----------+-------------+----------+
| 29025.00 | 800.00 | 5000.00 | 2073.214286 | 14 |
+----------+----------+----------+-------------+----------+