MySQL基础命令用法
学习笔记
链接命令
mysql -uroot -p
然后输入密码即可
语句输入控制
MySQL输入SQL语句时,不见;
不会执行。只有输入;
才会执行之前输入的所有语句。
若是不想执行已经输入的语句可以\c
终止输入。此前输入的语句不会执行
显示全部表
show databases;
注意在MySQL中所有的指令都需要;
,并且不区分大小写。链接命令不需要是因为还没有进入MySQL
使用某个数据库
use databaseName;
创建数据库
create database databaseName;
数据库中显示库内的全部表
show tables;
导入脚本数据
source .sql文件位置
注意:此处需要绝对地址并且不能有中文
也可以通过这个脚本来导入
show databeses;
use bjpowernode;
create table dept(
deptno int(10) primary key,
dname varchar(14),
loc varchar(13));
create table salgrade(
grade int(11),
losal int(11),
hisal int(11) );
create table emp(
empno int(4) primary key,
ename varchar(10),
job varchar(9),
mgr int(4),
hiredate date,
sal double(7,2),
comm double(7,2),
deptno int(2) );
#插入表中的数据
insert into dept(deptno,dname,loc) values(10,'ACCOUNTING','NEW YORK');
insert into dept(deptno,dname,loc) values(20,'RESEARCHING','DALLAS');
insert into dept(deptno,dname,loc) values(30,'SALES','CHICAGO');
insert into dept(deptno,dname,loc) values(40,'OPERATIONS','BOSTON');
insert into salgrade(grade,losal,hisal) values(1,700,1200);
insert into salgrade(grade,losal,hisal) values(2,1201,1400);
insert into salgrade(grade,losal,hisal) values(3,1401,2000);
insert into salgrade(grade,losal,hisal) values(4,2001,3000);
insert into salgrade(grade,losal,hisal) values(5,3001,5000);
insert into emp(empno,ename,job,mgr,hiredate,sal,comm,deptno) values(7369,'SIMITH','CLERK',7902,'1980-12-17',800,null,20);
insert into emp(empno,ename,job,mgr,hiredate,sal,comm,deptno) values(7499,'ALLEN','SALESMAN',7698,'1981-02-20',1600,300,30);
insert into emp(empno,ename,job,mgr,hiredate,sal,comm,deptno) values(7521,'WARD','SALESMAN',7698,'1981-02-22',1250,500,30);
insert into emp(empno,ename,job,mgr,hiredate,sal,comm,deptno) values(7566,'JONES','MANAGER',7839,'1981-04-02',2975,null,20);
insert into emp(empno,ename,job,mgr,hiredate,sal,comm,deptno) values(7654,'MARTIN','SALESMAN',7698,'1981-09-28',1250,1400,30);
insert into emp(empno,ename,job,mgr,hiredate,sal,comm,deptno) values(7698,'BLAKE','MANAGER',7839,'1981-05-01',2850,null,30);
insert into emp(empno,ename,job,mgr,hiredate,sal,comm,deptno) values(7782,'CLARK','MANAGER',7839,'1981-06-09',2450,null,10);
insert into emp(empno,ename,job,mgr,hiredate,sal,comm,deptno) values(7788,'SCOTT','ANALYST',7566,'1987-04-19',3000,null,20);
insert into emp(empno,ename,job,mgr,hiredate,sal,comm,deptno) values(7839,'KING','PRESIDENT',null,'1981-11-17',5000,null,10);
insert into emp(empno,ename,job,mgr,hiredate,sal,comm,deptno) values(7844,'TURNER','SALESMAN',7698,'1981-09-08',1500,null,30);
insert into emp(empno,ename,job,mgr,hiredate,sal,comm,deptno) values(7876,'ADAMS','CLERK',7788,'1987-05-23',1100,null,20);
insert into emp(empno,ename,job,mgr,hiredate,sal,comm,deptno) values(7900,'JAMES','CLERK',7698,'1981-12-03',950,null,30);
insert into emp(empno,ename,job,mgr,hiredate,sal,comm,deptno) values(7902,'FORD','ANALYST',7566,'1981-12-03',3000,null,20);
insert into emp(empno,ename,job,mgr,hiredate,sal,comm,deptno) values(7934,'MILLER','CLERK',7782,'1982-01-23',1300,null,10);
select * from dept;select * from salgrade;select * from emp;
导入后表单如下:
+-----------------------+
| Tables_in_bjpowernode |
+-----------------------+
| dept //部门表 |
| emp //员工表 |
| salgrade //工资等级表|
+-----------------------+
+--------+-------------+----------+
| deptno | dname | loc |
+--------+-------------+----------+
| 10 | ACCOUNTING | NEW YORK |
| 20 | RESEARCHING | DALLAS |
| 30 | SALES | CHICAGO |
| 40 | OPERATIONS | BOSTON |
+--------+-------------+----------+
+-------+-------+-------+
| grade | losal | hisal |
+-------+-------+-------+
| 1 | 700 | 1200 |
| 2 | 1201 | 1400 |
| 3 | 1401 | 2000 |
| 4 | 2001 | 3000 |
| 5 | 3001 | 5000 |
+-------+-------+-------+
+-------+--------+-----------+------+------------+---------+---------+--------+
| empno | ename | job | mgr | hiredate | sal | comm | deptno |
+-------+--------+-----------+------+------------+---------+---------+--------+
| 7369 | SIMITH | CLERK | 7902 | 1980-12-17 | 800.00 | NULL | 20 |
| 7499 | ALLEN | SALESMAN | 7698 | 1981-02-20 | 1600.00 | 300.00 | 30 |
| 7521 | WARD | SALESMAN | 7698 | 1981-02-22 | 1250.00 | 500.00 | 30 |
| 7566 | JONES | MANAGER | 7839 | 1981-04-02 | 2975.00 | NULL | 20 |
| 7654 | MARTIN | SALESMAN | 7698 | 1981-09-28 | 1250.00 | 1400.00 | 30 |
| 7698 | BLAKE | MANAGER | 7839 | 1981-05-01 | 2850.00 | NULL | 30 |
| 7782 | CLARK | MANAGER | 7839 | 1981-06-09 | 2450.00 | NULL | 10 |
| 7788 | SCOTT | ANALYST | 7566 | 1987-04-19 | 3000.00 | NULL | 20 |
| 7839 | KING | PRESIDENT | NULL | 1981-11-17 | 5000.00 | NULL | 10 |
| 7844 | TURNER | SALESMAN | 7698 | 1981-09-08 | 1500.00 | NULL | 30 |
| 7876 | ADAMS | CLERK | 7788 | 1987-05-23 | 1100.00 | NULL | 20 |
| 7900 | JAMES | CLERK | 7698 | 1981-12-03 | 950.00 | NULL | 30 |
| 7902 | FORD | ANALYST | 7566 | 1981-12-03 | 3000.00 | NULL | 20 |
| 7934 | MILLER | CLERK | 7782 | 1982-01-23 | 1300.00 | NULL | 10 |
+-------+--------+-----------+------+------------+---------+---------+--------+
其中dep为部门表
emp为员工表
salgrade为工资等级表
查看表中数据
select * from tableName;
那么就会得到上面的那个全部表中数据
而如果我们用
desc tableName;
那么将会得到
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| deptno | int | NO | PRI | NULL | |
| dname | varchar(14) | YES | | NULL | |
| loc | varchar(13) | YES | | NULL | |
+--------+-------------+------+-----+---------+-------+
这表示了整张表的结构
desc表示describe,描述,当然也可以用describe查询
简单查询表数据
select 字段名 from 表名;
例如:我要查询部门的名字,就可以直接:
select dname from dept;
结果:
+-------------+
| dname |
+-------------+
| ACCOUNTING |
| RESEARCHING |
| SALES |
| OPERATIONS |
+-------------+
那么若果我要查询两个甚至多个字段怎么办:
select deptno,dname from dept;
注意使用,
隔开
当需要查询所有字段,就用*
表示。在SQL语句中*
可以表示所有。不过使用*
实际上是系统自动将星号转换成所有字段名。因此效率较低、可读性差。追求性能时不要用
给查询的字段起别名
可以在查询时使用as
关键字为某个字段起一个便于读懂的别名。这项操作不会影响到数据库中实际字段变化。
注意:select语句只负责查询,是不会进行任何修改操作的
select deptno,dname as departmentName from dept;
//或
select deptno,dname departmentName from dept;
//或
select deptno,dname as 'department Name' from dept;//当别名中有空格时,用单引号括起来。SQL中最好用单引号而非双引号
结果如下:
| deptno | departmentName |
+--------+----------------+
| 10 | ACCOUNTING |
| 20 | RESEARCHING |
| 30 | SALES |
| 40 | OPERATIONS |
+--------+----------------+
除此之外,我们还可以对字段内的数据起别名。比如现在我要获取员工的年薪,但是数据库内只有月薪
select ename,sal*12 as yearSal from emp;
| ename | yearSal |
+--------+----------+
| SIMITH | 9600.00 |
| ALLEN | 19200.00 |
| WARD | 15000.00 |
| JONES | 35700.00 |
| MARTIN | 15000.00 |
| BLAKE | 34200.00 |
| CLARK | 29400.00 |
| SCOTT | 36000.00 |
| KING | 60000.00 |
| TURNER | 18000.00 |
| ADAMS | 13200.00 |
| JAMES | 11400.00 |
| FORD | 36000.00 |
| MILLER | 15600.00 |
+--------+----------+
perfect
最后重申一下,
select
不会对数据进行修改,只是影响了输入的结果,类似于障眼法
条件查询
简单查询往往只能查询某个字段中的全部数据,而我们经常只需要查询其中部分符合条件的数据。因此需要条件查询
select
字段1,字段2,字段3....
from
表名
where
条件
;
条件表达式有很多,除了最通用的=、<、>、!=等,还有:
-
between… and…介于两者之间,等同于>=and <=
-
is null 是否为空
-
and 、or 并且和或者
-
in 包含相当于多个or
-
not 取非
-
like 模糊查询
-
% 匹配任意字符
-
下划线 匹配一个字符
基本判断符
这个没啥好说的
示例:查询薪资大于等于2000的员工姓名和编号
select empno ,ename from emp where sal>=2000;
and和or
直接看示例:查询薪资大于等于2000并且工作岗位为’manager’的员工
select empno,ename from emp where sal>2000 and job='manager';
或:查询工作岗位为manager或salesman的员工
select empno,ename from emp where job='salesman' or job='manager';
但是,当and和or同时出现,就有一个优先级的的问题
示例:若我们现在要查询工资大于2500,并且部门编号为10或20的员工。
如果我们这么写
select empno,ename,sal, deptno from emp where deptno=10 or deptno=20 and sal>2500 ;
结果为:
+-------+--------+---------+--------+ | empno | ename | sal | deptno | +-------+--------+---------+--------+ | 7369 | SIMITH | 800.00 | 20 | | 7566 | JONES | 2975.00 | 20 | | 7788 | SCOTT | 3000.00 | 20 | | 7839 | KING | 5000.00 | 10 | | 7876 | ADAMS | 1100.00 | 20 | | 7902 | FORD | 3000.00 | 20 | +-------+--------+---------+--------+
仔细对照,显然有很多部门编号为20的员工并不符合薪资大于2500的要求。所以上述这行命令执行起来等价于
select empno,ename,sal, deptno from emp where deptno=10 or (deptno=20 and sal>2500) ;
这显然不是我们想要的,但是也证明了,实际上
and
的优先级是要高于or
的因此,为得到正确的结果,我们可以这样写:
select empno,ename,sal, deptno from emp where (deptno=10 or deptno=20) and sal>2500 ;
正确结果为:
+-------+-------+---------+--------+ | empno | ename | sal | deptno | +-------+-------+---------+--------+ | 7566 | JONES | 2975.00 | 20 | | 7788 | SCOTT | 3000.00 | 20 | | 7839 | KING | 5000.00 | 10 | | 7902 | FORD | 3000.00 | 20 | +-------+-------+---------+--------+
in
in
表示包含,相当于多个or
在上面的or中的示例里。我们查询了工作岗位为manager或salesman的员工
这个问题也可以用
in
解决select empno,ename,job from emp where job in ('manager','salesman');
注意:in后跟的是具体值,不能是区间,需要区间的会在between and里实现
not
取非,常用于
is
或in
中,比如is not null
和not in
。比如上面那个例子的反面:select empno,ename,job from emp where job not in ('manager','salesman');
like 模糊查询
like
支持%
或__
匹配(可以理解为占位)%
可以匹配任意多的字符,而下划线__
只能匹配一个字符示例:找出员工中名字含有
O
的select empno,ename,job from emp where ename like '%O%';
+-------+-------+---------+ | empno | ename | job | +-------+-------+---------+ | 7566 | JONES | MANAGER | | 7788 | SCOTT | ANALYST | | 7902 | FORD | ANALYST | +-------+-------+---------+
特别提示,对于
'%O%'
,数据库会认为即便是以O
开头或结尾也符合条件。
示例2:找出名字以T为结尾的员工
select empno,ename,job from emp where ename like '%T';
+-------+-------+---------+
| empno | ename | job |
+-------+-------+---------+
| 7788 | SCOTT | ANALYST |
+-------+-------+---------+
特别提示:这时,名字中也有T但不是结尾的就无法通过筛选了。可以用正则表达式的理念进行理解
示例3:找出名字第二个字母为A
的员工
select empno,ename,job from emp where ename like '_A%';
那么,假如现在表内某个人的名字中有下划线或是%
,我们需要找出这些人,如何去做?
其实用转义字符\
即可
select empno,ename,job from emp where ename like '%\_%';
条件查询结束
排序
order by 排序
select
ename,sal
from
emp
order by
sal;
+--------+---------+
| ename | sal |
+--------+---------+
| SIMITH | 800.00 |
| JAMES | 950.00 |
| ADAMS | 1100.00 |
| WARD | 1250.00 |
| MARTIN | 1250.00 |
| MILLER | 1300.00 |
| TURNER | 1500.00 |
| ALLEN | 1600.00 |
| CLARK | 2450.00 |
| BLAKE | 2850.00 |
| JONES | 2975.00 |
| SCOTT | 3000.00 |
| FORD | 3000.00 |
| KING | 5000.00 |
+--------+---------+
显然,默认状态下,order by
是一个升序排列。
若要人为限定升序或降序排列,我们只需要在order by
后面的指定字段后加一个ascend
(升序)或descend
(降序)。通常简写为asc
和desc
。
select ename,sal from emp order by sal desc;
+--------+---------+
| ename | sal |
+--------+---------+
| KING | 5000.00 |
| SCOTT | 3000.00 |
| FORD | 3000.00 |
| JONES | 2975.00 |
| BLAKE | 2850.00 |
| CLARK | 2450.00 |
| ALLEN | 1600.00 |
| TURNER | 1500.00 |
| MILLER | 1300.00 |
| WARD | 1250.00 |
| MARTIN | 1250.00 |
| ADAMS | 1100.00 |
| JAMES | 950.00 |
| SIMITH | 800.00 |
+--------+---------+
order by
也可以同时按照两个甚至更多字段进行排序。但是会有优先级区别
比如下面这个示例:按照薪资升序排列,当薪资相同时,再按照名字升序排列
select
ename,sal
from
emp
order by
sal asc,ename asc;
综合案例:找出薪资在1250-3000之间的,要求按照薪资降序排列(当薪资相等时按名字升序排列)
select
ename,sal
from
emp
where
sal between 1250 and 3000
order by
sal desc,ename asc;
| ename | sal |
+--------+---------+
| FORD | 3000.00 |
| SCOTT | 3000.00 |
| JONES | 2975.00 |
| BLAKE | 2850.00 |
| CLARK | 2450.00 |
| ALLEN | 1600.00 |
| TURNER | 1500.00 |
| MILLER | 1300.00 |
| MARTIN | 1250.00 |
| WARD | 1250.00 |
+--------+---------+
特别提醒:以上关键字书写顺序不能乱。但是关键字间的执行顺序并不是按照书写顺序排的。
执行顺序为:from、where、select、order by
数据处理函数
单行处理函数
-
单行处理函数顾名思义,就一行。那么他的特点就是:一个输入对应一个输出
-
多行处理函数:与单行相对应,多个输入,一个输出
这里的输入,指的是数据库数据输入函数中。函数类似于java中的方法
常见的单行处理函数:
- lower 转小写
- upper 转大写
- substr 取子串
分组查询
分组查询主要有两个语句:
- group by
- having