@artman328
2015-12-12T02:33:57.000000Z
字数 12853
阅读 1340
wsc
database
数据库(Database)是存放和管理数据的软件系统。数据库软件又叫DBMS(Database Management System, 数据库管理系统)。数据库的类型有多种,我们在本文关注的是关系型数据库系统(Relational Database Management System, RDBMS)。
数据是信息片断,它可能是一个名字,一张图片,一个数字,一段视频……
在这里,不要把数据(Data)和数字(Number)等同起来,数字只是众多数据中的一种。
在生活中,数据有多种类型,如一个人的姓名(字符串),一个产品的生产日期(日期型),一件衣服的价格(带小数的数字),一个班级的学生人数(整数)……
在用计算机软件管理数据时,必须告诉计算机数据具体的类型,以便计算机能够正确处理数据。因为不同的数据类型,要以有的运算是不同的。比如可以把字符串连接起来,表示一个新的更长的字符串,但把数值类型连接起来表示什么结果?又如数值类型可以加减运算,但两个日期相加表示什么结果?
因此,除了要明确告诉计算机数据的类型外,各类型数据还应该有不同的表示方法(事实上有的编程语言就可以按表示方法来正确推断数据类型)。
表示方法:用引号括起来,如:"张三","Billy",'13987576542';
可以有的运算:
(1)字符串相连(许多语言用 + 号,PHP 语言用 . 号)
如:“Hello, " + "world!" (结果:"Hello, world!")
(2)取从第几个字符开始的几个字符作为子字符串;
(3)判断某个子字符串是否在另一个字符串中,有的话,从哪个位置开始;
(4)判断是否以某个子串开头;
(5)判断是否以某个子串结尾;
(6)有几个字符
(7)去除头尾的空格、换行符等
表示方法:直接以数字表示,如:10,8900L(长整型)
可以有的运算:
(1)加、减、乘、除、模除(取余数)
表示方法:直接以数字表示,如:10.00,89.12E5 (89*10的5次方)
可以有的运算:同整型
表示方法:可以以字符串方式表示,但年、月、日必须合法。
可以有的运算:
(1)取出一个日期的年、月、日;
(2)判断一个年份是否是润年;
……
基本同上,但带有时间信息。
表示方法:true(真),false(假)
可以有的运算:
(1)与(相当于乘法,相当于文字表述的并且), and
(2)或(相当于加法), or
(3)非(相当于取反值), not
(4)异或(不同为真,相同为假),xor
从数值上说,0为假,非0值为真。那么我们可以这样认为,1为真,0为假。我们来看看以上运算的结果:
1 * 1 = 1 (真 与 真 = 真)
1 * 0 = 0 (真 与 假 = 假)
结论:与运算中,只要有一个为假,则结果都为假!
练习,根据下面运算,看看能得到什么结果:
a) 当(2大于3) 并且 (3等于3)时,给我一个惊喜;
b) 当(地球体积大于月球体积)并且 (珠穆朗玛峰高度大于8000米)时,请我喝一杯可乐!
1 + 1 = 1 (真 或 真 = 真)
1 + 0 = 1 (真 或 假 = 真)
0 + 0 = 0 (假 或 假 = 假)
结论:或运算中,只要有一项为真,结果就为真。
练习:根据下面运算,看看能得到什么结果:
a) 当(地球不再转动)或者(火星人来到了地球)或者(海水是咸的)时候,我才不会借钱给你!
b) 当(冬雷阵阵)或者(夏雨雪)时,我才会离开你!
非运算,一般用 ! 表示:
!0 = 1
!1 = 0
结论:非运算相当于取反值。
异或运算:
树 异或 草 = 真 (它们不同)
花 异或 花 = 假 (它们相同)
结论:异或运算相当于问:“它们不同吗?”
数据总是用来描述事物的,比如一个人的基本情况,用到的数据有:姓名(字符串),性别(字符串或者逻辑值),出生日期(日期型),家庭人口数(整型),家庭年收入(浮点型)……
在常规的信息管理工作中,人们为了规范化管理,往往用表格来存储某项事物的数据信息。以上例来讲,我们可以用以下表格来存储多个个人的信息:
序号 | 姓名 | 性别 | 出生日期 | 家庭人口数 | 家庭年收入 |
---|---|---|---|---|---|
1 | 李强 | 男 | 1995-01-01 | 4 | 80,000.00 |
2 | 张小雪 | 女 | 1996-10-20 | 5 | 98,000.00 |
3 | 陈刚 | 男 | 1993-03-20 | 4 | 100,000.00 |
不论是常规管理还是计算机进行信息管理,表格数据的规范是很重要的。指出下表的不合理之处:
类别名称 | 分类说明 | 产品总额 | 产品 |
---|---|---|---|
计算机类 | 计算机相关设备全部分到此类 | 680,990.000 | 雷柏鼠标,2个,单价:78.00;惠普打印机,20台,单价:2,300.00;…… |
不合理之处在于:每一列(column)的信息必须是单一的,即只能描述单一的一个数据。每一列的取值不能是多值!以上“产品”列就试图将某种分类的商品的名称、数量、价格都描述出来,这是不合理的。
表格中的每一列数据都应该只是单值的(在数据库系统中,这叫做第一范式)!
再看一个例子:
员工编号 | 银行帐号 | 姓名 | 性别 | 开户行 | 开户行地址 |
---|---|---|---|---|---|
001 | 8765 3456 2234 666 | 陈朵 | 女 | 中国银行安宁支行 | 安宁市XX街道 |
001 | 8733 3527 9987 124 | 陈朵 | 女 | 中国工商银行官渡支行 | 昆明市XX街道 |
003 | 0024 3527 0987 723 | 丁雨 | 男 | 中国建设银行官渡支行 | 昆明市XX街道 |
以上表格记录了员工的基本个人信息和银行帐号信息。请问,这张表是否有不合理之处?
为了不出现重复的行,表中 员工编号 和 银行帐号 二者结合起来必须唯一,即不能有 员工编号 和 银行帐号 都分别相同的两行数据。我们把这两列的结合叫做“组合主关键字”。
现在,这个表的不合理之处在于:如果一个员工有n个银行帐号,它的员工编号和姓名等信息会出现n次!相同的信息数据被存储多次,一是浪费空间,二是可能导致数据不一致(比如同一员工编号的姓名有些是张三,有些是李三)。
出现这个问题的原因在于:“姓名”只依赖于“组合主关键字”中的“员工编号”,而开户行只依赖于“银行帐号”。
为了不出现数据完全相同的行,表格中必须有决定每一行都不同的列,这一列的值叫做“主关键字”。表格中的任何一列都必须完全依赖于“主关键字”,如果关键字是“组合主关键字(两列及以上组合而成)”,那么,它所有的列都必须完全依赖于它们的组合,而不是一部分。这在数据库系统中称为第二范式。
请看以下表格:
员工编号 | 姓名 | 性别 | 国籍 | 所在国首都 |
---|---|---|---|---|
001 | Billy Chad | 男 | 美国 | 华盛顿 |
002 | Dan Von Dutt | 男 | 荷兰 | 阿姆斯特丹 |
003 | 陈嫒 | 女 | 美国 | 华盛顿 |
为了使每一行唯一,只要员工编号唯一即可,其它列除 所在国首都 之外,都依赖于 员工编号。
现在,这张表有什么问题?
所在国首都 不直接依赖于员工编号,而是间接依赖(传递依赖),即:所在国首都 --> 国籍 --> 员工编号。
一张表中的列必须直接完全依赖于主关键字,而不能出现传递依赖。在数据库系统中,这一要求叫第三范式。
类别名称 | 分类说明 | 产品总额 | 产品 |
---|---|---|---|
计算机类 | 计算机相关设备全部分到此类 | 680,990.000 | 雷柏鼠标,2个,单价:78.00;惠普打印机,20台,单价:2,300.00;…… |
将每一个出现重复值的列用一张新的表格代替:
类别编号 | 类别名称 | 分类说明 |
---|---|---|
001 | 计算机类 | 计算机相关设备全部分到此类 |
002 | 家电类 | 家用电器设备全部分到此类 |
产品编号 | 产品名称 | 数量 | 单价 | 类别编号 |
---|---|---|---|---|
p001 | 雷柏鼠标 | 2 | 78.00 | 001 |
p002 | 长虹彩电 | 50 | 3,000.00 | 002 |
员工编号 | 银行帐号 | 姓名 | 性别 | 开户行 | 开户行地址 |
---|---|---|---|---|---|
001 | 8765 3456 2234 666 | 陈朵 | 女 | 中国银行安宁支行 | 安宁市XX街道 |
001 | 8733 3527 9987 124 | 陈朵 | 女 | 中国工商银行官渡支行 | 昆明市XX街道 |
002 | 0024 3527 0987 723 | 丁雨 | 男 | 中国建设银行官渡支行 | 昆明市XX街道 |
将表格按组合主关键字的数目(2列,员工编号和银行帐号)进行拆分,以上表可拆分为两张表:
员工编号 | 姓名 | 性别 |
---|---|---|
001 | 陈朵 | 女 |
002 | 丁雨 | 男 |
银行帐号 | 开户行 | 开户行地址 | 员工编号 |
---|---|---|---|
8765 3456 2234 666 | 中国银行安宁支行 | 安宁市XX街道 | 001 |
8733 3527 9987 124 | 中国工商银行官渡支行 | 昆明市XX街道 | 001 |
0024 3527 0987 723 | 中国建设银行官渡支行 | 昆明市XX街道 | 002 |
员工编号 | 姓名 | 性别 | 国籍 | 所在国首都 |
---|---|---|---|---|
001 | Billy Chad | 男 | 美国 | 华盛顿 |
002 | Dan Von Dutt | 男 | 荷兰 | 阿姆斯特丹 |
003 | 陈嫒 | 女 | 美国 | 华盛顿 |
原则:消除所有传递依赖
由于 所在国首都 依赖于 国籍,国籍 依赖于 员工编号,我们将所在国首都和国籍移到一张新表中去。
国家编号 | 国家 | 首都 |
---|---|---|
001 | 美国 | 华盛顿 |
002 | 荷兰 | 阿姆斯特丹 |
员工编号 | 姓名 | 性别 | 国籍 |
---|---|---|---|
001 | Billy Chad | 男 | 001 |
002 | Dan Von Dutt | 男 | 002 |
003 | 陈嫒 | 女 | 001 |
假如你要为一家学校设计表格,这些表格将被大量印制出来,可以供学校长期使用而不需要重新设计。表格要求能够记录学生的基本信息(学号、姓名、性别、出生年月)、课程基本信息(课程号、课程名)以及每一位学生的各科成绩(假定这家学校的所有学生都学习了所有的课程),表与表之间可用主关键字相互参照。
答案:
表1:学生基本信息表
学号 | 姓名 | 性别 | 出生年月 |
---|---|---|---|
001 | 张三 | 男 | 1994-12-24 |
002 | 胡婷 | 女 | 1996-03-27 |
表2:课程基本信息
课程号 | 课程名 |
---|---|
kc001 | 数据库基础 |
kc002 | C语言程序设计 |
kc003 | 操作系统原理与实践 |
表3:成绩表
学号 | 课程号 | 成绩 |
---|---|---|
001 | kc001 | 78 |
001 | kc002 | 86 |
001 | kc003 | 70 |
002 | kc001 | 82 |
002 | kc002 | 96 |
002 | kc003 | 77 |
在以上例子中,我们发现一些表之间需要相互参照,这些相互参照的表之间具有一定的关系。这些关系总体可划分为:
1、一对一关系(one to one, 1:1)
如:一个公民只有一个社会保险帐号,一个社会保险帐号只针对一个公民,如果两者都需要描述,就需要建立关联关系。
表1:公民基本信息
列:身份证号,姓名,性别,……
表2:社会保险信息
列:社会保险帐号,建立日期,建立社局,……,身份证号
一对一关系中,被参照的叫主表(parent,如以上的公民基本信息),参照主表的表叫子表(child,如以上的社会保险信息)。在定义这类关系时,可选择:
(1)主表中的记录删除时,子表中的对应记录也自动一并删除(叫级联删除,cascade delete);
(2)主表删除时,将子表中参照的主表主关键字设定为“空”(null);
(3)有子表参照时,不允许删除主表中的记录。
2、一对多关系(one to many, 1:n)
如:一个部门有多位员工,多位员工属于一个部门,这就是一对多关系。
表1:部门基本信息
列:部门编号,部门名称,部门地址,电话,……
表2:员工基本信息
列:编号,姓名,性别,出生日期,……,部门编号
在一对多关系中,一方叫主表,多方叫子表,定义这类关系与一对一关系相同。
3、多对多关系(many to many, n:n)
如:一个小组有多位成员,而一位成员可参加多个小组。
表1:小组信息
列:小组编号,小组名称,小组办公室,……
表2:成员信息
列:成员编号,姓名,性别,出生日期,……
表3:小组-成员
列:小组编号,成员编号
表1 对 表3 为 一对多,
表2 对 表3 为 一对多,
表1 对 表2 为 多对多。
可见,多对多要建立一个中间表(以上表3),将多对多转换为两个一对多。
在多对多关系中,两个多方都是主表,中间表是子表。中间表中的两个参照列组合起来应当唯一。
在所有关系中,被参照的列(主表中的主关键字)叫主键(Primary Key),子表中存储主表主键的列叫外键(Foreign Key)。
请参阅:百度百科关于MySQL的介绍
MySQL 客户端是一个基于 Windows 命令行的一个工具,它用来连接数据库服务器(本地或远程),并对数据库进行管理。
mysql -h 主机地址 -P 连接端口 -u 用户名 -p
最后一个参数要求提示输入密码。
如果连接本机上的数据库服务器,采用默认端口(3306),则:
mysql -u 用户名 -p
即可。
打入以上命令后,即进入 MySQL 控制台。提示符为:
mysql>_
mysql>help
或者
mysql>\h
mysql>\q
mysql>show databases;
注意:命令后面要跟英文的分号表示命令结束。
mysql>use 数据库名;
mysql>show tables;
mysql>describe 表名;
mysql>\. [路径/]脚本文件名
SQL语言可分为两大类,一是数据定义语言,二是数据操纵语言。
数据定义语言用于定义和管理数据库中的各种对象。
命令格式:
CREATE DATABASE IF NOT EXISTS 数据库名 DEFAULT CHARSET 字符集名;
含义:如果 [数据库名] 不存在的话,就创建数据库 [数据库名]并将其编码解码字符的方案设定为 [字符集名]。
create: 创建,创造
database: 数据库
if not exists: 如果不存在
default: 缺省,默认
charset: 字符集(用于编码字符)
命令格式:
USE 数据库名;
使用数据库后,以后所有的操作默认均针对本数据库。
例如:
CREATE DATABASE IF NOT EXISTS mydb DEFAULT CHARSET utf8;
USE mydb;
在第1行中,我们需要 创建数据库(create database) mydb 如果它并不存在的话(if not exists),并且默认字符集(default charset)为 utf8。
第2行,使用了刚创建的数据库。
命令格式:
DROP DATABASE IF EXISTS 数据库名;
含义:如果[数据库名]存在的话,就删除它。
drop: 丢弃
if exists: 如果存在
基本命令格式:
CREATE TABLE 表名 (
列名1 数据类型 能否为空 列约束 缺省值,
列名2 ...,
...[,
约束1,
约束2,
...
]
);
常见数据类型:
序号 | 类型 | 含义 |
---|---|---|
1 | CHAR(长度) | 固定长度的字符串,不论存在多少字符,都占用指定长度的空间,多余的会被截断 |
2 | VARCHAR(长度) | 变化长度的字符串,长度值为允许的最大长度,但在长度限制内有多长存储多长,不占用剩余空间。例如长度为10,存储'abc'实际只占用了3。存储'0123456789abc' 最终只存储了 '0123456789',本型最大长度为255. |
3 | tinyint | 微整型,1字节,-128~+127 |
4 | tinyint unsigned | 无符号微整型,1字节,0~255 |
5 | smallint | 小整型,2字节,-32,768 ~ 32,767 |
6 | smallint unsigned | 无符号小整型,0~65,535 |
7 | integer | 整型,4字节,-2 147 483 64~2 147 483 647 |
8 | integer unsigned | 无符号整型,4字节,0~4 294 967 295 |
9 | bigint | 大整型,8字节,-9 233 372 036 854 775 808~9 223 372 036 854 775 807 |
10 | bigint unsigned | 无符号大整型,8字节,0~18 446 744 073 709 551 615 |
11 | float(m,d) | 单精度浮点数,m为数字总位数(不含小数点),d为小数位数。本类型精度不高,适合于存储精度不要求很高的小数值 |
12 | double(m,d) | 双精度浮点数,m为数字总位数(不含小数点),d为小数位数。本类型精度也不太高,适合于存储精度不要求很高的小数值 |
13 | decimal(m,d) | 小数类型,m为数字总位数(不含小数点),d为小数位数。本类型精度很高,适合于存储金额等值 |
14 | numeric(m,d) | 同decimal |
15 | date | 日期型 |
16 | time | 时间型 |
17 | datetime | 日期时间型 |
18 | timestamp | 时间戳 |
19 | text | 文本型, 0-65535字节 |
能否为空:
写法 | 含义 |
---|---|
不写 | 可为空,即可不填 |
NOT NULL | 不可为空 |
列约束:
写法 | 含义 |
---|---|
PRIMARY KEY | 主键 |
UNIQUE | 不能出现重复值 |
缺省值:
写法 | 含义 |
---|---|
DEFAULT 值 | 如果没有给值,自动填入此处给出的值 |
约束1,...
写法 | 含义 |
---|---|
FOREIGN KEY (列名) REFERENCES 表名(主键名) 删除和更新联动定义 | 设定“列名”为外键,参照“表名”的“主键名” |
UNIQUE(列名1[,列名2,...]) | 括号里的列名(或列名组合)为唯一 |
INDEX(列名1[,列名2,...]) | 为括号里的列名创建索引,以提高查询效率 |
删除和更新联动定义:
ON DELETE NO ACTION | RESTRICT | CASCADE | SET NULL
删除主表记录时 有参照记录就不允许删除 级联删除 子表参照值设为空
ON UPDATE NO ACTION | RESTRICT | CASCADE | SET NULL
主表主键更新时
[举例]
一家商店需要建立一个数据库来管理商品。要求:
商品可以随意分类,分类级数不定;
同一商品可属于多种分类;
商品中包含“库存量”、“成本价”、“销售价”等信息;
可查询指定的分类的所有商品;
可查询某一商品的所有分类;
可查询当前所有商品、某类商品、某种商品、某个商品的库存总量、成本总额和预期的销售毛利润。
a)定义数据字典及约束字典(只以一张表为例)
表名:categories
数据字典
序号 | 列名 | 含义 | 数据类型 | 可否为空 | 列约束 | 缺省值 |
---|---|---|---|---|---|---|
1 | id | 分类号 | 无符号整型 | 否 | 主键 | |
2 | name | 分类名称 | 变长字符串(255) | 否 | ||
3 | description | 分类描述 | 变长字符串(255) | 否 | '' | |
4 | parent_id | 上级分类号 | 无符号整型 | 是 | 外键 |
约束字典
序号 | 约束名 | 约束定义 | 约束列 | 约束规则 |
---|---|---|---|---|
1 | cate_pk | 主键 | id | 自动增长 |
2 | cate_fk | 外键 | parent_id | 参照表:categories, 参照列:id 删除:严禁 更新:级联 |
b)撰写脚本
SET NAMES utf8;
DROP DATABASE IF EXISTS shop;
CREATE DATABASE IF NOT EXISTS shop DEFAULT CHARSET utf8;
USE shop;
CREATE TABLE categories(
id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
description VARCHAR(255) NOT NULL DEFAULT '',
parent_id INTEGER UNSIGNED,
CONSTRAINT cate_pk PRIMARY KEY (id),
CONSTRAINT cate_fk FOREIGN KEY (parent_id) REFERENCES categories(id)
ON DELETE RESTRICT ON UPDATE CASCADE
);
INSERT INTO categories(id,name,parent_id)
VALUES
(1,'电器产品',NULL),
(2,'家用电器',1),
(3,'空调制冷',2),
(4,'中央空调',3),
(5,'电冰箱',3),
(6,'工业设备',NULL),
(7,'空调制冷',6);
INSERT INTO products(id,name,spec,left_count,uni_cost,uni_price)
VALUES
(1,'电冰箱','兰花310',20,3000.00,3800.00),
(2,'电冰箱','海尔888',12,1800.00,2500.00),
(3,'彩色电视机','长虹666',50,2888.88,4000.00),
(4,'空调机','美的123',20,1600.00,2600.00),
(5,'洗衣机','海尔300',37,3000.00,4500.00),
(6,'洗衣机','海尔160',36,2800.00,4000.00),
(7,'彩色电视机','TCL250',21,2000.00,3200.00),
(8,'电磁炉','松下ABC',60,500.00,700.00),
(9,'中央空调','格力(工业用)',2,300000.00,400000.00),
(10,'数控机床','昆机345',4,120000.00,150000.00);
INSERT INTO cate_prod
VALUES
(2,3),
(2,5),
(2,6),
(2,7),
(2,8),
(3,1),
(3,2),
(3,4),
(7,9),
(6,10),
(1,9);
SET NAMES gb2312;
查询举例:
(1)列出所有的分类
select * from categories;
(2)找到所有的顶级分类
select * from categories
where parent_id is null;
(3)找出“家用电器”下的所有子分类
select * from categories
where parent_id in
(select id from categories
where name='家用电器');
括号中的查询为子查询,为主查询准备值。
(4)查看所有商品
select * from products;
(5)找出商品名包含"洗衣机"的所有商品
select * from products
where name like '%洗衣机%';
(6)找出以"电"开头的所有分类
select * from categories where name like '电%';
(7)找出属于"家用电器"的所有商品,列出其名称、品牌规格、分类名称,并按商品名称升序排序
select p.name, p.spec, c.name
from products p, categories c, cate_prod cp
where p.id=cp.prod_id and c.id=cp.cate_id and c.name='家用电器'
order by p.name asc;
(8)找出商品名称为"中央空调"的所有分类的名称,列出分类名、商品名,并按分类名降序排序
select c.name,p.name
from categories c, products p, cate_prod cp
where p.id=cp.prod_id and c.id=cp.cate_id and p.name='中央空调'
order by c.name desc;
(9)找出库存中售价大于等于10000元的商品
select * from products
where uni_price>=10000.00;
(10)显示当前库存的成本总价、销售总价、未来的销售毛利润
select sum(uni_cost) as 成本总价, sum(uni_price) as 销售总价, sum(uni_price)-sum(uni_cost) as 毛利润
from products;
(11)显示当前库存的成本总价、销售总价、未来的销售毛利润,按商品名称分组
select name as 商品名称, sum(uni_cost) as 成本总价, sum(uni_price) as 销售总价, sum(uni_price)-sum(uni_cost) as 毛利润
from products
group by name;
数据操纵语言用于插入、删除、修改、查询(增、删、改、查)数据表中的记录。
insert into 表名(字段列表) values (值列表)[,(值列表),...];
注意:
(1)列(column)又叫做 字段(field)。在以上语句中,方括号里的内容是可选的,便于一次插入多条记录。同时,字段列表 与 值列表 应当一一对应,列表均以逗号分隔列表项;
(2)如果省略字段列表,表示要插入所有字段的值,值应当与表结构定义中的列的定义顺序一致;
(3)如果不省略字段列表,则那些 NOT NULL 的并且没有默认值(default)的列必须出现在列表中。AUauto_increment 的字段可以不出现在列表中(它将会自动被填入)。
如:
insert into category(name,description)
values('服装类','所有服装归于此类');
delete from 表名 [where 条件];
说明:
(1)如果省略方括号里的内容,则会删除表中的所有记录;
(2)条件 可以是多个条件的组合(and, or)。
如:
delete from products where name like '%电%' or uni_price>=10000;
删除名称里包含"电"或者售价大于等于10000元的商品。
3、修改记录
update 表名 set 字段名=值[,字段名=值,...]
[where 条件];
说明:
(1)条件可以是各种条件的组合;条件省略时,将表中所有的行都做修改;
(2)可以同时修改多个列的值。
如:
update products set uni_price=uni_price*1.1;
将商品表中所有商品的售价提高了10%。
4、查询记录
select 字段列表 from 表1[,表2,...]
[where 条件
order by 字段名 升降序,[字段名 升降序,...]
[group by 字段名]]
[offset 整数]
[limit 整数]
;
说明:
(1)字段列表 可以来自多个表(前提是 from 了多个表),也可以用 * 表示所有字段;
(2)where 条件可以多个条件的组合;
(3)order by 用于记录排序,排序原则先按第一排序列排序,如果第一排序列相同,按第二排序列排序,依此类推。desc 表示降序,asc 表示升序(默认)。
(4)group by 用于统计查询时对统计结果按指定字段进行分组;
(5)offset 后面的数字表示从第几条记录开始读取;
(6)limit 后面的数字表示只要几条数据。
(1)与(两条件同时满足)
条件1 and 条件2
(2)或(条件只要满足一个)
条件1 or 条件2
(3)非(取反)
not 条件1
条件1 为真则结果为假,为假则结果为真。
序号 | 运算符 | 含义 | 举例 |
---|---|---|---|
1 | = | 等于 | name='Billy' price=123.40 birth_date='1995-01-01' |
2 | > | 大于 | price>10000.00 |
3 | >= | 大于等于 | birth_date>='1995-01-01' |
4 | < | 小于 | price<1000 |
5 | <= | 小于等于 | price<=800 |
6 | !=或<> | 不等于 | age!=18 |
7 | in | (值)在某个值列表中 | name in ('Billy','Tracy','Tina') |
8 | not in | (值)不在某个值列表中 | parent_id not in(1,6,9) |
9 | like | 像(模式匹配) | name like '%高%'(name 里包含'高'字,%匹配任意多的字符) address like '昆明%'(address 以'昆明'开头) |
10 | is null | 为空值 | parent_id is null |
LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'file_name.txt'
[REPLACE | IGNORE]
INTO TABLE tbl_name
[FIELDS
[TERMINATED BY 'string']
[[OPTIONALLY] ENCLOSED BY 'char']
[ESCAPED BY 'char' ]
]
[LINES
[STARTING BY 'string']
[TERMINATED BY 'string']
]
[IGNORE number LINES]
[(col_name_or_user_var,...)]
[SET col_name = expr,...)]
举例,将本地文件 f:\sql\mydata.txt 导入到表 departments 中。
load data local infile 'f:/sql/mydata.txt'
into table departments(name,address,phone,description)
fields terminated by '\t'
optionally enclosed by '"'
lines terminated by '\r\n'
ignore 1 lines;
第 1 行,load data 表示载入数据,local 指明输入数据文件在本地主机,infile 后面指明要载入的数据文件。如果文件包含路径,路径的的分隔符必须用正斜线;
第 2 行 into table 后面写要导入数据的表名称;
第 3 行 '\t' 代表 tab 键,指明数据文件中的数据项是用制表符分隔的;
第 4 行 指明如果数据文件中的数据项由双引号括起来的话,不要把双引号当作值的内容;
第 5 行 说明数据文件的每一行的结束标志,windows 为 '\r\n',其它操作系统为 '\n';
第 6 行 要求忽略第一行数据(表头标题行)。
注意:
导入时,数据文件的值列应当与表名称后的字段列表顺序一致,如果不指明字段列表,则值列应当与列定义的顺序一致,可用 ‘describe 表名’ 来查看字段顺序。
举例:
select * from products
into outfile 'f:/sql/products.txt'
fields terminated by '\t'
optionally enclosed by '"'
lines terminated by '\r\n';
第 2 行指明导出的文件在 f:\sql\products.txt。