数据库是用来存储和管理数据的仓库。
数据库存储数据的优先:
oracle:甲骨文(最高)
DB2:IBM
SQL server:微软
Sybase:赛尔斯
MySQL:甲骨文
我们现在所说的数据库泛指“关系型数据库管理系统”(RDBMS-Retational database management system),即“数据库服务器”。
安装数据库服务器后,就可以再数据库服务器中创建库,每个库中包含多张表。
数据库表是一个多行多列的表格,表格分两个层面:表结构与表记录;
在创建表时,需要指定表的列数、列名称、列类型等信息(不需指定行数,行数没有上限),下图是一个表结构:
创建表结构后,就能在表中以行为单位插入数据,叫表记录。
总结:
总结:
ddl:数据库或表的结构操作(***** )
dml:对表的记录进行更新(增删改)( ***** )
dql:对表的记录的查询(*****,难点)
dcl:对用户的创建及授权
数据库的数据类型即列类型
类型 | 大小 |
---|---|
tinytext | 2的8次方-1B(256B) |
text | 2的16次方-1B(64K) |
mediumtext | 2的24次方-1B(16M) |
longtext | 2的32次方-1B (4G) |
可参考:https://www.w3school.com.cn/sql/sql_datatypes.asp
类型 | 大小 |
---|---|
tinyblob | 2的8次方-1B(256B) |
blob | 2的16次方-1B (64K) |
mediumblob | 2的24次方-1B(16M) |
longblob | 2的32次方-1B (4G) |
CREATE TABLE [IF NOT EXISTS] 表名(
列名 列类型,
列名 列类型,
…
列名 列类型
);
SHOW TABLES;
SHOW CREAT TABLE 表名;
DESC 表名;
DROP TABLE 表名;
DML:对表记录的增删改。
UPDATE 表名 SET 列名1=列值1, 列名2=列值2,…[WHERE 条件];
条件(条件可选的):
-条件必须是一个Boolean类型的值或表达式:
-运算符:=、!=、<>、>、<、>=、<=、BETWEEN…AND、IN(…)、IS NULL、NOT、OR、AND
注意:
(理解内容)
用户只能在指定的IP地址上登录
用户可以在任意IP地址上登录
权限、用户、数据库
给用户分派在指定的数据库上指定的权限
例如:GRANT CREATE,ALTER,DROP,INSERT,UPDATE,DELETE,SELECT ON mydb1.* TO user@localhost;
- 给用户user1分派在数据库mydb1上的create、alter、drop、insert、update、delete、select权限
给用户分派指定数据库上的所有权限
撤销指定用户在指定数据库上的指定权限
例如:REVOKE CREATE,ALTER,DROP ON mydb1.* FROM user@localhost;
- 撤销用户user1在数据库mydb1上的create、alter、drop权限
查看指定用户的权限
查询不会修改数据库表记录
1)查询所有列
select * from 表名;
—>’*'表示查询所有列
2)查询指定列
select 列1,列2,…,列n from 表名;
3)完全重复的记录只一次
当查询结果中的多行记录一样时,只显示一行。
select distinct * | 列1,…,列n from 表名;
4)列运算
数量类型的列可以做加减乘除运算
select sal*1.5 from emp;
select sal+comm from emp;
字符串类型可以做连续运算
select concat(’$’, sal) from emp;
把表中的两列字符串连接:
SELECT CONCAT(‘我叫’, ename,’,我的工作是’,job) FROM emp
转换null值
有时候需要把NULL转换成其他值,例如comm+1000时,如果comm列存在NULL值,那么NULL+1000还是NULL,这时需要把NULL当做0运算
select ifnull(comm, 0)+1000 from emp;
—> ifnull(comm, 0):如果comm是NULL,那么当成0运算;
转换成字符串:IFNULL(列名,‘字符串’)
给列起别名
select ifnull(comm, 0)+1000 as 奖金 from emp;
–>as可以省略
1)条件查询
与前面介绍的update和delete语句一样,select语句也可以使用where字句来控制记录
SELECT 列名 FROM 表名 [WHERE 条件]
条件中运算符:=、!=、<>、>、<、>=、<=、BETWEEN…AND、IN(…)、IS NULL、IS NOT NULL、OR、AND…
2)模糊查询
关键字:LIKE、_、%
以姓名为例:
SELECT * FROM emp WHERE ename LIKE ‘张_’;
模糊查询需要使用运算符:LIKE,其中_匹配一个任意字符,注:只能匹配一个字符。
查询姓张姓名三个字的员工:
SELECT * FROM emp WHERE ename LIKE ‘张__’;
查询姓张,名字字数不限制的员工:
SELECT * FROM emp WHERE ename LIKE ‘张%’;
%表示匹配任意字符(0-N)
SELECT * FROM emp WHERE ename LIKE ‘%哈%’;
查询姓名中以哈开头、结尾、在中间的员工
SELECT * FROM emp WHERE ename LIKE ‘%’;
这个条件等同于不存在,如果姓名为NULL则查不出来
SELECT * FROM emp ORDER BY sal ASC
-- 按sal排序,升序
-- ASC可以省略
SELECT * FROM emp ORDER BY comm DESC
-- 按scomm排序,降序
-- DESC不能省略
SELECT * FROM emp ORDER BY sal ASC, comm DESC
-- 按sal升序排序,如果sal相同,则按comm降序排序
聚合函数用来做某列的纵向运算
1)COUNT()
SELECT COUNT(*) FROM emp
-- 计算emp表中所有列都不为NULL的记录的行数
SELECT COUNT(comm) FROM emp
-- 计算emp表中comm列不为NULL的记录的行数
2)MAX()
SELECT MAX(sal) FROM emp
-- 查询最高工资
3)MIN()
SELECT MIN(sal) FROM emp
-- 查询最低工资
4)SUM()
SELECT SUM(sal) FROM emp
-- 查询工资总和
5)AVG()
SELECT AVG(sal) FROM emp
-- 查询平均工资
分组查询是把记录使用某一列进行分组,然后查询组信息
关键字:GROUP BY , HAVING
例如:查看所有部门的记录数
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
MySQL中独有的关键字:limit
用来限定查询结果的起始行,以及总行数。
/*
查询起始行为第5行,一共查询3行记录
*/
SELECT * FROM emp LIMIT 4, 3;
-- 其中4表示从第5行开始,3表示一共查询3行,即结果返回第5/6/7行记录
/*
应用场景:
1.一页记录数:10行
2.查询第3页
*/
SELECT * FROM emp LIMIT 20, 10;
-- LIMIT [(当前页-1)*每页记录数], [每页记录数];
小结:
查询语句顺序:
select
from [where…] #分组之前的筛选在where中
group by [having…] #分组后再筛选用having
order by
备份:数据库导出SQL脚本,备份的是数据库内容(表和数据),并不是备份数据库。
cmd命令:
mysqldump -u用户名 -p密码 数据库名>生成的脚本文件路径
mysql -u用户名 -p密码 数据库名<生成的脚本文件路径
练习:
小结: