SQL语言DML、DQL
DML(数据操作语言)
数据操作语言无非包括语句的增删改,下面对数据的增删改做详细讲解
数据插入(添加数据)
三种语法形式:
- insert into 表名(字段名1,字段名2,……)values(值a1, 值a2, ……), (值b1, 值b2, ……), ……;
- insert into 表名1(字段名1,字段名2,……) select 字段名1,字段名2,……from 表名2;(可限定表名2中插入的行数,纤细语法见下面……)
- insert into 表名 set 字段名1=值1,字段名2=值2,……;
解释如下:
- 插入数据语法前面的字段名顺序与个数无需与表中字段一致,有的字段类型通常无需插入数据如:auto_increment, timestamp
- 形式1和形式2可以一次插入多行数据,形式3一次只能插入一行
- 三者字段和值都需一一对应
- 值的形式:数字直接写(可加引号),字符串和时间加单引号,函数值不能加引号
举例:
其他类似插入数据的语句
当然,我们偶尔也会碰到把文件中的数据插入数据库中,这就要求文件的数据格式必须满足规范
形式:load data infile ‘文件完整名(含路径)’ into table 表名;
举例:文件如下:
载入:
复制一个表的数据和结构:
语法形式:create table 表名1 select * from 表名2; //当然这方法有一定缺陷如易丢失数据类型属性,具体使用范围看场合而定
复制表的两种方法与区别
方法1:
Create table tab2 like tab1; //复制结构
Insert into tab2 select *from tab1; //复制数据
该方法比较完整
方法2:
Create table tab2 select * from tab1; //同时复制结构和数据
容易丢失一些信息如:约束、索引
数据删除
基本语法形式:
delete from 表名 [where 条件][order 排序][limit 限定];
解释如下:
- 删除数据是以行为单位删除的
- 通常有where条件来限定删除某行,不写则删除所有数据
- Order排序字句和limit限定字句通常不写,否则两者一同出现
- Order排序字句和用于设定删除数据的先后顺序
- Limit限定字句用于限定在设定的顺序后删除指定的多行数据
类似删除语句truncate:
基本语法:
Truncate [table]表名; //用于直接删除整个表(结构)并重新创建该表
- 删除整个表(数据和表结构)
- 重新创建该表(全新表)
- trunctate与delete语句不带where条件的区别:后者不会删除表结构只删除数据
举例:
数据修改
基本语法:
Update 表名 set 字段名1 = 值表达式1,字段名2 = 值表达式2,……[where 条件][order 排序][limit 限定]
解释说明:
- 修改数据以行为单位进行,可知更新其中部分字段
- 通常有where条件来限定修改某行,不写则修改所有数据
- Order排序字句和limit限定字句通常不写,否则两者一同出现,如修改数据的前多少行
- 字段的值可以是表达式或直接值或函数,遵循insert语句中的值写法
举例:
数据查询语言DQL
数据查询有很多类型,每种类型的语言针对的对象都不同,先讲一下基本查询
基本查询
语法形式:
Select [all | distinct] 字段或表达式列表[from 字句][where 字句][group by 字句][having 字句][order by 字句][limit 字句];
解释:
- select语句从“数据源”中取出一定的数据并作为该语句的返回结果
- 数据源可以是表也可以是“直接数据”
- 语法结构的相对顺序不能改变
可给字段加上别名:
此语法使用表字段必须使用from
有表字段的同样可以对字段进行“计算”:
也可以对表中的字段和“直接值”同时取出:
也可使用“表名.字段名”的形式指定某个表的某个字段(通常用于多表查询)
Truncate的表与原来的表结构一样,只是内容被删除
[all | distinct]
作用:设定select返回的数据是否允许出现重复行(完全相同的数据行)
- All: 允许出现—默认为all
- Distinct: 不允许出现
From字句
From是来源的意思,指的是数据来源,可以是一个表或多个表
Where字句
本质:结果判断为true或者false,相当于php或js中的if条件。
Php: if($n % 4 ==0 && $n %100 != 0 || $n %400 == 0){}
则:
Where true; where 1; where 1=1; 都表示true
Where false; where 0; where 1<>1; 都表示false
Where 中可用的运算符:
- 算术运算符:+、-、*、/、%
- 比较运算符:>、>=、<、<=、=(等于)、<>(不等于)、==(mysql扩展)、!=(mysql扩展)
- 逻辑运算符:and(与)、or(或)、not(非)
布尔值的判断方式:
布尔值:本质上布尔值只是一位整数的“别名”,0表示false,非0表示true
判断为true: XX is true
判断为false: XX is false
XX应该是一个字段名且类型应该是一个整数
实际中布尔值很少用因为可以直接使用数学大小
空值的判断方式:
判断为null: XX is null 判断为非空: XX is not null
Between语法:
XX between 值1 and 值2;
含义:字段XX的值在值1和值2之间(含),相当于:XX>=值1 and XX <=值2;
In语法:
XX in(值1,值2,……);
含义:XX等于其中所列出的任何一个值都算成立,相当于:
XX = 值1 or XX = 值2 or XX = 值3
注意:其中的值1通常是“直接值”,但也可以是查询结果值
Like语法(模糊查找):
语法形式:XX like ‘要查找字符’;
说明:
1, like语法(模糊查找)用于对字符类型的字段进行字符匹配查找
2, 要查找的字符中有2个特殊含义的字符:
a) % 含义:代表任意个数的任意字符
b) _ 含义:代表1个的任意字符
c) 字符指现实中的符号而不是字节
3, 实际应用中的模糊查找:like ‘%关键字%’;
最常见的模糊查询:
两者可配合使用:
如果要查找的字符中包含“%”或“_”,“”“ ‘ ”,只需进行转义就行:
Like ‘%ab\%cd%’ //ab%cd
Group by分组字句
形式:
Group by 字段1 排序方式1,字段2 排序方式2,… //通常都是只进行一个字段的分组
含义:就是将数据以某个字段为依据分到不同的组中
分组的结果通常满足以下规律:
- 数据结果为“组”,没有数据个体
- 丢失很多属性,比如身高、性别等
- 保留的信息有:组划分的依据、组内成员的个数,组内某些字段的最大值、最小值、平均值,总和值,其他字段通常不能用
- 2个字段以上分组其实是在前一分组的基础上进行分组
可见在分组查询中基本都依赖于以下几个函数(聚合函数、统计函数):
Count(*):统计一组中的数量,通常用’*’做参数
Max(字段名):获取该字段中在该组中的最大值
Min(字段名):获取该字段中在改组中的最小值
Sum(字段名):获取该字段中在该组中的总和
Avg(字段名):获取该字段中在该组中的平均值
两级分组:
Having字句
Having本质与where字句完全一样,只不过对象不同;
Where:针对基本表的字段进行判断; Having:针对groupby分组之后的“组”数据进行条件判断
再使用逻辑运算符: