一:
1.2 数据库的分类 层次式数据库 网络式数据库 关系型数据库
关系型数据库 和非关系型数据库 (NoSQL)
第一章:(选填题)
数据库系统的三级模式结构:外模式,内模式,逻辑模式、
外模式:数据库用户能够看见和使用的局部数据的逻辑结构和特征的藐视,书记库用户的数据视图,是与某应用有关的数据的逻辑表示。
逻辑模式:数据库中全体数据顶点逻辑结构和特征的描述,是所有用户的公共数据视图
内模式:数据物理结构和存储方法的描述,是数据在数据库内部的组织方式。
外模式–>视图 模式–>库表 内模式–>磁盘存储
内模式保证了物理独立性
外模式保证了逻辑独立性
第四章(选填题)数据库的安全性:
- 不安全因素:1. 非授权用户对数据库的恶意存取和破坏 2. 数据库中重要的数据泄露 3. 安全环境的脆弱性
- 数据库安全性控制:1. 用户鉴别:动态/静态口令鉴别 2. 存取控制 3. 自主存取控制方法
- 为什么要授权 : 授权是指授予(GRANT),和收回(REVOKE)是数据库安全性控制中自主存取控制的方法,是为了保护数据库,防止不合法的使用所造成的数据泄露,或更改破坏。
- 授权(GRANT)
授权的使用方法
GRANT 权限 对象类型 对象名TO 用户名 [with GRANT OPTION]
//权限
查询权限:SELECT 全部操作权限 ALLPRIVILEGES
对象类型:可以是TABLE 和VIEW 对象名 为对应的表名和
视图名字
用户名:可以是指定用户也可以是全体用户PUBLIC
//SQL不运行循环授权 即被授权者不能把权限再
授回给授权者或者其祖先
GRANT SELECT ON TABLE Student TO U1
//把查询权限给用户U1
- 收回权限(REVOKE)
revoke 权限 ON 对象类型 对象名 FROM 用户名 [CASCADE|RESTRICT];
CASCADE:级联回收。将用户传播出去的权限一并收回
RESTRICT:受限回收。若用户传播过该权限,回收将会失败
eg:
revoke update(sno)ON TABLE Student FROM U4;
目前层次式和网络式基本消失 !
1.4
SQL语句:
CREATE DATABASE youkedadb;
quit
exit
2.1表格
- 常用的数据类型:DOUBLE INT VARCHAR(可变的长字符串,可以类比于JAVA中的String类型);
BIGINT(长整型可以类比于long类型);
- 一行称为一条数据;
CURD:计算机语言中Create read Updata Delete 就是CRUD;创建 读取 更新 删除
- 创建:创建表格我们需要提交的属性1. 表名 2. 字段名 3. 字段的数据类型 ;
CREATE TABLE `user`(//创建一张叫做user的表格
`id` CINT(10)NOT NULL,
`mobile` VARCHAR(11) NOT NULL,
`nickname` VARCHAR(40) NOT NULL,
`gmt_created` datetime ,
`gmt_modified` datetime NOT NULL,//字段名+数据类型+长度+是否为NULL
PRIMARY KEY ( `id` )/这段代码的意思是这张表格的主键式id这个字段
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
主键的特点:1.已经约定的字段 不能为空 不能重复 作用是标识;
删除表格:
drop table table_name;//table是要删除的表格名字
DROP TABLE IF EXISTS table_name;//另一种写法
插入:
INSERT INTO table_name(field1,field2,...fieldN)
VALUES
(value1,value2,...valueN);
INSERT INTO
`user` (`id`, `mobile`, `nickname`, `gmt_created`)
VALUES
(1, '13426069530', '叶冰', now());
/*user是表名
id mobile 是字段名
mobile的值是VARCHAR类型 所以要用' '包含
gmt_created是datetime类型,我们一般使用now()这个函数来获取服务器当前时间,并且将它
作为值插入。
*/
INSERT INTO table_name
VALUES
(value1,value2,...valueN);
INSERT INTO table_name
VALUES
(value1,value2,...valueN),
(value1,value2,...valueN);
查询
SELECT * FROM timi_adc;
SELECT
id,
hero_name
FROM
timi_adc;//从指定的表中查询指定列的信息
SELECT * FROM timi_adc;//查询所有的字段 * 表示所有的字段。
WHERE子句:实际的查询工作中我们很少查询限定的字段 我们更希望查询一种符合条件的数据 所以我们应该加上一个 限定
SELECT * FROM table_name WHERE condition;
//condition是指条件 他和if语句一样可以作简单的逻辑判断。
limit子句:
SELECT * FROM table_name LIMIT parameter;
//parameter是limit语句的参数。
SELECT
*
FROM
timi_adc
LIMIT
5, 6;
//这个sql语句的意思是查询timi_adc表的第6-11行
//第一个参数5表示从第六行开始查,第二个参数是6,表是一共查询六条记录;
//查询第0-x行
SELECT
*
FROM
timi_adc
LIMIT
5;
//这个SQl的意思是查询user的第0-5行,也就是说这句话等价于
SELECT * FROM timi_adc LIMIT 0,5;
//查询第x行
SELECT
*
FROM
timi_adc
LIMIT
4, 1;
//这句SQL的意思是查询timi_adc表第五行的数据;
//和WHERE子句联合使用
排序(ORDER BY子句)
使用场景:在实际的应用场景中,我们需要对查询结果进行排序,就需要用到ORDER BY 子句
语法:
SELECT * FROM table_name ORDER BY field_name;
一般的查询语句查询数据结果是按照升序排序,int double 是从小到大,varchar是按照a-z排序,对于datetime是从过去到现在。
DESC关键词
ORDER BY 语句的排序默认是正序排序,关键词是ASC(一般不写),
逆序排序可以加上关键词DESC
使用方式:
SELECT
*
FROM
timi_adc
ORDER BY
win_rate DESC;
//
和其他子句连用
和LIMIT子句一样,ORDER BY子句一般和其他语句联合使用,比如我想查询胜率最高的三个射手,那么我们的查询语句可以这么写:
SELECT
*
FROM
timi_adc
ORDER BY
win_rate DESC
LIMIT
3;
更新:UPDATE语句
用法:
UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值
UPADTE语句我们必须加入WHERE限定条件,否则的话UPDATE语句就会对整列起作用。
UPDATE
timi_adc
SET
ban_rate = 0.01
WHERE
hero_name = '艾琳';
//将王者荣耀中艾琳的ban率设置为1%
DELETE语句(删除语句)
delete from user where id=4;
//删除user表中id为4的行
delete from `user` where id<20;
//删除user中所有id小于20的数据
delete from user;
//删除uesr表中所有的数据
MySQL中基本语法
- show databases;//查看所有的数据库
- show create databases;//查看数据库属性
- use mysql01;//使用数据库
- alter database mysql01 character set gbk; //将指定的utf8的数据库修改为gbk的数据库
- drop database mysql01;//删除数据库
- show tables;//查看表
- desc 表名;//查看表的结构
- SELECT *表名 ;//查看表单内容;
备份与恢复
- LIKE查询
SELECT * FROM table_name WHERE condition LIKE condition;
“%” SQL LIK子句中,我们的使用百分号来表示任意字符,如果我们没有使用任何的%,那LIKE就当于“=”;
%放的位置会影响搜索结果,'%孙%'表示这个字符串含孙;
同理‘孙%’表示这个字符串以孙开头;
‘%孙’以孙结尾;
AND&OR
之前我们写WHERE语句只能有一个条件,and和or关键词可以让我们使用多个条件。
SELECT * FROM table_name WHERE conditionA AND/OR condtionB;
//例:
SELECT
*
FROM
timi_adc
WHERE
win_rate > 0.5
AND win_rate < 0.51
OR win_rate < 0.47;
IN/NOT INY语句:
IN子句需要配合WHERE使用,它是一种精确查找。
SELECT * FROM table_name WHERE column IN (condtionA,condtionB);
//格式
SELECT
*
FROM
timi_adc
WHERE
fever IN ('T0', 'T3');
//查询在timi_adc表中热度为T0和t3的英雄
SELECT
*
FROM
timi_adc
WHERE
fever = 'T0'
OR fever = 'T3';
//上下两个SQL等价
// HWERE后跟列名
NOT IN/NOT LIKE
SELECT
*
FROM
timi_adc
WHERE
fever NOT IN ('T0');
//相当于否定条件,比如在timi_adc表中查询热度T0以外的英雄
NULL值的处理;
- SELECT命令以及WHERE子句来读取表中的数据是,如果表中的查询字段是NULL的,该命令可能无法执行。
NULL值的概念:
NULL值不等于空值,空值是不占用存储空间的,NULL占用存储空间。
我们不能使用=NULL或者!=NULL来查找NULL值NULL=NULL会返回NULL;
SELECT field_name1,field_name2
FROM table_name
WHERE field_name2 IS NOT NULL/IS NULL;
我们可以根据这个语法去表格中查询不为 NULL 或者为 NULL 的数据。
在这里,老师已经替大家内置了一张 student 表格:
我们根据语法,想要查询 id,mobile,其中 mobile 不为 NULL 的数据,可以这么写 SQL 语句:
SELECT
id,
mobile
FROM
student
WHERE
mobile IS NOT NULL;
//查询ID,NAME ,GRADE并且grade为 NULL的数据可以这样写SQL;
SELECT
id,
name,
grade
FROM
student
WHERE
grade IS NULL;
LEFT outer join 语句(10.18上课内容)//MySQL中的关联查询
- 联合查询
- join查询
- inner join (返回两个表中存在匹配的行)
SELECT column_name(s)
FROM table1
INNER JOIN table2
ON table1.column_name = table2.column_name;|
- left outer join (返回左表的所有行,如果右表中没有匹配,返回结果为NULL)
SELECT column_name(s)
FROM table1
LEFT JOIN table2
ON table1.column_name = table2.column_name;
- right outer join(同理返回结果为NULL)
SELECT column_name(s)
FROM table1
RIGHT JOIN table2
ON table1.column_name = table2.column_name;
- FUll JOIN(返回左表和有右表中所有的行,如果一侧没有匹配返回NULL)
SELECT column_name(s)
FROM table1
FULL JOIN table2
ON table1.column_name = table2.column_name;
- 子查询
SELECT *
FROM table_name
WHERE column_name IN (
SELECT column_name
FROM table_name
WHERE column_name = '一级目录'
)
AND column_name != '一级目录';
SELECTR *
FROM TB_CREACTL
- 多表查询;
10/19日上课内容
- My SQL和Navicat的区别
MySQL Workbench和Navicat都是数据库管理工具,但它们有一些明显的区别。
首先,MySQL Workbench是MySQL官方提供的免费数据库管理工具,主要用于数据库设计、建模、SQL开发和数据库管理等方面。它提供了直观的图形界面,可以方便地进行数据库设计和管理操作,适用于开发人员和数据库管理员。而Navicat是一款商业数据库管理工具,支持多种数据库系统,包括MySQL、Oracle、SQL Server等。它提供了丰富的功能和工具,如数据导入导出、数据同步、数据备份等,适用于开发人员、数据库管理员和数据分析师等。
其次,Navicat需要付费购买执照,而MySQL Workbench则是开源免费的。因为Navicat是一款商业产品,所以它提供的功能要比MySQL Workbench更加丰富。
总的来说,MySQL Workbench和Navicat在功能、适用场景和费用等方面存在差异,用户可以根据自己的需求和预算来选择适合自己的数据库管理工具。
CONCAT函数
SELECT column_name1,CONCAT(column_name2,str,column_name3),column_name4 FROM table_name;
我们来分析一下这个语法:
- 首先这是一个查询语句,最基本的结构是 SELECT 列名 FROM 表名
- CONCAT函数可以拼接列名,也可以拼接字符串
- 在使用CONCAT函数的时候可以同时查询其他的列
- CONCAT函数的参数之间用英文“,”分隔
SELECT
id,
concat(hero_name, '的胜率是', win_rate)
FROM
timi_adc;
//查询表中ID 加胜率
SELECT
concat(hero_name, '的胜率是', win_rate)
FROM
timi_adc
WHERE
id = 3;//查询ID=3的数据
别名
我们优化拼接的结果,给他起一个别名,比如我希望查询结果的列名叫result,那么我们可以这么写:
SELECT
concat(hero_name, '的胜率是', win_rate) as result
FROM
timi_adc
WHERE
id = 3;
TRIM函数
用户数据输入不是符合要求的,该函数是为了保持格式正确来使用TRIM函数来清除数据
语法:
TRIM (str)
//TRIM函数语法就是把需要去除空格的数据放在TRIM()
//中
TRIM()函数可以去掉查询结果中的空格,但不会修改原数据,修改原数据需要配合UPDATE/DELETE语句使用
语法拓展
TRIM()函数可以精准的去掉前面或者后面的空格或者其他的字符,
TRIM( BOTH|LEADING|TRAILING removed_str FROM str);
- TRIM函数可以加上LEADING来只除去前面的空格,或者加上TRAILING来只除去后面的空格,如果都不加,则默认是BOTH。
- TRIM函数可以删除指定的字符串内容,如果不加,则默认删除空格。
比如我们要去掉id为21这条数据中fever尾部的Q,那么我们可以这么写查询语句:
SELECT
TRIM(
TRAILING 'Q'
FROM
fever
)
FROM
timi_adc
WHERE
id = 21;
desc来降序查询
REPLACE()函数
- TRIM()函数不能去掉字符串中间的值,如果要修改中间的值,我们可以使用REPLACE()函数
UPDATE table_name
SET colunm_name =
REPLACE(column_name,string_find,string_to_replace)
WHERE conditions;