一:
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,//字段名+数据类型+长度+是否为NULLPRIMARY 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_nameVALUES(value1,value2,...valueN);
INSERT INTO table_nameVALUES(value1,value2,...valueN),(value1,value2,...valueN);
查询
SELECT * FROM timi_adc;SELECTid,hero_nameFROMtimi_adc;//从指定的表中查询指定列的信息SELECT * FROM timi_adc;//查询所有的字段 * 表示所有的字段。
WHERE子句:实际的查询工作中我们很少查询限定的字段 我们更希望查询一种符合条件的数据 所以我们应该加上一个 限定
SELECT * FROM table_name WHERE condition;//condition是指条件 他和if语句一样可以作简单的逻辑判断。
limit子句:
SELECT * FROM table_name LIMIT parameter;//parameter是limit语句的参数。
SELECT*FROMtimi_adcLIMIT5, 6;//这个sql语句的意思是查询timi_adc表的第6-11行//第一个参数5表示从第六行开始查,第二个参数是6,表是一共查询六条记录;//查询第0-x行SELECT*FROMtimi_adcLIMIT5;//这个SQl的意思是查询user的第0-5行,也就是说这句话等价于SELECT * FROM timi_adc LIMIT 0,5;//查询第x行SELECT*FROMtimi_adcLIMIT4, 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*FROMtimi_adcORDER BYwin_rate DESC;//
和其他子句连用
和LIMIT子句一样,ORDER BY子句一般和其他语句联合使用,比如我想查询胜率最高的三个射手,那么我们的查询语句可以这么写:
SELECT*FROMtimi_adcORDER BYwin_rate DESCLIMIT3;
更新:UPDATE语句
用法:
UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值
UPADTE语句我们必须加入WHERE限定条件,否则的话UPDATE语句就会对整列起作用。
UPDATEtimi_adcSETban_rate = 0.01WHEREhero_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*FROMtimi_adcWHEREwin_rate > 0.5AND win_rate < 0.51OR win_rate < 0.47;
IN/NOT INY语句:
IN子句需要配合WHERE使用,它是一种精确查找。
SELECT * FROM table_name WHERE column IN (condtionA,condtionB);//格式SELECT*FROMtimi_adcWHEREfever IN ('T0', 'T3');//查询在timi_adc表中热度为T0和t3的英雄SELECT*FROMtimi_adcWHEREfever = 'T0'OR fever = 'T3';//上下两个SQL等价 // HWERE后跟列名
NOT IN/NOT LIKE
SELECT*FROMtimi_adcWHEREfever NOT IN ('T0');//相当于否定条件,比如在timi_adc表中查询热度T0以外的英雄
NULL值的处理;
- SELECT命令以及WHERE子句来读取表中的数据是,如果表中的查询字段是NULL的,该命令可能无法执行。
NULL值的概念:
NULL值不等于空值,空值是不占用存储空间的,NULL占用存储空间。
我们不能使用=NULL或者!=NULL来查找NULL值NULL=NULL会返回NULL;
SELECT field_name1,field_name2FROM table_nameWHERE field_name2 IS NOT NULL/IS NULL;
我们可以根据这个语法去表格中查询不为 NULL 或者为 NULL 的数据。
在这里,老师已经替大家内置了一张 student 表格:
我们根据语法,想要查询 id,mobile,其中 mobile 不为 NULL 的数据,可以这么写 SQL 语句:
SELECTid,mobileFROMstudentWHEREmobile IS NOT NULL;//查询ID,NAME ,GRADE并且grade为 NULL的数据可以这样写SQL;SELECTid,name,gradeFROMstudentWHEREgrade IS NULL;
LEFT outer join 语句(10.18上课内容)//MySQL中的关联查询
- 联合查询
- join查询
- inner join (返回两个表中存在匹配的行)
SELECT column_name(s)FROM table1INNER JOIN table2ON table1.column_name = table2.column_name;|
- left outer join (返回左表的所有行,如果右表中没有匹配,返回结果为NULL)
SELECT column_name(s)FROM table1LEFT JOIN table2ON table1.column_name = table2.column_name;
- right outer join(同理返回结果为NULL)
SELECT column_name(s)FROM table1RIGHT JOIN table2ON table1.column_name = table2.column_name;
- FUll JOIN(返回左表和有右表中所有的行,如果一侧没有匹配返回NULL)
SELECT column_name(s)FROM table1FULL JOIN table2ON table1.column_name = table2.column_name;
- 子查询
SELECT *FROM table_nameWHERE column_name IN (SELECT column_nameFROM table_nameWHERE 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函数的参数之间用英文“,”分隔
SELECTid,concat(hero_name, '的胜率是', win_rate)FROMtimi_adc;//查询表中ID 加胜率
SELECTconcat(hero_name, '的胜率是', win_rate)FROMtimi_adcWHEREid = 3;//查询ID=3的数据
别名
我们优化拼接的结果,给他起一个别名,比如我希望查询结果的列名叫result,那么我们可以这么写:
SELECTconcat(hero_name, '的胜率是', win_rate) as resultFROMtimi_adcWHEREid = 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,那么我们可以这么写查询语句:
SELECTTRIM(TRAILING 'Q'FROMfever)FROMtimi_adcWHEREid = 21;
desc来降序查询
REPLACE()函数
- TRIM()函数不能去掉字符串中间的值,如果要修改中间的值,我们可以使用REPLACE()函数
UPDATE table_name SET colunm_name = REPLACE(column_name,string_find,string_to_replace) WHERE conditions;