前言/吐槽:

哦……原来老师会读英文……只是考虑俺们的水平才念的字母而已……好歹俺们也算是一本211学校的正规军吧……呵呵……

下面进入正题


SQL语句的注释写法

单行注释:
# This is a comment.

多行注释:

/*
   This is a comment.
*/


约束

其实上一篇当中已经涉及到与约束相关的内容了,但是不够详细也不够全面,在这里比较认真地说一下。
约束就是限制字段的类型和相关关系。类型指的就是数据类型,相关关系指的就是非空,非重复等等。

常用的对表的约束类型有8种:

  1. 类型约束,也就是限定数据类型,上一篇提到了,数据类型不少,找百度去。
  2. 主键约束,primary key,要求不能重复且不能为空,每个表只能有一个主键约束。
  3. 非空约束,not null,要求该列的任何字段均不能为空。
  4. 自动标识约束,auto_increment,也叫自增。如果用户插入数据的时候不对具有自动标识约束的属性赋值,则该列的值自动使用自增量,否则使用用户输入的值。
  5. 唯一键约束,unique,要求该列不能重复但可以为空,每个表可以有多个唯一键约束。
  6. 检查约束,check,要求某列字段的值必须满足某种条件,否则拒绝插入。注意,MySQL基于兼容性考虑,会自动忽略本约束。
  7. 默认约束,default,如果用户在插入数据时没有对这一列的字段赋值,则默认填一个设定的值。
  8. 外键约束,foreign key,与之相关的内容将在下一篇中的“主表与从表”部分详细说明。

删除表或表中数据

(统称为删除表操作)

1. 只删除数据,自动标识不清零
delete from <表名> where <条件>;
该操作虽然会删掉该列的所有数据,但不会重置自动标识约束auto_increment产生的自增量。也就是说,如果在表尾删除数据,那么再次插入的数据的自增量就是在表尾被删除的那一行的自增量的下一个值。举个例子:

# 表开始
...
4 小明 男
5 小王 女
# 表结束

# 删除第五行

# 表开始
...
4 小明 男
# 表结束

# 在表尾插入一条记录

# 表开始
...
4 小明 男
6 小红 女
# 表结束

由上述示例可以看出,自增量出现了不连续现象。
在上一篇的查询部分也提到过,若条件为空(不写where <条件>部分),则意味着对所有数据生效。

2. 无条件删除表中全部数据并将自动标识归零
truncate table <表名>;

该操作不可带有条件,会删除表中所有数据,包括自增列,但会保留表的结构。

3. 删除整个表
drop table if exists <表名>;
该操作会删除整个表本身,包括表中的数据和表的结构。
在上一篇的创建数据库部分也提到过,if exists可不写,但若查无此表,则会报错。

从运行效率上比较,drop最高,truncate次之,delete最低。很浅显,就像丢垃圾,drop是连桶和垃圾袋加上里面的垃圾一块丢掉,truncate是取出垃圾袋丢掉,delete是一件垃圾一件垃圾的扔。当然了,你要是非得说你肾虚搬不动桶那我也没辙,总有这种杠精,俺也得提前防范一下以避免不严谨的清空不是?呵呵。所以啊,删除的时候一定要根据实际情况来看,不要做无谓的折腾。

带约束的复杂建表

(这段的题头是我自己起的……可总感觉什么地方不太对……呵呵……)

话不多说,示例如下:

create table if not exists student
(
    id  int(4) primary key auto_increment, # 类型约束,主键约束,自动标识约束
    name varchar(20) not null unique, # 非空约束,唯一键约束
    age int(2) not null check(age>0 and age<120), # 非空约束,检查约束(MySQL不支持)
    gender enum('F','M','男','女'), # enum,枚举值,也属于一种约束,要求输入的数据必须是枚举值中之一,否则拒绝插入。
    addr varchar(50) default '地址不详', # 默认约束
    mark varchar(100)
)auto_increment=100; # 使用本语句设定自动标识约束的起始值,若不写则默认从1开始。

