您当前所在位置:抛宸医药公司有限公司 > 产品展示 >

20000字干货笔记,镇日搞定Mysql~

原标题:20000字干货笔记,镇日搞定Mysql~

今天给行家分享的是吾学习Mysql记录的详细笔记,有基础知识,也有实战案例,文章较长,提出珍藏~

基本语法

-- 创建数据库CREATEDATABASEtest;

-- 切换数据库usetest;

-- 表现数据库中的一切外showtables;

-- 创建数据外CREATETABLEpet ( nameVARCHAR( 20), owner VARCHAR( 20), species VARCHAR( 20), sex CHAR( 1), birth DATE, death DATE);

-- 查望数据外组织-- describe pet;desc pet;

-- 查询外SELECT* frompet;

-- 插入数据INSERTINTOpet VALUES( 'puffball', 'Diane', 'hamster', 'f', '1990-03-30', NULL);

-- 修改数据UPDATEpet SETname= 'squirrel'whereowner = 'Diane';

-- 删除数据DELETEFROMpet wherename= 'squirrel';

-- 删除外DROPTABLEmyorder;

数据库大三大设计范式

1NF

不走分割性,只要字段值还能够不息拆分,就不悦足第一范式。

不走分割的有趣就按字面理解就是最幼单位,不及再分成更幼单位了。

字段只能是一个值,不及被拆分成众个字段,否则的话,它就是可分割的,就不相符一范式。

2NF

第二范式就是要有主键,请求其他字段都倚赖于主键。

为什么要有主键?异国主键就异国唯一性,异国唯一性在荟萃中就定位不到这走记录,因此要主键。

在已足第一范式的前挑下,主键外的每一列都必须十足倚赖于主键。倘若展现不十足倚赖,只能够发生在说相符主键的情况下。

3NF

在已足第二范式的前挑下,除了主键列之外,其他列之间不及有传递倚赖有关,即“清除冗余”。

睁开全文

清除冗余,就是各栽新闻只在一个地方存储,不出现在众张外中。

范式总结:范式,其实是用来学习参考的,设计的时候按照情况,意外肯定要按照,要变通结相符营业实际情况决定。

查询演习

准备数据

-- 创建门生外CREATETABLEstudent ( noVARCHAR( 20) PRIMARY KEY, nameVARCHAR( 20) NOTNULL, sex VARCHAR( 10) NOTNULL, birthday DATE, -- 生日classVARCHAR( 20) -- 所在班级);

-- 创建教师外CREATETABLEteacher ( noVARCHAR( 20) PRIMARY KEY, nameVARCHAR( 20) NOTNULL, sex VARCHAR( 10) NOTNULL, birthday DATE, profession VARCHAR( 20) NOTNULL, -- 职称department VARCHAR( 20) NOTNULL-- 部分);

-- 创建课程外CREATETABLEcourse ( noVARCHAR( 20) PRIMARY KEY, nameVARCHAR( 20) NOTNULL, t_no VARCHAR( 20) NOTNULL, -- 教师编号-- 外示该 tno 来自于 teacher 外中的 no 字段值FOREIGNKEY(t_no) REFERENCESteacher( no) );

-- 收获外CREATETABLEscore ( s_no VARCHAR( 20) NOTNULL, -- 门生编号c_no VARCHAR( 20) NOTNULL, -- 课程号degree DECIMAL, -- 收获-- 外示该 s_no, c_no 别离来自于 student, course 外中的 no 字段值FOREIGNKEY(s_no) REFERENCESstudent( no), FOREIGNKEY(c_no) REFERENCEScourse( no), -- 竖立 s_no, c_no 为说相符主键PRIMARY KEY(s_no, c_no) );

-- 查望一切外SHOWTABLES;

-- 增补门生外数据INSERTINTOstudent VALUES( '101', '曾华', '男', '1977-09-01', '95033'); INSERTINTOstudent VALUES( '102', '匡明', '男', '1975-10-02', '95031'); INSERTINTOstudent VALUES( '103', '王丽', '女', '1976-01-23', '95033'); INSERTINTOstudent VALUES( '104', '李军', '男', '1976-02-20', '95033'); INSERTINTOstudent VALUES( '105', '王芳', '女', '1975-02-10', '95031'); INSERTINTOstudent VALUES( '106', '陆军', '男', '1974-06-03', '95031'); INSERTINTOstudent VALUES( '107', '王尼玛', '男', '1976-02-20', '95033'); INSERTINTOstudent VALUES( '108',产品展示 '张全蛋', '男', '1975-02-10', '95031'); INSERTINTOstudent VALUES( '109', '赵铁柱', '男', '1974-06-03', '95031');

