SQL菜鸟学习札记(一)

刚开始学SQL,从最基础的语句开始写,用一个LOL数据库做实验。目前使用的工具是MySQL Workbench,感觉比较顺手,界面没花多久时间就读懂的差不多了,所以目前就使用这个工具来做SQL的学习了。

(1)多条件查询,然后修改值。因为我这里是需要编辑原来是0值的行,所以多条件查询中使用的是 A = 0为条件搜索。

刚刚提到的0值行就是这个样子,刚开始Copy行的时候遇到了很奇葩的错误——有些行必须存在默认值才能将数据进行表与表之间的Copy和Paste,所以就给默认值放了个0值。

(2)仔细琢磨了之前这个BUG,是自己刚开始处理的太复杂了,直接把NOT NULL的Option取消了,就不会报这个错误了,默认值就成了NULL。

然后这里出现了更奇葩的东西,直接清除0值,并不能将值置为NULL,而是将值变成了 ‘’ ,即不能算作空格,也没有长度的一个值,所以表格上没有NULL的标识。

这个连带出的问题就是,以NULL为搜索条件,是查不出来这些值为 ‘’ 的行的。

我异想天开,‘’既然没有长度,那我就用length函数来搜索,结果会是什么样子呢?果然,这些包括这个值的行都被搜索出来了,因为这个奇特的值长度为0,小于1。

因为要录入这部分的所有数据,只能按传统方法,认栽。

看了一下后台,之前不太理解主键和改值SQL的关系,原来是通过WHERE将主键与修改的元组,修改的元组中的某个值建立关联的。

这个奇特的值的后台就在这里,这个 ‘’ 值真是能让人记住了。 

这个NULL值还是要这么赋予,点击某个值,Set Field to NULL,这样就能有NULL的左上角标识了。

(3)4月26号写了第一个利用内联(inner join)来批量复制列的语句。内联就是A,B两个表格在某列拥有共性(至少有一个值相匹配)的情况下,建立连接。这个值通常就是主键了,因为一个表的数据录入通常都是主键开始的。

之后学了不少复制列的方法,又忘了这个经典方法,真是不应该。这也说明,学SQL真的得学会回溯过去的语句,否则花时间一直学新方法效率太低了,还增加无谓的学习负荷。

——————分隔线——————

(4)26号还写了第一个返回多列值的多表连接查询。语法不太难,SELECT A FROM B 还是基础框架,在这里 A 表示的就是多个表,简记为a.ELEMENT1,b.ELEMENT2,c.ELEMENT3.....。既然这里用到了a,b,c...来做简记,后面肯定还需要逐一补充说明,a表是指的哪个表,b表是指的哪个表...。(PS:这段代码就是不够优雅,看起来很乱,左边的几个‘X’也是让我看的心惊胆战,不过幸好跑成功了,也算没白写小半天)

进阶型的多表连接查询,这次整体看起来就很优美了。没有学习SQL的时候我还一直怀疑数据库存在的意义,现在算是明白了,数据分类存放,建立关联,取出和阅读起来真的比传统的Excel要容易和方便许多。由于关联的存在,数据的修改也更容易快速同步。

(5)对表格中列的拖动,在SQL中的反映就是AFTER。比如C AFTER B;B AFTER A;那么最后表格列的顺序(从左到右)就是 A B C。AFTER出现的位置在语句最后,分号之前,和COMMENT的位置是差不多的。

(6)以前都是单表单值或者多表单值查询,对多值的查询也是分开写,效率感觉不高,因为同一个语句要用 OR 和 AND 连接几次,很费时间。后来知道 IN 这个关键字,省事了许多。

顺带get了DISTINCT的使用方法。SELECT DISTINCT(A) 就是去掉重复的 A 值,当然,这个去掉是要建立在元组完全相同的情况下的。这个表里面由于studentNum和lessonNum是联合主键,所以是没法用DISTINCT过滤的,因为各个主键(这里指联合主键)都是不同的,即实际存在的主键都是(a,b)(a,c)(b,c)(b,d)这样的形式,各自不同,自然就不能用DISTINCT过滤其中一个值包含的重复值。

