首页 > 代码库 > SQL的学习
SQL的学习
SQL的学习之路,主要参考资料是:
- SQL必知必会
- W3school的SQL简介
操作使用的数据库为Access及MySQL。
数据采用的是SQL必知必会中的数据(最下方可以下载数据)。其有5个表,表的关系如下:
看不清的图片:右击新标签页打开即可。
1.SQL基础
2.检索数据
3.排序检索数据
4.过滤数据
5.高级过滤
6.通配符过滤
7.创建计算字段
8.函数特性
9.函数
10.汇总数据
11.分组数据
以上测试均在Access数据库中进行,以下于MySQL中进行,通过workbench(版本6.3)操作。
12.子查询
这里说白了就是select语句嵌套,如select * from (select cust_name from customers)
13.联结
笛卡尔积
14.高级联结
15.组合查询
关于规则中列顺序,前后必须一致。否则会出现如下情况:
1 use test;2 select cust_name ,cust_email,cust_contact3 from customers4 where cust_state in (‘IL‘,‘IN‘,‘MI‘)5 union all6 select cust_name,cust_contact,cust_email7 from customers8 where cust_name = ‘Fun4All‘
返回结果为:
cust_name | cust_email | cust_contact |
Village Toys | sales@villagetoys.com | John Smith |
Fun4All | jjones@fun4all.com | Jim Jones |
The Toy Store | Kim Howard | |
Fun4All | Jim Jones | jjones@fun4all.com |
Fun4All | Denise L. Stephens | dstephens@fun4all.com |
列的顺序一致,才会返回正确结果
1 use test;2 select cust_name ,cust_email,cust_contact3 from customers4 where cust_state in (‘IL‘,‘IN‘,‘MI‘)5 union all6 select cust_name,cust_email,cust_contact7 from customers8 where cust_name = ‘Fun4All‘
结果:
cust_name | cust_email | cust_contact |
Village Toys | sales@villagetoys.com | John Smith |
Fun4All | jjones@fun4all.com | Jim Jones |
The Toy Store | Kim Howard | |
Fun4All | jjones@fun4all.com | Jim Jones |
Fun4All | dstephens@fun4all.com | Denise L. Stephens |
16.插入数据
INSERT SELECT:
它可以将SELCET语句结果插入表中,在某种意义上可以完成表的复制。
如:
1 USE test;#使用数据库test 2 CREATE TABLE CustNew 3 ( 4 cust_id char(10) NOT NULL , 5 cust_name char(50) NOT NULL , 6 cust_address char(50) NULL , 7 cust_city char(50) NULL , 8 cust_state char(5) NULL , 9 cust_zip char(10) NULL ,10 cust_country char(50) NULL ,11 cust_contact char(50) NULL ,12 cust_email char(255) NULL 13 );#创新新表14 INSERT INTO CustNew15 (16 cust_id,17 cust_name,18 cust_address,19 cust_city,20 cust_state,21 cust_zip,22 cust_country,23 cust_contact,24 cust_email25 )26 SELECT 27 cust_id,28 cust_name,29 cust_address,30 cust_city,31 cust_state,32 cust_zip,33 cust_country,34 cust_contact,35 cust_email36 FROM customers;#将customers表的数据插入新表alter37 SELECT * FROM CustNew;
返回结果如下:
而如果反过来用,大概就是:
1 insert into2 customers3 (列1,列2,......)4 select 5 列1,列2,.....6 from custnew
即可完成将表custnew中的数据全部插入customers,这也完成了一条insert插入多条数据。
通常,一条INSERT 语句,只能插入一行数据,要插入多行,就必须执行多个INSERT,但是, INSERT SELECT 是个例外。
以上方法的复制,实际上是重新在数据库中创建了一个新表。
SELECT INTO:
这种方法,可以在SQL语句运行中创建一个表,并将一个表复制到这个全新的表。
我们可以在实验新的SQL语句前,用其进行复制,这样就不影响到实际数据。
如:
USE test;#使用数据库CREATE TABLE Cucopy asSELECT * FROM customers;#复制SELECT * FROM Cucopy;
返回结果,与上表一致。
17.更新和删除
18.创建和操纵表
这里中点说一下创建表时,指定默认值的问题。一般来说,创建表时,我们需要指定列的数据类型、是否NULL列。关于NULL值具体说明请看下图。
默认值要是用的好,可以省却我们很多时间。
因其经常用于指定默认日期,这里以日期为例。
首先,在MySQL中内建的日期函数:
函数 | 描述 |
---|---|
NOW() | 返回当前的日期和时间 |
CURDATE() | 返回当前的日期 |
CURTIME() | 返回当前的时间 |
DATE() | 提取日期或日期/时间表达式的日期部分 |
EXTRACT() | 返回日期/时间按的单独部分 |
DATE_ADD() | 给日期添加指定的时间间隔 |
DATE_SUB() | 从日期减去指定的时间间隔 |
DATEDIFF() | 返回两个日期之间的天数 |
DATE_FORMAT() | 用不同的格式显示日期/时间 |
创建数据库t2,插入表。如下:
CREATE DATABASE t2;USE t2;CREATE TABLE test(id int(5) NOT NULL,noedate timestamp NOT NULL DEFAULT current_timestamp());
调用如下:
USE t2;INSERT INTO test(id)values(1);SELET * FROM test;
返回结果:
id | nowdate |
1 | 2017-05-08 22:09:45 |
以下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 NOT NULL DEFAULT (‘‘), bb date NOT NULL DEFAULT (getdate()), cc char(50) NOT NULL DEFAULT (null) );
aa 是 int 类型,默认值也得是整型,并且default后边不要()括号 。
bb date类型不支持使用系统默认值,改成timestamp,能过now()取系统时间 。
cc 已经不允许为空(not null)所以不能默认为 null ,可以改成空字符串 。
修改:
CREATE TABLE dnt_forums( aa int NOT NULL DEFAULT 2, bb timestamp NOT NULL DEFAULT now(), cc char(50) NOT NULL DEFAULT ‘‘ );
这个日期问题,依然有很多不太明白的地方,以后学习过程碰到继续解决。
主要参考:
脚本之家、博客
重命名表:
RENAME TABLE cucopy1 TO hi;
删除表:
DROP TABLE hi;
SQL的学习