SQL的学习之路,主要参考资料是:
右击,新标签页即可打开原图
操作使用的数据库为Access及MySQL。
数据采用的是SQL必知必会中的数据
(最下方可以下载数据)。其有5个表,表的关系如下:
看不清的图片:右击新标签页打开即可。
SQL基础
检索数据
排序检索数据
过滤数据
高级过滤
通配符过滤
创建计算字段
函数特性
函数
汇总数据
分组数据
以上测试均在Access数据库中进行,以下于MySQL中进行,通过workbench(版本6.3)操作。
子查询
这里说白了就是select语句嵌套,如select * from (select cust_name from customers)
联结
高级联结
如果3个以上的表,那怎样联结?
- 3个
use test; |
语法可以概括为:
FROM (表1 INNER JOIN 表2 ON 表1.字段号=表2.字段号) INNER JOIN 表3 ON 表1.字段号=表3.字段号
- 同理,4个表可以概括为:
FROM ((表1 INNER JOIN 表2 ON 表1.字段号=表2.字段号) INNER JOIN 表3 ON 表1.字段号=表3.字段号) INNER JOIN 表4 ON Member.字段号=表4.字段号
组合查询
如果代码块阅读困难,可移步博客园
关于规则中列顺序,前后必须一致。否则会出现如下情况:
1 use test; |
返回结果为:
列的顺序一致,才会返回正确结果
1 use test; |
结果:
插入数据
INSERT SELECT:
它可以将SELCET语句结果插入表中,在某种意义上可以完成表的复制。
如:
1 USE test;#使用数据库test |
返回结果如下:
而如果反过来用,大概就是:
insert into |
即可完成将表custnew中的数据全部插入customers,这也完成了一条insert插入多条数据。
通常,一条INSERT 语句,只能插入一行数据,要插入多行,就必须执行多个INSERT,但是, INSERT SELECT 是个例外。
以上方法的复制,实际上是重新在数据库中创建了一个新表。
SELECT INTO:
这种方法,可以在SQL语句运行中创建一个表,并将一个表复制到这个全新的表。
我们可以在实验新的SQL语句前,用其进行复制,这样就不影响到实际数据。
如:
USE test;#使用数据库 |
返回结果,与上表一致。
更新和删除
创建和操纵表
这里中点说一下创建表时,指定默认值的问题。一般来说,创建表时,我们需要指定列的数据类型、是否NULL列。关于NULL值具体说明请看下图。
默认值要是用的好,可以省却我们很多时间。
因其经常用于指定默认日期,这里以日期为例。
首先,在MySQL中内建的日期函数:
函数 | 描述 |
---|---|
NOW() | 返回当前的日期和时间 |
CURDATE() | 返回当前的日期 |
CURTIME() | 返回当前的时间 |
DATE() | 提取日期或日期/时间表达式的日期部分 |
EXTRACT() | 返回日期/时间按的单独部分 |
DATE_ADD() | 给日期添加指定的时间间隔 |
DATE_SUB() | 从日期减去指定的时间间隔 |
DATEDIFF() | 返回两个日期之间的天数 |
DATE_FORMAT() | 用不同的格式显示日期/时间 |
创建数据库t2,插入表。如下:
CREATE DATABASE t2; |
返回结果:
以下SQL不合法:
time_d time NOT NULL DEFAULT CURTIME(),
date_e date NOT NULL DEFAULT CURDATE(),
datetime_f datetime NOT NULL DEFAULT NOW(),
- DATETIME类型:NOW()函数以’YYYY-MM-DD HH:MM:SS’返回当前的日期时间,可以直接存到DATETIME字段中。不支持使用系统默认值。
- DATE类型:CURDATE()以’YYYY-MM-DD’的格式返回今天的日期,可以直接存到DATE字段中。不支持使用系统默认值。
- TIME类型:CURTIME()以’HH:MM:SS’的格式返回当前的时间,可以直接存到TIME字段中。不支持使用系统默认值。
常见错误:
CREATE TABLE dnt_forums |
- aa 是 int 类型,默认值也得是整型,并且default后边不要()括号 。
- bb date类型不支持使用系统默认值,改成timestamp,能过now()取系统时间 。
- cc 已经不允许为空(not null)所以不能默认为 null ,可以改成空字符串 。
修改:
CREATE TABLE dnt_forums |
这个日期问题,依然有很多不太明白的地方,以后学习过程碰到继续解决。
主要参考:
重命名表:
RENAME TABLE cucopy1 TO hi;
删除表:
DROP TABLE hi;
待续