数据库:英文单词DataBase,简称DB。按照一定格式存储数据的一些文件的组合。
顾名思义:存储数据的仓库,实际上就是一堆文件。这些文件中存储了具有特定格式的数据。
数据库管理系统:DataBaseManagement,简称DBMS。
数据库管理系统是专门用来管理数据库中数据的,数据库管理系统可以对数据库当中的数据进行增删改查。
常见的数据库管理系统:MySQL、Oracle、MS SqlServer、DB2、sybase等....
SQL:结构化查询语言。程序员需要学习SQL语句,程序员通过编写SQL语句,然后DBMS负责执行SQL语句,最终来完成数据库中数据的增删改查操作。
SQL是一套标准,程序员主要学习的就是SQL语句,这个SQL在mysql中可以使用,同时在OraC++le中也可以使用,在DB2中也可以使用。
它们的关系:DBMS--执行--> SQL --操作--> DB
需要注意的事项?
mysql数据库启动的时候,这个服务占有的默认端口号是3306。记住。
字符编码方式?设置mysql数据库的字符编码方式为 UTF8
服务名称?默认是:MySQL不用改。
mysql超级管理员用户名不能改,一定是:root
需要设置mysql数据库超级管理员的密码。
// 配置好环境变量后可以通过cmd窗口进行数据库的连接
mysql -uroot -p
>>enter your password:
exit
show databases;
// mysql 自带四个数据库
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
+--------------------+
use test;
// 表示正在使用一个名字叫做test的数据库
create database test;
show tables;
mysql> select version();
+-----------+
| version() |
+-----------+
| 8.0.40 |
+-----------+
1 row in set (0.00 sec)
mysql> select database();
+------------+
| database() |
+------------+
| test |
+------------+
1 row in set (0.00 sec)
// 查看table1的数据
select * from table1;
// 查看table1的数据 describe -> desc
desc table1;
exit
0
exit
1
exit
2
这种方式的缺点:
在实际开发中不建议,可以自己玩没问题。你可以在DOS命令窗口中想快速的看一看全表数据可以采用这种方式。
exit
3
使用as关键字起别名。
注意:只是将显示的查询结果列名显示为deptname,原表列名还是叫:dname
住:select语句是永远都不会进行修改操作的。(因为只负责查询)
as关键字可以省略吗?可以的
exit
4
假设起别名的时候,别名里面有空格,怎么办?
exit
5
DBMS看到这样的语句,进行SQL语句的编译,不符合语法,编译报错。
怎么解决?
exit
6
注意:在所有的数据库当中,字符串统一使用单引号括起来,单引号是标准,双引号在oracle数据库中用不了。但是在mysql中可以使用。
再次强调:数据库中的字符串都是采用单引号括起来。这是标准的。双引号不标准。
数据库当中最基本的单元是表
什么是表table?为什么用表来存储数据呢?
姓名 性别 年龄(列:字段)
张三 男 20 ------->行(记录)
李四 女 21 ------->行(记录)
王五 男 22 ------->行(记录)
数据库当中是以表格的形式表示数据的。因为表比较直观。
任何一张表都有行和列:
了解一下:
exit
7
SQL语句有很多,最好进行分门别类,这样更容易记忆。
分为:
DQL(Data Query Language):
数据查询语言(凡是带有select关键字的都是查询语句)
select...
DML(Data Manipulate Language):
数据操作语言(凡是对表当中的数据进行增删改的都是DML)
insert delete update
insert 增
delete 删
update 改
这个主要是操作表中的数据data。
DCL(Data Control Language):
是数据控制语言。
例如:授权grant、撤销权限revoke....
什么是条件查询?
不是将表中所有数据都查出来。是查询出来符合条件的。
exit
8
exit
9
show databases;
// mysql 自带四个数据库
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
+--------------------+
0
show databases;
// mysql 自带四个数据库
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
+--------------------+
1
show databases;
// mysql 自带四个数据库
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
+--------------------+
2
show databases;
// mysql 自带四个数据库
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
+--------------------+
3
show databases;
// mysql 自带四个数据库
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
+--------------------+
4
show databases;
// mysql 自带四个数据库
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
+--------------------+
5
show databases;
// mysql 自带四个数据库
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
+--------------------+
6
show databases;
// mysql 自带四个数据库
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
+--------------------+
7
show databases;
// mysql 自带四个数据库
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
+--------------------+
8
show databases;
// mysql 自带四个数据库
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
+--------------------+
9
use test;
// 表示正在使用一个名字叫做test的数据库
0
and和or同时出现的话,有优先级问题吗?
use test;
// 表示正在使用一个名字叫做test的数据库
1
分析以上语句的问题?
and优先级比or高。
以上语句会先执行and,然后执行or。
以上这个语句表示什么含义?
找出工资大于2500并且部门编号为10的员工,或者20部门所有员工找出来。
use test;
// 表示正在使用一个名字叫做test的数据库
2
and和or同时出现,and优先级较高。如果想让or先执行,需要加“小括号”
以后在开发中,如果不确定优先级,就加小括号就行了。
use test;
// 表示正在使用一个名字叫做test的数据库
3
use test;
// 表示正在使用一个名字叫做test的数据库
4
not 可以取非,主要用在 is 或 in 中
is null
is not null
in
not in
称为模糊查询,支持%或下划线匹配
%匹配任意多个字符
下划线:任意一个字符。
(%是一个特殊的符号,_ 也是一个特殊符号)
use test;
// 表示正在使用一个名字叫做test的数据库
5
use test;
// 表示正在使用一个名字叫做test的数据库
6
use test;
// 表示正在使用一个名字叫做test的数据库
7
use test;
// 表示正在使用一个名字叫做test的数据库
8
use test;
// 表示正在使用一个名字叫做test的数据库
9
create database test;
0
根据字段的位置也可以排序
create database test;
1
按照查询结果的第2列sal排序。
了解一下,不建议在开发中这样写,因为不健壮。
因为列的顺序很容易发生改变,列顺序修改之后,2就废了。
create database test;
2
关键字顺序不能变:
select
...
from
...
where
...
order by
...create database test;
3
数据处理函数又被称为单行处理函数
单行处理函数的特点:一个输入对应一个输出。
和单行处理函数相对的是:多行处理函数。(多行处理函数特点:多个输入,对应1个输出!)
create database test;
4
create database test;
5
substr( 被截取的字符串, 起始下标,截取的长度)
create database test;
6
create database test;
7
create database test;
8
create database test;
9
show tables;
0
show tables;
1
show tables;
2
show tables;
3
结论:select后面可以跟某个表的字段名(可以等同看做变量名),也可以跟字面量/字面值(数据)。
show tables;
4
show tables;
5
show tables;
6
show tables;
7
show tables;
8
show tables;
9
多行处理函数的特点:输入多行,最终输出一行。
5个:
注意:
分组函数在使用的时候必须先进行分组,然后才能用。
如果你没有对数据进行分组,整张表默认为一组。
mysql> select version();
+-----------+
| version() |
+-----------+
| 8.0.40 |
+-----------+
1 row in set (0.00 sec)
0
mysql> select version();
+-----------+
| version() |
+-----------+
| 8.0.40 |
+-----------+
1 row in set (0.00 sec)
1
mysql> select version();
+-----------+
| version() |
+-----------+
| 8.0.40 |
+-----------+
1 row in set (0.00 sec)
2
mysql> select version();
+-----------+
| version() |
+-----------+
| 8.0.40 |
+-----------+
1 row in set (0.00 sec)
3
执行顺序是什么?
- from
- where
- group by
- select
- order by
为什么分组函数不能直接使用在where后面?
mysql> select version();
+-----------+
| version() |
+-----------+
| 8.0.40 |
+-----------+
1 row in set (0.00 sec)
4
因为分组函数在使用的时候必须先分组之后才能使用。
where执行的时候,还没有分组。所以where后面不能出现分组函数。
mysql> select version();
+-----------+
| version() |
+-----------+
| 8.0.40 |
+-----------+
1 row in set (0.00 sec)
5
这个没有分组,为啥sum()函数可以用呢?
因为select在group by之后执行。
mysql> select version();
+-----------+
| version() |
+-----------+
| 8.0.40 |
+-----------+
1 row in set (0.00 sec)
6
重点结论:
在一条select语句当中,如果有group by语句的话,select后面只能跟:1. 参加分组的字段;2. 分组函数。
其它的一律不能跟。
mysql> select version();
+-----------+
| version() |
+-----------+
| 8.0.40 |
+-----------+
1 row in set (0.00 sec)
7
mysql> select version();
+-----------+
| version() |
+-----------+
| 8.0.40 |
+-----------+
1 row in set (0.00 sec)
8
使用having可以对分完组之后的数据进一步过滤。
having不能单独使用,having不能代替where,having必须和group by联合使用。
mysql> select version();
+-----------+
| version() |
+-----------+
| 8.0.40 |
+-----------+
1 row in set (0.00 sec)
9
思考一个问题:以上的sql语句执行效率是不是低?
比较低,实际上可以这样考虑:先将大于3000的都找出来,然后再分组。
mysql> select database();
+------------+
| database() |
+------------+
| test |
+------------+
1 row in set (0.00 sec)
0
优化策略:
where和having,优先选择where,where实在完成不了了,再选择having
where没办法完成怎么办???
mysql> select database();
+------------+
| database() |
+------------+
| test |
+------------+
1 row in set (0.00 sec)
1
select
...
from
...
where
...
group by
...
having
...
order by
以上关键字只能按照这个顺序来,不能颠倒。
from
where
group by
having
select
order by
mysql> select database();
+------------+
| database() |
+------------+
| test |
+------------+
1 row in set (0.00 sec)
2