前言

终于来到了东软!俺当年还好顿BB来着,俺要是考不上一本就去念大连东软!结果考上了居然也来了,只可惜是沈阳的不是大连的……

俺是非常不喜欢沈阳这个城市的,正如我在来的路上和本人自四年级起就认识的一位艺术口的通过微信提到过的我对沈阳的评价:

沈阳的城区给人的感觉异常压抑。我去过香港,香港的马路比沈阳更狭窄,两侧的楼比沈阳的更高。但是我还是能从香港体会到发展的活力,以及底层市民的挣扎。沈阳,马路比香港宽,楼也比香港矮,虽然能看到的天更宽一些,但是,只有死气沉沉的感觉,极其压抑。我认为沈阳是一座已经死掉的城市。虽然城市中还有一群没有死掉的人。

果然,一到沈阳,我的鼻子就又挂掉了,根本喘不过来气,真是要了命了……

俺们管行政的老师是个目测40多岁的年迈女性,姓金。说年迈其实不很恰当,毕竟才目测40多岁,但我实在想不到其他的形容这种年龄的词语了。说年迈更多是出于礼貌,个人感觉说成“老女人”应该会更恰当,但又不能这么说,总感觉有贬义的成分在其中……

俺们管教学的老师是个男的,姓高,目测也得将近50岁,头发还剩不少,而且还挺黑的,嗯,不仅头发黑,人也挺黑。

俺们QQ群里也有个老师,不知道是不是上述的行政老师,感觉应该不是,应该是俺们学校哈工程的实习负责老师。这老师在群里发言的时候总喜欢在句末加一句“呵呵”,让人感觉极其鬼畜,因此在群内掀起了一大股模仿这种语气的浪潮,呵呵。出于此因,本系列文章也将模仿这一老师的“呵呵”风格,经常性地“呵呵”以下,以环节本文写作过程中压抑而纠结的气氛。

东软这宿舍还行,至少有个独卫兼独浴,方便了天天洗澡,至少让这个难熬的沈阳的夏天不至于过于难熬……网络和市场价相比虽然贵了不少,但是用起来感觉还行,8个人办了20Mbps的带宽,也就是高峰时段打游戏的时候会偶尔卡顿以下而已,感觉上应该是比哈工程的校园网强了不少。

其实说是实习,实际是实训,也就是“实地培训”,说到底就是培训而已。也就是换了个地方无所事事而已……罢了罢了……写这一系列的文章,实质上是因为学校要求撰写“每日实习笔记”。反正也要写,不如就写的好一点,发到俺的网站上。当然了,交给学校的部分是不会有这一系列和实习学到的“知识”无关的部分的。

实习有 Java 和 Python 方向可选,我选的当然依然是亘古不变的 Java 方向。那么……也没啥别的可以说了,下面就是正文了。

友情提示且着重强调一下,英语不好的同学可以考虑先去学学英语再来学计算机,要不不仅仅是指令难以理解和记忆,更是连报错都看不懂,尴尬得很。还有,英语再惨也不要像老师这样按字母读单词,会要人命的,呵呵。

废话结束,先来整理一些SQL语句。

约定:SQL语句部分的所有非关键字或非SQL语法内容均用<...>标识,替换为具体内容时应连同<...>删掉。

本文介绍对数据库的基本操作语句,如:
创建数据库/数据表,使用数据库,基本插入/查询数据,注释的写法,分页查询等等……

显示数据库:
show databases;

系统将返回当前数据库系统中所包含的所有数据库名。
从这一最简单的命令可以看出,SQL语句以“;”作为一行语句的结束,也就是一次“完整操作”的结束。

创建数据库:
create database if not exists <数据库名>;

其中,if not exists 部分用于判断数据库名称是否与已存在的数据库名称相同,不相同则创建,可不写,但不写时冲突则会报错而不是出现相关提示。

使用(选择)数据库
use <数据库名>;

执行此命令后将进入选定的数据库。
注意:必须先选择某数据库才可以进行与表和记录相关的操作,要不鬼知道你要操作的是哪个数据库里的东西啊,呵呵。

