码迷,mamicode.com
首页 > 数据库 > 详细

SQL的学习

时间:2017-05-10 21:22:12      阅读:347      评论:0      收藏:0      [点我收藏+]

标签:日期时间   ediff   ble   copy   step   weight   日期函数   计算   work   

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_contact
3 from customers
4 where cust_state in (IL,IN,MI)
5 union all
6 select cust_name,cust_contact,cust_email
7 from customers
8 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_contact
3 from customers
4 where cust_state in (IL,IN,MI)
5 union all
6 select cust_name,cust_email,cust_contact
7 from customers
8 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 CustNew
15 (
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_email
25 )
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_email
36 FROM customers;#将customers表的数据插入新表alter
37 SELECT * FROM CustNew;

返回结果如下:

 技术分享

 

 而如果反过来用,大概就是:

1 insert into
2 customers
3 (列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 as
SELECT * 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的学习

标签:日期时间   ediff   ble   copy   step   weight   日期函数   计算   work   

原文地址:http://www.cnblogs.com/sunshinewang/p/6789419.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!