(7)暴力复制表数据,INSERT INTO 语句很好用,也是第一次知道 SELECT FROM 语句可以这么嵌套。


——————分隔线——————

SQL这门语言真的越学越有趣,也很实用,毕竟以后大数据的适用范围会越来越广,所以数据库会是必备的技术。

第一次菜鸟学习札记也记录完了~道阻且长,给自己加油!

顺便在最后贴上之前提到的多表连接的查询语句。

use lck2017springsplit;
select a.raceNum, a.raceName, 

       b.TeamA_proTop_G1, c.TeamA_legendTop_G1, d.TeamA_TopDmg_G1,
       b.TeamA_proTop_G2, c.TeamA_legendTop_G2, d.TeamA_TopDmg_G2,
       b.TeamA_proTop_G3, c.TeamA_legendTop_G3, d.TeamA_TopDmg_G3,
       b.TeamB_proTop_G1, c.TeamB_legendTop_G1, d.TeamB_TopDmg_G1,
       b.TeamB_proTop_G2, c.TeamB_legendTop_G2, d.TeamB_TopDmg_G2,
       b.TeamB_proTop_G3, c.TeamB_legendTop_G3, d.TeamB_TopDmg_G3

       from regracename_num a join regracenum_pros_top b join regracenum_legend_top c join regracenum_createdamage_top d
       on   a.raceNum = b.raceNum and b.raceNum = c.raceNum and c.raceNum = d.raceNum where

       a.TeamA = ‘KT‘ and b.TeamA_proTop_G1 = ‘Smeb‘ or
       a.TeamA = ‘KT‘ and b.TeamA_proTop_G2 = ‘Smeb‘ or
       a.TeamA = ‘KT‘ and b.TeamA_proTop_G3 = ‘Smeb‘ or
       a.TeamB = ‘KT‘ and b.TeamB_proTop_G1 = ‘Smeb‘ or
       a.TeamB = ‘KT‘ and b.TeamB_proTop_G2 = ‘Smeb‘ or
       a.TeamB = ‘KT‘ and b.TeamB_proTop_G3 = ‘Smeb‘ ;
use lck2017springsplit;
select a.raceNum, a.raceName, 

       b.TeamA_proTop_G1, c.TeamA_legendTop_G1, d.TeamA_TopDmg_G1,
       b.TeamA_proTop_G2, c.TeamA_legendTop_G2, d.TeamA_TopDmg_G2,
       b.TeamA_proTop_G3, c.TeamA_legendTop_G3, d.TeamA_TopDmg_G3,
       b.TeamB_proTop_G1, c.TeamB_legendTop_G1, d.TeamB_TopDmg_G1,
       b.TeamB_proTop_G2, c.TeamB_legendTop_G2, d.TeamB_TopDmg_G2,
       b.TeamB_proTop_G3, c.TeamB_legendTop_G3, d.TeamB_TopDmg_G3

       from regracename_num a join regracenum_pros_top b join regracenum_legend_top c join regracenum_createdamage_top d
       on   a.raceNum = b.raceNum and b.raceNum = c.raceNum and c.raceNum = d.raceNum where

       a.TeamA = ‘KT‘ and b.TeamA_proTop_G1 = ‘Smeb‘ and c.TeamA_legendTop_G1 = ‘兰博‘ or
       a.TeamA = ‘KT‘ and b.TeamA_proTop_G2 = ‘Smeb‘ and c.TeamA_legendTop_G2 = ‘兰博‘ or
       a.TeamA = ‘KT‘ and b.TeamA_proTop_G3 = ‘Smeb‘ and c.TeamA_legendTop_G3 = ‘兰博‘ or
       a.TeamB = ‘KT‘ and b.TeamB_proTop_G1 = ‘Smeb‘ and c.TeamB_legendTop_G1 = ‘兰博‘ or
       a.TeamB = ‘KT‘ and b.TeamB_proTop_G2 = ‘Smeb‘ and c.TeamB_legendTop_G2 = ‘兰博‘ or
       a.TeamB = ‘KT‘ and b.TeamB_proTop_G3 = ‘Smeb‘ and c.TeamB_legendTop_G3 = ‘兰博‘ ;
时间: 2024-10-05 03:57:35

SQL菜鸟学习札记(一)的相关文章

Informix学习札记

Informix学习札记: 一,启动关闭数据库脚本 启动:oninit 关闭:onmode -k 二,导入导出数据库 导出数据库 将数据库public_bak导出到目录/usr/informix/export中: $ dbexport public_bak -o /usr/informix/export 执行结束后,会在export目录下,生成一个pubic_bak.exp目录.此目录下,有数据库创建对象的语句及数据. $ pwd /usr/informix/export $ ls public

oracle菜鸟学习之 表操作

首发:http://www.arppinging.com/wordpress/?p=96 oracle菜鸟学习之 表操作 1.创建表 在oracle中,创建表使用create table来实现 SQL> create table student(sno number(6),sname varchar2(12),address varchar2(20)); Table created. SQL> desc student; Name Null? Type --------------------

Oracle菜鸟学习之 Oracle基础命令

首发:http://www.arppinging.com/wordpress/?p=93 Oracle菜鸟学习之 Oracle基础命令 1.connect和show user 连接用户和查看当前用户 SQL> show user; USER is "SCOTT" SQL> conn /as sysdba Connected. SQL> show user USER is "SYS" SQL> 2.clear screen 清除屏幕输出 3.s

Oralce菜鸟学习之 通配符%和_的使用

首发:http://www.arppinging.com/wordpress/?p=104 Oralce菜鸟学习之 通配符%和_的使用 1.% 在Oracle中,%表示匹配所有,使用通配符前要使用like SQL> select * from student where sname like 'Z%'; SNO SNAME SAGE ---------- ------------------------------ ---------- 1 ZhangSan 21 4 ZhaoYun 24 SQ

Oracle菜鸟学习之在RedHat 6.5上安装Oracle

Oracle菜鸟学习之在RedHat 6.5上安装Oracle 11G 首发:http://www.arppinging.com/wordpress/?p=90 安装前准备工作 上传数据库软件至/tmp/下,并修改文件权限 chmod -R 755 /tmp/database/ 创建用户和组 创建oracle用户,并将oracle用户加入oinstall和dba组,后面安装的时候需要用到 [[email protected] ~]# groupadd oinstall [[email prote

oracle菜鸟学习之 select case when的使用

[toc] oracle菜鸟学习之 select case when的使用 格式语法 case when 条件1 then action1 when 条件2 then action2 when 条件3 then action3 when 条件N then actionN else action end 例子 判断现在是几月 SQL> select case substr('20181118',5,2) 2 when '08' then '8yue' 3 when '09' then '9yue'

oracle菜鸟学习之 复杂的更新语句使用

oracle菜鸟学习之 复杂的更新语句使用 实例与答案 问题:表T1里有a,b,c...N个字段,表T2里有a,b,c三个字段,然后想在T1中"c"与表T2中"c"相同的情况下,从表T2中将a,b覆盖表T1中的a,b,怎么做? 实验表: create table T1(a int,b int,c int,d int,e int); create table T2(a int,b int,c int); insert into T1 values(1,2,3,4,5)

oracle菜鸟学习之 分析函数-排序

oracle菜鸟学习之 分析函数-排序 排序函数 1.row_number:返回连续的排序,无论值是否相等2.rank:具有相等值得行排序相同,序数值随后跳跃3.dense_rank:具有相等值得行排序相同,序号是连续得 实验表 create table chengji(sno number,km varchar2(10),score number); insert into chengji values(1,'YW',60); insert into chengji values(1,'SX'

oracle 菜鸟学习之 decode中if-then-else逻辑

oracle 菜鸟学习之 decode中if-then-else逻辑 decode类似于if - then - else 语法:decode(values,if1,then1,if2,then2,...else) values 代表某个表的任何类型的任意列或者一个通过计算所得的任何结果,当每个value值被测试,如果value的值为if1,decode函数的结果为then1,如果都不符合,那么就返回else.这里的if.then及else都可以是函数或计算表达式. 例子 create table