[TOC]
一、数据库
什么是数据库?什么是数据库管理系统?什么是SQL?他们之间的关系是什么?
1 | 数据库: |
简要来说就是程序猿通过sql语句–>操控DBMS—->操作数据库
二、SQL
- 三者之间的简要关系
1 | 程序员需要学习SQL语句,程序员通过编写SQL语句,然后DBMS负责执行SQL语句,最终来完成数据库中数据的增删改查操作。 |
SQL语句的分类
- DQL:
数据查询语言(凡是带有select关键字的都是查询语句)
select… - DML:
数据操作语言(凡是对表当中的数据进行增删改的都是DML)
insert delete update
insert 增
delete 删
update 改
这个主要是操作表中的数据data。 - DDL:
数据定义语言
凡是带有create、drop、alter的都是DDL。
DDL主要操作的是表的结构。不是表中的数据。
create:新建,等同于增
drop:删除
alter:修改
这个增删改和DML不同,这个主要是对表结构进行操作。 - TCL:
是事务控制语言
包括:
事务提交:commit;
事务回滚:rollback; - DCL:
是数据控制语言。
例如:授权grant、撤销权限revoke….
- DQL:
MySQL常用命令
查看当前的mysql数据库版本
- select version();
登入账号
- mysql -u root -p
查看mysql中有哪些数据库 : show databases;
#注意:以分号结尾,分号是英文的分号。
1
2
3
4
5
6
7
8
9
10
11mysql> show databases
-> ;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.01 sec)选择使用某个数据库:。
- mysql> use mysql;
- Database changed 表示正在使用一个名字叫做test的数据库。
- mysql> use mysql;
创建数据库
- create databases xxxxx
- show databases
查看某个数据库下有哪些表
- show tables
- *必须选择了某个数据库后才能使用
查看当前选择的数据库
- select database();
查看表的结构
- ```mysql
mysql> desc servers;
+————-+———–+——+—–+———+——-+
| Field | Type | Null | Key | Default | Extra |
+————-+———–+——+—–+———+——-+
| Server_name | char(64) | NO | PRI | | |
| Host | char(255) | NO | | | |
| Db | char(64) | NO | | | |
| Username | char(64) | NO | | | |
| Password | char(64) | NO | | | |
| Port | int | NO | | 0 | |
| Socket | char(64) | NO | | | |
| Wrapper | char(64) | NO | | | |
| Owner | char(64) | NO | | | |
+————-+———–+——+—–+———+——-+
9 rows in set (0.02 sec)1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
9. 导入.sql文件
1. 需要创建一个数据库 create database xxxx;
2. 选中该数据库 use xxxx;
3. source + 路径 ==不需要;==
10. 终止上一条语句
1. \c
2. Ctrl +cz
11. 退出mysql
1. exit
12. 备份与恢复
```sql
备份--> dos下执行
mysqldump -u 用户名 -p -B 数据库1 数据库2 > 路径/文件名
恢复数据库
Source 文件名.sql
- ```mysql
13.删除数据库
1
drop
三、数据库表
1 | 数据库当中最基本的单元是表:table |
简单查询
select 字段名 from 表名;
# 其中要注意:select和from都是关键字。
#字段名和表名都是标识符。
强调:对于SQL语句来说,是通用的,所有的SQL语句以“;”结尾。 SQL语句不区分大小写.
select * from 表名 表示查询所有数据
```mysql
mysql> select DNAME from dept;
+————+
| DNAME |
+————+
| ACCOUNTING |
| RESEARCH |
| SALES |
| OPERATIONS |
+————+
4 rows in set (0.00 sec)
查询多个字段,使用逗号隔开所要查询的字段,
- ````mysql
mysql> select DNAME,LOC from dept;
+————+———-+
| DNAME | LOC |
+————+———-+
| ACCOUNTING | NEW YORK |
| RESEARCH | DALLAS |
| SALES | CHICAGO |
| OPERATIONS | BOSTON |
+————+———-+
4 rows in set (0.00 sec)1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
3. 查询所有
1. 把所有字段都写上
2. 使用*
1. select * from 表名 表示查询所有数据
2. 缺点:
1. 效率低
2. 可读性差
3. 在实际开发中不建议.
------
2. 给查询列起别名
> 记住:select语句是永远都不会进行修改操作的。(因为只负责查询)
1. 给查询的列起别名:使用as关键字起别名。
1. ```mysql
mysql> select deptno,dname as deptname from dept;
+--------+------------+
| deptno | deptname |
+--------+------------+
| 10 | ACCOUNTING |
| 20 | RESEARCH |
| 30 | SALES |
| 40 | OPERATIONS |
+--------+------------+
2. 只是将显示结果列明显示为deptname,原表列名还是叫dname.
3. as可以省略,使用空格代替
4. 假设起名的时候,别名有空格怎么办
1. 使用单\双 引号括起来
2. 注意
1. 在所有的数据库中,字符串统一使用单引号括起来,==单引号==是标准,双引号在Oracle数据库中使用不了。但是在mysql中可以是使用
3. ```sql
mysql> select DNAME as 'test name' from dept;
+------------+
| test name |
+------------+
| ACCOUNTING |
| RESEARCH |
| SALES |
| OPERATIONS |
+------------+
4 rows in set (0.00 sec)
- ````mysql
列表计算
1. +-*/ ---> 字段\*1212 2. ```mysql
mysql> select ename,sal*12 as yearsal from emp;
+——–+———-+
| ename | yearsal |
+——–+———-+
| SMITH | 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 |
+——–+———-+
14 rows in set (0.00 sec)1
2
3
4
5
6
7
8
9
10
11
12
13
14
15---
5. 条件查询
1. 不是将表中所有数据都查出来。是查询出来符合条件的。
2. 查询语法格式
1. ```mysql
查询语法格式:
select
字段1,字段2,字段3....
from
表名
where
条件;3. 条件符号
插叙相等 =
- ```sql
字符
mysql> select empno,ename,sal from emp where ename = ‘smith’;
+——-+——-+——–+
| empno | ename | sal |
+——-+——-+——–+
| 7369 | SMITH | 800.00 |
+——-+——-+——–+
1 row in set (0.00 sec)1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
2.
2. 不等于<>(sql中特殊的) / !=
3. < 小于 <=小于等于 >大于, >=大于等于
4. 取区间
1. between ...... and............两个值中间
1. 必须遵循``左小右大``,否则什么都查不到
2. between两端都是==闭区间==
2. 以上等同------==> ==>= .....<=....==
3. ```sql
mysql> select empno,ename,sal from emp where sal between 800 and 2000;
+-------+--------+---------+
| empno | ename | sal |
+-------+--------+---------+
| 7369 | SMITH | 800.00 |
| 7499 | ALLEN | 1600.00 |
| 7521 | WARD | 1250.00 |
| 7654 | MARTIN | 1250.00 |
| 7844 | TURNER | 1500.00 |
| 7876 | ADAMS | 1100.00 |
| 7900 | JAMES | 950.00 |
| 7934 | MILLER | 1300.00 |
+-------+--------+---------+
8 rows in set (0.00 sec)
mysql> select empno,ename,sal from emp where sal >=800 and sal <=2000;
+-------+--------+---------+
| empno | ename | sal |
+-------+--------+---------+
| 7369 | SMITH | 800.00 |
| 7499 | ALLEN | 1600.00 |
| 7521 | WARD | 1250.00 |
| 7654 | MARTIN | 1250.00 |
| 7844 | TURNER | 1500.00 |
| 7876 | ADAMS | 1100.00 |
| 7900 | JAMES | 950.00 |
| 7934 | MILLER | 1300.00 |
+-------+--------+---------+
8 rows in set (0.00 sec)
- ```sql
==查询空值==
注意:在数据库中 null 不能使用等号进行衡量,需要使用 is null 来进行判断.因为数据库中的 null 代表什么也没有,它并不是一个值,所以不能使用等号衡量。
即这种写法是错误的
- select ename,empno,comm from emp where comm = null;
```sql
mysql> select ename,empno,comm from emp where comm is null;
+——–+——-+——+
| ename | empno | comm |
+——–+——-+——+
| SMITH | 7369 | NULL |
| JONES | 7566 | NULL |
| BLAKE | 7698 | NULL |
| CLARK | 7782 | NULL |
| SCOTT | 7788 | NULL |
| KING | 7839 | NULL |
| ADAMS | 7876 | NULL |
| JAMES | 7900 | NULL |
| FORD | 7902 | NULL |
| MILLER | 7934 | NULL |
+——–+——-+——+
10 rows in set (0.00 sec)1
2
3
4
5
6
7
8
9
10
11
12
13
14
7. ==查询非空值==
1. ```sql
mysql> select ename,empno,comm from emp where comm is not null;
+--------+-------+---------+
| ename | empno | comm |
+--------+-------+---------+
| ALLEN | 7499 | 300.00 |
| WARD | 7521 | 500.00 |
| MARTIN | 7654 | 1400.00 |
| TURNER | 7844 | 0.00 |
+--------+-------+---------+
4 rows in set (0.00 sec)
1. 并且 and
2. 或 or
一些问题
如果and 和or 同时出现,有优先级问题吗
查询工资大于2500,并且部门编号为10/20的员工
- ```sql
数据:
试验:
mysql> select ename,sal,deptno from emp where sal>2500 and deptno=20 or deptno=10;
+——–+———+——–+
| ename | sal | deptno |
+——–+———+——–+
| JONES | 2975.00 | 20 |
| CLARK | 2450.00 | 10 |
| SCOTT | 3000.00 | 20 |
| KING | 5000.00 | 10 |
| FORD | 3000.00 | 20 |
| MILLER | 1300.00 | 10 |
+——–+———+——–+
6 rows in set (0.00 sec)
× sql 会先执行and,即sal>2500,deptno=20,然后最后或deptn=10的,所以这里出现了sal小于2500的,但deptn=10的数据; 正确写法: 添加小括号 mysql> select ename,sal,deptno from emp where sal>2500 and (deptno=20 or deptno=10); +-------+---------+--------+ | ename | sal | deptno | +-------+---------+--------+ | JONES | 2975.00 | 20 | | SCOTT | 3000.00 | 20 | | KING | 5000.00 | 10 | | FORD | 3000.00 | 20 | +-------+---------+--------+ 4 rows in set (0.00 sec)
1
2
3
4
5
2. 有!!!需要添加小括号
1. ```sql
mysql> select ename,sal,deptno from emp where sal>2500 and (deptno=20 or deptno=10);- and和or同时出现,and优先级较高。如果想让or先执行,需要加小括号。
- ```sql
in 包含
in不是一个区间,in后面跟的是一个具体的值的合集。
mysql> select * from emp where deptno in(10,20);
不包含 not in
==模糊查询like==
模糊查询,支持%或_进行查询
- %代表任意多个字符(n个__)
- _代表任意一个字符
案例
找出名字中含有T的
mysql> select * from emp where ename like '%T%'; +-------+--------+----------+------+------------+---------+---------+--------+ | EMPNO | ENAME | JOB | MGR | HIREDATE | SAL | COMM | DEPTNO | +-------+--------+----------+------+------------+---------+---------+--------+ | 7369 | SMITH | CLERK | 7902 | 1980-12-17 | 800.00 | NULL | 20 | | 7654 | MARTIN | SALESMAN | 7698 | 1981-09-28 | 1250.00 | 1400.00 | 30 | | 7788 | SCOTT | ANALYST | 7566 | 1987-04-19 | 3000.00 | NULL | 20 | | 7844 | TURNER | SALESMAN | 7698 | 1981-09-08 | 1500.00 | 0.00 | 30 | +-------+--------+----------+------+------------+---------+---------+--------+ 4 rows in set (0.00 sec)
1
2
3
4
5
6
7
8
9
10
11
2. 以T结尾的
1. ```sql
mysql> select ename,job from emp where ename like '%T';
+-------+---------+
| ename | job |
+-------+---------+
| SCOTT | ANALYST |
+-------+---------+
1 row in set (0.00 sec)找出名字第三个为O的
- ```sql
mysql> select ename,job from emp where ename like ‘__O%’;
+——-+———+
| ename | job |
+——-+———+
| SCOTT | ANALYST |
+——-+———+
1 row in set (0.00 sec)1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
4. 找到名字中含有_的
1. 使用转义字符将_的本义去除
1. select name from student where like '%\_%'
15. 排序 order by
1. 语法格式
1. ```sql
select
ename,sal
from
emp
order by
sal desc;
desc:降序
asc:升序(默认)
- ```sql
多字段排序
- ```sql
以两个字段排序吗?或者说按照多个字段排序?
查询员工名字和薪资,要求按照薪资升序,如果薪资一样的话,再按照名字升序排列。
select
ename,sal
from
emp
order by
sal asc, ename asc; // sal在前,起主导,只有sal相等的时候,才会考虑启用ename排序。1
2
3
4
5
6
3. ~~按字段位置排序(不推荐)~~
1. ```sql
select ename,sal from emp order by 2;
按照表中第二个位置的字段进行排序,默认为升序
- ```sql
综合案例
从emp中查询ename和sal字段,并筛选出sal大于1000的字段,并降序处理
select -- from -- where -- order by -- mysql> select ename,sal from emp where sal>1000 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 | +--------+---------+ 12 rows in set (0.00 sec)
$$