首页 > 代码库 > SQL的学习

SQL的学习

SQL的学习之路,主要参考资料是:

  1. SQL必知必会
  2. 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_namecust_emailcust_contact
Village Toyssales@villagetoys.comJohn Smith
Fun4Alljjones@fun4all.comJim Jones
The Toy Store Kim Howard
Fun4AllJim Jonesjjones@fun4all.com
Fun4AllDenise L. Stephensdstephens@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_emailcust_contact
Village Toyssales@villagetoys.comJohn Smith
Fun4Alljjones@fun4all.comJim Jones
The Toy Store Kim Howard
Fun4Alljjones@fun4all.comJim Jones
Fun4Alldstephens@fun4all.comDenise 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;

返回结果:

idnowdate
12017-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的学习