其中这一段中涉及到了and,那么就说一下SQL语句中的和与或。
SQL语句中,不用&&或&表示和,而用and表示;也不用||表示或,而用or表示。and和or在查询条件(即where后的部分)中相当常见。

查询

终于到了重头戏了!俺真是激动不已啊!呵呵!
本段有很多部分在上一篇文章中已经提到过了,在此也一并列出,做一整理。

1. 查询所有列的所有行中全部数据
select * from <表名>;

2. 查询指定列的所有行
select <列名1>,<列名2> from <表名>;

3. 查询指定列的全部行,将列名替换为别名
select <列名1> as '<别名1>', <列名2> '<别名2>' from <表名>;
其中,as可以省略不写。

4. 分页查询
select <列名> from <表名> limit <起始值>,<行数>;

5. 在查询中使用聚合函数:

(1) 行数统计:count
select count(<列名>) as '总行数' from <表名>;

count函数的应用示例:登录验证的判断

use userInfo;
select count(*) from users where 
username='<$USERNAME>' and password='<$PASSWORD>'; # 其中,$USERNAME 和 $PASSWORD分别表示请求登录设为用户输入的用户名和密码

(2) 仅适用于数字列的4个函数

max() # 求该列的最大值
min() # 求该列的最小值
sum() # 求该列的和,会忽略值为空(null)的字段
avg() # 求该列的平均值,会忽略值为空(null)的字段

注意:查询过程中,如果除了被函数处理的列以外,还要查询其它列,则这些列必须使用分组查询,否则会报错。错误的SQL语句写法示例如下:
select name,max(age) from student; # 这是一条错误的SQL语句

6. 分组查询
分组查询所使用的group by关键字可以将查询结果按照某个字段或多个字段进行分组,字段中值相等的为一组。由于group by的用法相当广泛且复杂,在此只列举其与聚合函数相关的用法。
示例:按性别分组,并显示这些组中行数大于1的组的行数
select count(*),gender from student group by gender having count(*)>1;
其实我是明白它的意思的……只是要用中文表述出来好难啊……

7. 排序
select <列名1> from <表名> order by <列名2> <排序方式>;
其中,排序方式有两种,一种是asc,升序,是不填排序方式时默认采用的排序方式,asc就是升序的英文单词ascend的缩写;另一种是desc,降序,是降序的英文单词descend的缩写。升序就是1,2,3,4,...8,9,10,按值的提升排序,值越大越靠下;降序就是10,9,8,7,...,3,2,1,按值的降低排序,值越大越靠上。

8. 模糊查询/搜索
模糊查询/搜索使用like / not like关键字,可以作为查询条件的一部分。like返回包含关键词的结果,not like返回不包含关键词的结果。
具体写法如下:
select <列名1> from <表名> where <列名2> like <关键词>;
select <列名1> from <表名> where <列名2> not like <关键词>;

在关键词中可以使用通配符,用“%”代替任意多个字符,用“”代替单个字符,连续使用一定数量的“”可以代替一定数量的字符。

查询示例:
select * from student where name not like '%三';

9.in / not 关键字查询:
in / not关键字作为查询条件,相当于多个or

具体写法如下:
select <列名1> from <表名> where <列名2> in (<关键词1>,<关键词2>);
select <列名1> from <表名> where <列名2> not in (<关键词1>,<关键词2>);

in返回符合任何关键词的结果,not in返回不符合任何一个关键词的结果。

查询示例:
select * from student where age not in(21,36);

10.is null / is not null 关键字查询:
is null / is not null关键字作为查询条件,返回某列的字段为空/非空的结果。

查询示例:
select * from student where mark is not null;

感觉越写越乱了……恰逢今日蹲坑犯了痔疮,每一次摩擦都爽得飘飘欲仙……容本人略放放水,剩余内容明日再整理吧……呵呵。