-- 增补教师外数据INSERTINTOteacher VALUES( '804', '李诚', '男', '1958-12-02', '副教授', '计算机系'); INSERTINTOteacher VALUES( '856', '张旭', '男', '1969-03-12', '讲师', '电子工程系'); INSERTINTOteacher VALUES( '825', '王萍', '女', '1972-05-05', '助教', '计算机系'); INSERTINTOteacher VALUES( '831', '刘冰', '女', '1977-08-14', '助教', '电子工程系');

-- 增补课程外数据INSERTINTOcourse VALUES( '3-105', '计算机导论', '825'); INSERTINTOcourse VALUES( '3-245', '操作编制', '804'); INSERTINTOcourse VALUES( '6-166', '数字电路', '856'); INSERTINTOcourse VALUES( '9-888', '高等数学', '831');

INSERTINTOscore VALUES( '103', '3-105', '92'); INSERTINTOscore VALUES( '103', '3-245', '86'); INSERTINTOscore VALUES( '103', '6-166', '85'); INSERTINTOscore VALUES( '105', '3-105', '88'); INSERTINTOscore VALUES( '105', '3-245', '75'); INSERTINTOscore VALUES( '105', '6-166', '79'); INSERTINTOscore VALUES( '109', '3-105', '76'); INSERTINTOscore VALUES( '109', '3-245', '68'); INSERTINTOscore VALUES( '109', '6-166', '81');

-- 查望外组织SELECT* FROMcourse; SELECT* FROMscore; SELECT* FROMstudent; SELECT* FROMteacher;

基础查询

-- 查询 student 外中的 name、sex 和 class 字段的一切走SELECTname, sex, classFROMstudent;

-- 查询 teacher 外中不重复的 department 列-- department: 往重查询SELECTDISTINCTdepartment FROMteacher;

-- 查询 score 外中收获在60-80之间的一切走(区间查询和运算符查询)-- BETWEEN xx AND xx: 查询区间, AND 外示 "并且"SELECT* FROMscore WHEREdegree BETWEEN60AND80; SELECT* FROMscore WHEREdegree > 60ANDdegree < 80;

-- 查询 score 外中收获为 85, 86 或 88 的走-- IN: 查询规定中的众个值SELECT* FROMscore WHEREdegree IN( 85, 86, 88);

-- 查询 student 外中 '95031' 班或性别为 '女' 的一切走-- or: 外示或者有关SELECT* FROMstudent WHEREclass= '95031'orsex = '女';

-- 以 class 降序的手段查询 student 外的一切走-- DESC: 降序,从高到矮-- ASC(默认): 升序,从矮到高SELECT* FROMstudent ORDERBYclassDESC; SELECT* FROMstudent ORDERBYclassASC;

-- 以 c_no 升序、degree 降序查询 score 外的一切走SELECT* FROMscore ORDERBYc_no ASC, degree DESC;

-- 查询 "95031" 班的门生人数-- COUNT: 统计SELECTCOUNT(*) FROMstudent WHEREclass= '95031';

-- 查询 score 外中的最高分的门生学号和课程编号(子查询或排序查询)。-- (SELECT MAX(degree) FROM score): 子查询,算出最高分SELECTs_no, c_no FROMscore WHEREdegree = ( SELECTMAX(degree) FROMscore);

-- 排序查询-- LIMIT r, n: 外示从第r走最先,查询n条数据SELECTs_no, c_no, degree FROMscore ORDERBYdegree DESCLIMIT0, 1; -- LIMIT n offset r: 外示查询n条数据,从第r走最先SELECTs_no, c_no, degree FROMscore ORDERBYdegree DESCLIMIT1offset0;

分组计算平均收获

查询每门课的平均收获

-- GROUP BY: 分组查询SELECTc_no, AVG(degree) FROMscore GROUPBYc_no;

分组条件与暧昧查询

查询score 外中至稀奇 2 名门生选修,并以 3 起头的课程的平平分数

分析外发现,至稀奇 2 名门生选修的课程是3-105、3-245、6-166,以 3 起头的课程是3-105、3-245。也就是说,吾们要查询一切3-105和3-245的degree平平分。

-- 再查询出至稀奇 2名门生选修的课程 -- HAVING:外示持有 HAVING COUNT(c_no) >= 2

-- 并且是以 3起头的课程 -- LIKE 外示暧昧查询, "%"是一个通配符,匹配 "3"后面的肆意字符。 AND c_no LIKE '3%';

-- 把前线的SQL语句拼接首来,-- 后面添上一个 COUNT(*),外示将每个分组的个数也查询出来。SELECT c_no, AVG(degree), COUNT(*) FROM score GROUP BY c_noHAVING COUNT(c_no) >= 2AND c_no LIKE '3%'; ------- ------------- ---------- | c_no |AVG(degree) | COUNT(*) | ------- ------------- ---------- | 3-105 |85.3333| 3 ,