几个与表有关的名词的介绍:
在介绍创建数据表的SQL语句之前,先来介绍几个名词,以避免读者混淆相关术语。也许本文对此的介绍并不严谨,但本SQL语句部分内容均按下述介绍撰写。
table,数据表,简称表。表名,也就是数据表的名称,是数据表的唯一标识符,因此不可重复,即不可有多个表使用同一表名。就像你打出租车去万达,司机上哪知道你要去哪个万达啊?呵呵。
column,数据列,简称列,就是竖着看的那一串东西,也就是记录的属性。列名,也就是列的名字,不可重复,但其并不是列的唯一标识符。列的唯一标识符实质上是列号,列号遵循表中列的创建顺序。系统在识别到列名后,将其转换为列号,再按列号进行操作。
row,记录,也称行,就是横着看的那一堆东西。可以粗浅地理解为,每一条记录就是一个东西/对象,或者说是现实中某一事物的抽象。
列与行交叉的部分称为字段,字段的内容就是某条记录的某种属性的值。
数据类型,就是列的数据类型。这个没啥说的吧……SQL的数据类型多得是……相关资料也多得是……有问题上网查就好了,常见的几个也挺好记的,我也懒得详细写了,呵呵。
primary key,主键,是记录的唯一标识符,不可重复且不可为空(非空)。
表的名称,表中的列与列的数据类型,以及各列的约束,称为表的结构。约束的相关内容,将在下篇文章中讨论。

创建数据表

create table <表名>
(
    <列名1> <数据类型> primary key,
    <列名2> <数据类型> not null,
    <列名3> <数据类型> unique,
    <列名4> <数据类型>
);

其中,标明 primary key 的列是主键,标在哪列哪列就是主键,不一定非要是第一列。not null,非空,要求这一列的值在插入记录的时候不能为空。 unique,唯一/独特,要求这一列各记录的值不能重复。

注意:只有在各列之间标“,”表示分隔,最后一列末尾不标逗号。

插入数据

insert into <表名>(<列名1>,<列名2>) values(<属性值1>,<属性值2>),(<属性值1>,<属性值2>);

需要注意的是,列名和属性值必须一一对应,第一个属性值对应第一个列名,第二个属性值对应第二个列名,以此类推,且属性值的值也必须和列的数据类型一致。如果属性值是字符串,则要用“'...'”(单引号)包起来。其他数据类型用“'...'”包起来也不会出错,不过并没有什么卵用,呵呵。同一行的属性值用“(...)”包起来,使用“,”分隔多行数据的属性值,就可以一次性插入多条数据。

查询数据

select <列名1>,<列名2> from <表名> where <条件>;

列名就是要查询的所有列,可以用“*”(通配符)表示所有列。表名就是要查的表……这没啥说的,呵呵。条件的写法还是很复杂且灵活的,在此不列,留作下一篇的内容。条件若不写则显示所有数据。

一个简单的带条件的查询语句示例如下:
select id,name from student where id<>3;

在显示查询数据时使用列别名:
select <列名> as '<别名>' from <表名> where <条件>;
使用 as '<别名>' 即可在显示数据时将列名替换为键入的别名,换啥都行,没人管你,呵呵。
as也可以省略,如下所示:
select <列名> '<别名>' from <表名> where <条件>;

分页查询:
有的时候数据量过大,一次性查询所有数据可能导致极其抽象的事情发生,比如内存不足,或者传输时间过长,浪费性能之类的。想象以下,假设你是中国联通营口分公司,月末核算用户话费账单,那么多用户的那么多通话记录,需要全部查出来,通过网络传输到核算服务器的内存中,然后再进行核算。这时候就有两个问题,第一就是有那么多数据,一台核算服务器的内存一次性够不够放的问题,第二就是那么大的数据量,传输时间显然会很长,这么长的等待时间,核算服务器应该干啥的问题。解决这两大问题的方案就是分页查询,一次性查询适量的数据,然后交给某个核算线程处理,同时继续查询下一批适量的数据,待上述线程处理完毕并/或销毁后,再创建新的核算线程进行处理,以此实现流水化作业。当然了,核算服务器的肯定不能只有两条生产线,它一定是同时具有多个核算线程和多个查询线程的。不过营口联通的服务器算力还是挺惨的,月末核算居然要5天,从1号到5号,这期间无论是查话费还是查流量,出来的都是不准的,呵呵。

废话一堆,该说SQL写法了。

select <列名1>,<列名2> from <表名> limit <m>,<n>;

m是开始的记录的行号,n是查询结束的记录的行号。也就是:
select <列名1>,<列名2> from <表名> limit <从第几行开始>,<到第几行结束>;

还有个“公式”:
select <列名1>,<列名2> from <表名> limit (m-1)*n,n;

其中,m为页索引也就是第几页,n为页大小,也就是每页的记录的条数,说白了就是:
select <列名1>,<列名2> from <表名> limit (第几页-1)*页多大,页多大;

俺这措辞真够土的,呵呵。

最后一项了:

查询表结构:
desc <表名>;
得到的结果就是按列号降序排列的列名。听起来还挺复杂……试试就知道了,光想是翻白眼想都想不确切的,呵呵。
另外,desc关键字既可以用来查询表的结构,也可以作为查询时的降序排序的关键词,这个就以后再说了。

行了,本文结束。