数据库服务器(关系型数据库管理系统)
RDBMS = 管理员(manager) + 仓库(database)
database = N个table
table:-> 表结构:定义表的列名和列类型!
-> 标记录:一行一行的记录!
1. 什么是DBMS:数据的仓库
> 方便查询
> 可存储的数据量大
> 保证数据的完整、一致
> 安全可靠
2. DBMS的发展:今天主流数据库为关系型数据库管理系统(RDBMS 使用表格存储数据)
3. 常见DBMS:Orcale、MySQL、SQL Server、 DB2 、Sybase
4. DBMS = 管理程序 + 多个数据库(DB)
5. DB = 多个table(不只是table,但这里先不介绍其他组成部分)
6. table的结构(即表结构)和 table 的记录(即表记录)的区别!
7. 应用程序与DBMS:应用程序使得DBMS来存储数据!
服务器操作
1) 开启服务器(必须保证mysql为windows服务):net start mysql
> 查看进程表中是否存在:mysqld.exe进程(存在)
2) 关闭服务器(必须保证mysql为windows服务):net stop mysql
> 查看进程表中是否存在:mysqld.exe进程(不存在)
客户端操作(DOS命令)
1. 登录服务器:mysql -uroot -p123456 -hlocalhost
> -u:后面跟随用户名
> -p:后面跟随密码
> -h:后面跟随IP
2. 退出服务器:exit/quit
SQL
1. 什么是SQL:结构化查询语言(Structured Query Language)
2. SQL的作用:客户端使用SQL来操作服务器
> 启动mysql.exe,连接服务器后,就可以使用 sql 来操作服务器了
> 将来会使用 Java 程序连接服务器,然后使用 sql 来操作服务器
3. SQL标准(例如SQL99)
> 由国际标准组织(ISO)制定的,对DBMS的统一操作方法
4. SQL方言
> 某种DBMS不只支持SQL标准,而且还会有一些自己独有的语言
5. SQL语法
> SQL语句可以在单行或多行书写,以分号结尾
> 可以利用空格和缩进来增强语句的可读性
> 不区分大小写,关键字用大写
6. SQL语句分类(★★★)
> DDL:数据库或表的结构操作
> DML;对表的记录进行更新(增、删、改)
> DQL:对表的记录的查询
> DCL:对用户的创建,及授权!
DDL
1)数据库
* 查询当前所有数据库 ——> SHOW DATABASES;
* 切换(选择要操作的)数据库 ——> USE 数据库名;
* 创建数据库 ——> CREATE DATABASE [IF NOT EXISTS] 数据库名 [CHARSET = UTF8];
* 删除数据库 ——> DROP DATABASE [IF EXISTS] 数据库名;
* 修改数据库编码 ——> ALTER DATARASE 数据库名 CHARACTER SET utf8;
2)数据类型(列表型)
* int:整型
* double:浮点型 例如double(5,2)表示最多5位,其中小数两位,最大为999.99
* decimal:浮点型 该类型不会出现精度缺失问题
* char:固定长度字符串类型 -> char(255)
当数据长度不足指定长度,补足到指定长度
* varchar:可变长度字符串类型 -> varchar(65535)
* text(clob):字符串类型
* blob:字节类型
* date:日期类型,格式为:yyyy-MM-dd
* time:时间类型,格式为:hh:mm:ss
* timestamp:时间戳类型
3)表
* CREATE TABLE 表名(
列名 列类型,
列名 列类型,
....);
* 查看当前数据库中所有表名称:SHOW TABLES;
* 查看指定表的创建语句:SHOW CREATE TABLE 表名(了解);
* 查看表结构:DESC 表名;
* 删除表:DROP TABLE 表名;
* 修改表:前缀 —— ALTER TABLE 表名
> 修改之添加列:
ALTER TABLE 表名 ADD {
列名 列类型,
...
}
> 修改之修改列类型(如果被修改的列已存在数据,那么新的类型可能会影响到已存在的数据)
ALTER TABLE 表名 MODIFY 列名 列类型;
> 修改之修改列名:ALTER TABLE 表名 CHANGE 原创名 新列名 列类型;
> 修改之删除列:ALTER TABLE 表名 DROP 列名;
> 修改之修改表名称:ALTER TABLE 原表名 RENAME TO 新表名;
DML:数据库操作语言
1)插入数据
* INSERT INTO 表名(列名1,列名2,...) VALUES(列值1,列值2....);
> 在表名后给出要插入的列名,其他没有指定的列等同与插入null值
> 在VALUES 后给出列值,值的顺序和个数必须与前面指定的列对应
* INSERT INTO 表名 VALUES(列值1,列值2);
> 没有给出要插入的类,那么表示插入所有列
> 值的个数必须是该表列的个数
> 值的顺序,必须与表创建时给出的列的顺序相同
2)修改数据
* UPDATE 表名 SET 列名1 = 列值1,列名2 = 列值2, ...[WHERE 条件]
* 条件(条件可选的):
> 条件必须是一个 boolean 类型的值或者表达式。
> 运算符:= != <> > < <= >= BETWEEN...AND IN(...) IS NULL NOT OR AND
3)删除数据
* DELETE FROM 表名 [WHERE 条件];
DCL(理解即可)
* 一个项目创建一个用户!一个项目对应的数据库只有一个!
* 这个用户只能对这个数据库有权限,其他数据库你就操作不了!
1) 创建用户
* CREATE USER 用户名@IP地址 IDENTIFIED BY '密码';
> 用户只能在指定的IP地址上登录
* CREATE USER 用户名@'%' IDENTIFIED BY '密码';
> 用户可以在任意IP地址上登录
2)给用户授权
* GRANT 权限1,....,权限n ON 数据库.* TO 用户名@IP地址;
> 权限、用户、数据库
> 给用户分派在指定的数据库上的指定的权限
> 例如:GRANT CREATE,...,SELECT ON mydb1.* TO user1@localhost;
* 给用户分派在mydb1数据库上的CREATE,...,DELETE,SELECT权限
* GRANT ALL ON 数据库.* TO 用户名@IP地址;
> 给用户分派指定数据库上的所有权限
3)撤销授权
* REVOKE 权限1,....,权限n ON 数据库.* FROM 用户名@IP地址;
> 撤销指定用户在指定数据库上的操作权限
4)查看权限
* SHOW GRANTS FOR 用户名@IP地址;
> 查看指定用户的权限
5)删除用户
* DROP USER 用户名@IP地址;
DQL(数据查询语言):
1)查询所有列:
* SELECT * FROM 表名 --> 其中 * 表示查询所有列
2)查询指定列
* SELECT 列1,列2,... FROM 表名;
3)列运算
I.数量类型的列可以做加、减、乘、除运算
> SELECT 列元素*1.5 FROM 表名;
--> 如果列元素非数字类型,则值为0;若为NULL,无论是什么运算结果仍为null
II.字符串类型可以做连接
> SELECT CONCAT(列元素1, 列元素2) FROM 表名;
--> 列元素1和列元素2均为字符串或者字符类型
III.转换null值
> SELECT IFNULL(列元素, 0) + 1000 FROM 表名;
--> IFNULL(列元素, 0) 如果该列元素为null值,则当成0进行计算
IV.给列起别名
> SELECT 列元素1 as job, 列元素2.... FORM 表名;
--> 这里的as可以省略,其中job叫做列元素1的别名
4)条件查询
与前面介绍的UPDATE的DELETE语句一样,SELECT语句也可以使用WHERE子句来控制记录。
* SELECT 列元素1,列元素2... FROM 表名 WHERE 条件语句;
5)模糊查询
该查询有利于对数据名称不确定情况下的查询
* SELECT * FROM 表名 WHERE name like '张_' 查询名字两个字,且姓张的数据
* SELECT * FROM 表名 WHERE name like '_ _ _' 查询名字由三个字组成的数据
--> 模糊查询需要使用到运算符: like ,其中'_' 匹配一个字符 而'%'匹配0-n个字符!!!
* SELECT * FROM 表名 WHERE name like '张%' 查询姓张的数据
* SELECT * FROM 表名 WHERE name like '%小%' 查询名字中带有小字的数据
* SELECT * FROM 表名 WHERE name like '%' 等同于没有设立条件,名字为null的无法查询到
6)排序
I. SELECT * FROM 表名 ORDER BY 列元素 ASC; 按列元素进行升序排列
II. SELECT * FROM 表名 ORDER BY 列元素 DESC; 按列元素进行降序排列
III. SELECT * FROM 表名 ORDER BY 列元素1 ASC, 列元素2 DESC;
--> 先按列元素1进行升序排列,若列元素1数据相同的,再按列元素2进行降序排序
7)聚合函数
I. COUNT
SELECT COUNT(*) FROM 表名;
--> 计算该表中所有列的记录的行数(如果某列的记录均为null,不计入)
II. MAX/MIN
SELECT MAX(列元素) FROM 表名;
--> 查询该列元素最大值
SELECT MIN(列元素) FROM 表名;
--> 查询该列元素最小值
III. SUM
SELECT SUM(列元素) FROM 表名;
--> 查询该列元素的总和
IV. AVG
SELECT AVG(列元素) FROM 表名;
--> 查询该列元素的平均值
8)分组查询
把记录使用某一列进行分组,然后查询组信息。
例如:查看所有部门的记录数
SELECT deptno, COUNT(*) FROM emp GROUP BY deptno;
--> 使用deptno分组,查询部门编号和每个部门的记录数
SELECT job, MAX(SAL) FROM emp GROUP BY job;
--> 使用job分组,查询每种工作的最高工资
组条件
以部门分组,查询每组记录数。条件为记录数大于3
SELECT deptno, COUNT(*) FROM emp GROUP BY deptno HAVING COUNT(*) > 3;
9)limit 子句(方言)
LIMIT用来限定查询结果的起始行以及总行数
例如:查询起始行为第5行,一共查询3行记录
SELECT * FROM emp LIMIT 4, 3;
--> 其中4表示从第5行开始,其中3表示一共查询3行。
一页的记录数:10行, 查询第3页
SELECT * FROM emp LIMIT 20, 10;
--> (当前页-1) * 每页记录数
(3 - 1)*10 , 10
练习题: