Loading... # 数据库(一) ## 相关概念 数据库:保存有组织的数据的容器 表:某种特定类型数据的结构化清单(名称唯一) 列:表中的一个字段 数据类型:限制列中的存储的数据 行:表中的一个记录 主键:一列(或一组列),其值能够唯一标识表中的每一行 * 任意两行都不具有相同的值 * 每一行都必须具有一个主键值(主键值不允许NULL值) * 主键列中的值不允许修改或更新 * 主键值不能重用(如果某行从表中删除,它的主键不能赋给以后的新行) ## SQL(Structured Query Language)结构化查询语言 * 几乎所有DBMS(database manage system数据库管理系统)都支持SQL * 简单易学 * 强有力的语言,可以进行复杂和高级的数据库操作 补充:创建数据库时,出现下图错误可以尝试在计算机管理中的服务启动Mysql服务 ![image-20220118104537606.png](http://xherlock.top/usr/uploads/2022/01/1854434291.png) ![image-20220118104557723.png](http://xherlock.top/usr/uploads/2022/01/2906977282.png) 创建数据库ex ~~~sql CREATE DATABASE ex; USE ex; --建表 --学生表 CREATE TABLE `Student`( `s_id` VARCHAR(20), `s_name` VARCHAR(20) NOT NULL DEFAULT '', `s_birth` VARCHAR(20) NOT NULL DEFAULT '', `s_sex` VARCHAR(10) NOT NULL DEFAULT '', PRIMARY KEY(`s_id`) ); --课程表 CREATE TABLE `Course`( `c_id` VARCHAR(20), `c_name` VARCHAR(20) NOT NULL DEFAULT '', `t_id` VARCHAR(20) NOT NULL, PRIMARY KEY(`c_id`) ); --教师表 CREATE TABLE `Teacher`( `t_id` VARCHAR(20), `t_name` VARCHAR(20) NOT NULL DEFAULT '', PRIMARY KEY(`t_id`) ); --成绩表 CREATE TABLE `Score`( `s_id` VARCHAR(20), `c_id` VARCHAR(20), `s_score` INT(3), PRIMARY KEY(`s_id`,`c_id`) ); --插入学生表测试数据 insert into Student values('01' , '赵雷' , '1990-01-01' , '男'); insert into Student values('02' , '钱电' , '1990-12-21' , '男'); insert into Student values('03' , '孙风' , '1990-05-20' , '男'); insert into Student values('04' , '李云' , '1990-08-06' , '男'); insert into Student values('05' , '周梅' , '1991-12-01' , '女'); insert into Student values('06' , '吴兰' , '1992-03-01' , '女'); insert into Student values('07' , '郑竹' , '1989-07-01' , '女'); insert into Student values('08' , '王菊' , '1990-01-20' , '女'); --课程表测试数据 insert into Course values('01' , '语文' , '02'); insert into Course values('02' , '数学' , '01'); insert into Course values('03' , '英语' , '03'); --教师表测试数据 insert into Teacher values('01' , '张三'); insert into Teacher values('02' , '李四'); insert into Teacher values('03' , '王五'); --成绩表测试数据 insert into Score values('01' , '01' , 80); insert into Score values('01' , '02' , 90); insert into Score values('01' , '03' , 99); insert into Score values('02' , '01' , 70); insert into Score values('02' , '02' , 60); insert into Score values('02' , '03' , 80); insert into Score values('03' , '01' , 80); insert into Score values('03' , '02' , 80); insert into Score values('03' , '03' , 80); insert into Score values('04' , '01' , 50); insert into Score values('04' , '02' , 30); insert into Score values('04' , '03' , 20); insert into Score values('05' , '01' , 76); insert into Score values('05' , '02' , 87); insert into Score values('06' , '01' , 31); insert into Score values('06' , '03' , 34); insert into Score values('07' , '02' , 89); insert into Score values('07' , '03' , 98); ~~~ ## 检索数据 关键字:SQL组成部分的保留字,不能用作表或列的名字 检索单个列 select xxx from xxx; ![image-20220118111334047.png](http://xherlock.top/usr/uploads/2022/01/3917787343.png) 检索多个列 select xxx,xxx from xxx; ![image-20220118111427452.png](http://xherlock.top/usr/uploads/2022/01/1073658267.png) 检索所有列 select * from xxx; ![image-20220118111723078.png](http://xherlock.top/usr/uploads/2022/01/274649282.png) 通配符:\* 检索不同值的列 select distinct xxx from xxx; ![image-20220118112022892.png](http://xherlock.top/usr/uploads/2022/01/2631166799.png) 限制结果 sql使用select top N xxx from xxx; MySQL使用select xxx from xxx limit N; ![image-20220118115915886.png](http://xherlock.top/usr/uploads/2022/01/2194621496.png) 再加offset M; 表示从第M行开始起的N行数据 可简化为 limit N,M; 使用--注释 ## 排序检索数据 ![image-20220118111723078.png](http://xherlock.top/usr/uploads/2022/01/1171583564.png) 子句:由一个关键字加上所提供的数据组成 order by排序 ![image-20220118121127882.png](http://xherlock.top/usr/uploads/2022/01/946037532.png) 按多列排序 ![image-20220118121620221.png](http://xherlock.top/usr/uploads/2022/01/1694743889.png) 如图,现排性别,再排生日 ![image-20220118121717301.png](http://xherlock.top/usr/uploads/2022/01/2102929189.png) 如图,只按生日排 按列位置排序(很不好用) 需要确定order by后的数字是针对select里的位置,必须存在于select中 ![image-20220118122604820.png](http://xherlock.top/usr/uploads/2022/01/701155844.png) ![image-20220118122627439.png](http://xherlock.top/usr/uploads/2022/01/3783789400.png) 指定排序方向:+DESC,属于降序(Z-A) ![image-20220118153809713.png](http://xherlock.top/usr/uploads/2022/01/4160999685.png) ASC是升序,是默认的 order by xxx DESC, xxx DESC关键字只应用到直接位于其前面的列名 ## 过滤数据 WHERE子句指定搜索条件(过滤条件) ![image-20220118154428020.png](http://xherlock.top/usr/uploads/2022/01/4087961174.png) 若需要排序,需使order by位于where子句后面 where子句操作符 | 操作符 | 说明 | | --------- | ------------ | | = | 等于 | | <>、!= | 不等于 | | < | 小于 | | <= | 小于等于 | | !< | 不小于 | | BETWEEN | 在指定值间 | | IS NULL | 为NULL值 | ![image-20220118155728920.png](http://xherlock.top/usr/uploads/2022/01/3228319725.png) eg: ![image-20220118155746751.png](http://xherlock.top/usr/uploads/2022/01/2535435067.png) ![image-20220118155821231.png](http://xherlock.top/usr/uploads/2022/01/3836968067.png) ## 高级数据过滤 使用AND和OR连接WHERE子句 ![image-20220118174819923.png](http://xherlock.top/usr/uploads/2022/01/2022129044.png) ![image-20220118174859062.png](http://xherlock.top/usr/uploads/2022/01/1396717422.png) AND和OR结合使用时,需注意AND优先级较高,在复杂情况下使用圆括号对操作符分组比较判断 eg:WHERE A OR B AND C; 这句话会先计算B and C,在和A进行OR运算 IN操作符:指定条件范围(其实类似于OR,使用IN更清楚直观,执行速度更快,且可以包含其他SELECT语句) ![image-20220118175311468.png](http://xherlock.top/usr/uploads/2022/01/1050501655.png) 使用not ![image-20220118211104442.png](http://xherlock.top/usr/uploads/2022/01/2255327933.png) ## 用通配符进行过滤 通配符:用来匹配值的一部分的特殊字符 搜索模式:由字面值、通配符或两者组合构成的搜索条件 **通配符搜索只适用于文本字符串,非文本数据类型字段不能使用该法** LIKE操作符 **% 任何字符出现任何次数** 末尾匹配 ![image-20220118215802042.png](http://xherlock.top/usr/uploads/2022/01/2113664214.png) 中间匹配 ![image-20220118215931701.png](http://xherlock.top/usr/uploads/2022/01/1102685753.png) **_ 只匹配单个字符** ![image-20220118220442008.png](http://xherlock.top/usr/uploads/2022/01/2880510492.png) ![image-20220118220452126.png](http://xherlock.top/usr/uploads/2022/01/1421340761.png) [] 指定一个字符集,必须匹配指定位置的一个字符(**Mysql不支持**) 可用and or等替代,后面要接完整的条件语句,而不能和前面共用列名,或者其他字符; eg:where s_birth like '%0' or '%1' 或者 where s_birth like '%0' or like '%1' 都是错误的 最后修改:2022 年 01 月 18 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 0 如果觉得我的文章对你有用,请随意赞赏