关于
MySql
的
SQL
语言
目前常用的数据库有
Oracle
公司的
Oracle
,
Microsoft
公司的
SQL Server
,
IBM
公司的
DB2
和
MySql
公司的
MySql,
而免费的数据库目前只有
MySql
,当然盗版的不算。
SQL
(Structured Query Language)
结构化查询语言是目前一个国际上标准的数据库专用语言。
不过不同的数据库所使用的
SQL
语句都会稍有一些不同,但基本的标准还是会遵循
SQL
,例如:
用与
SQL Server
的叫做
PL-SQL
,用于
Oracle
的叫做
T-SQL
,它们都是
SQL
的子类,或者说是派生类。用于
MySql
的我还不知道它叫做什么
SQL
,不过个人觉得它反而最接近标准的
SQL
语言,不过,从另一方面来说,它对
SQL
所做的扩展最少。
就我现在的理解
SQL
语言就是用来使用数据库和操作数据用的,不包括操作数据库,那些操作数据库的代码应该叫做命令,如:启动,关闭数据库,设置字符集,设置访问连接用户数等,这些不属于
SQL
语言,不同的数据库都有自己的命令,这些命令是生产企业制定的。下面,我大概来说一下
SQL
所做的事情创建数据库,创建表,插入、修改、删除数据,
查询数据(最主要的是这个功能,方便数据的储存和查询是人们发明数据库的理由)。
当然,我下面介绍的
SQL
都是用于
MySql
的。
SQL
基础知识
一、
数据类型
INT
[
常用
]
整数
BIGIN
大整数
FLOAT
(
单精密
)
浮点数字
DOUBLE
[
常用
] (
双精密
)
浮点数字
NUMERIC(M,D)
[
常用
]
未压缩
(unpack)
的浮点数字,
“
未压缩
”
意味着数字作为一个字符串被存储,值的每一位使用一个字符。例:
NUMERIC(16,2)
表示这个
浮点数字的储存空间为
16
个字节,精度为
2
(即小数点后保留
2
位数字)。
DATE
[
常用
]
日期
DATETIME
[
常用
]
日期和时间组合
CHAR(M)
一个定长字符串
TIMESTAMP(M)
[
常用
]
时间戳记。以
YYYYMMDDHHMMSS
、
YYMMDDHHMMSS
、
YYYYMMDD
或
YYMMDD
格式来显示
TIMESTAMP
值,例:
TIMESTAMP(14)
格式为YYYYMMDDHHMMSS、TIMESTAMP(8) 格式为YYYYMMDD
VARCHAR(M)
[
常用
]
可变长度的字符串
BLOB
大对象存储类型
TEXT
[
常用
]
大文本存储类型,
最大长度为
65535(2^16-1)
个字符
我觉得用的多的类型用
[
常用
]
标记了一下,相关时间的那几个各有各的优点,就看你的需要了。
二、
变量
declare @iAge int --
声明变量
set @iAge = 12 --
给变量附值
print @iAge --
打印变量
select @ iAge:=
’iage’ from employe where name=’Bill’
;
将查询到字段给变量附值
注意
:
这里,
select
语句中我们不得不使用
:=
句法,因为
=
是为比较保留的
三、
逻辑控制
-- IF
条件判断
declare @i int
set @i = 12
if (@i > 10)
begin
print 'Dadadada!'
print 'Dadadada!'
end
else
begin
print 'XiaoXiao!'
print 'XiaoXiao!'
end
-- While
循环控制
declare @i int;
set @i = 12;
print @i
return;
while (@i < 18)
begin
print @i;
set @i = @i + 1;
if @i < 17
continue;
if @i > 15
break;
end;
-- CASE
分支判断
select au_lname, state, '
犹他州
' from authors where state = 'UT'
select au_lname, state, '
密西西比州
' from authors where state = 'MI'
select au_lname, state, '
肯塔基州
' from authors where state = 'KS'
select au_lname, state,
case state
when 'UT' then '
犹他州
'
when 'MI' then '
密西西比州
'
when 'KS' then '
肯塔基州
'
when 'CA' then '
加利福利亚
'
else state
end
from authors
四、
函数
这部分的内容很多
,
我也不是很熟这里就我所知道的列一点
:
--
获取给定字符串的长度
print length('abcdef')
--
大小写转换
print lower('ABCDEF')
print upper('abcdef')
--
去空格
print ltrim(' abcd dfd df ')
print rtrim(' abcd dfd df ')
--
求绝对值
print abs(-12)
--
幂
-- 3
的
2
次方
print power(3,2)
--
随机数
-- 0 - 1000
之间的随机数
print rand() * 1000
--
获取圆周率
print pi()
--
获取系统时间
print now()
--
获取指定时间之间相隔多少年
print datediff(year, '2005-01-01', '2008-01-01')
--
字符串合并
print 'abc' + 'def'
print 'abc' + '456'
--
获取指定时间的特定部分
print datepart(year, now())
--
获取字符串中的一段
print SUBSTRING(
‘
abcdef
’
,1,3)
--
获取纪录个数
select count(*) from employe;
--
获取指定工资的和
select sum(salary) from employe;
--
获取年龄大于
30
岁员工的最高工资
select max(salary) from employe where iage>30;
等等
五、
注释
#
单行注释
--
单行注视
/*
内容
*/
多行注释
SQL
常规应用
一、
创建数据库
用给定的名字创建一个数据库
CREATE DATABASE db_name
删除数据库中给定名字的数据库(慎重使用)
DROP DATABASE [IF EXISTS] db_name
调出要用的数据库
USE db_name
下面是一个完整的创建例子,同时创建了一个数据库
log
文件
--
指定数据库名称
-- (
注:如果数据库名中包含空格可以使用
[]
将其标示
)
create database [Super WC]
--
关于数据文件的定义
on
(
name = Super_WC_Data, --
逻辑名
filename = 'C:\Super_WC_Data.MDF', --
物理路径以及物理名
size = 2MB, --
初始大小
maxsize = 4MB, --
最大限制
filegrowth = 1MB --
增长大小
)
--
关于日志文件的定义
log on
(
name = Super_WC_Log,
filename = 'C:\Super_WC_Log.LDF',
size = 3MB,
maxsize = 7MB,
filegrowth = 20% --
增长比例
)
二、
创建表
drop table if exists auto_incr_test; --
先把以前数据库中有可能存在的表删除
create table auto_incr_test (
id int not null auto_increment, --
这里的
not null
代表这一列的值不能为空默认是
null
name char(40),
timestamp timestamp,
primary key (id) --
创建主键
foreign key (name) references students (no), --
创建外键
)
/*
上面出现的
auto_increment
代表了
id
这个列是一个自动增长列
*/
要删除这个表就用
drop table auto_incr_test;
就可以了
.
下面是包含约束的情况(设置约束可以增强数据库的完整性,但需要事先精确的设计,因为改动起来实在是太麻烦了):
create table students
(
no char(4) not null auto_increment primary key,
name nvarchar(8) not null,
birthday datetime check(datediff(year, birthday, now()) >= 18),
age as datediff(year, birthday, now ()),
sex nchar(1) not null default('
女
') check(sex = '
女
' or sex = '
男
'),
phone char(11) check((phone is null) or (length(phone) = 11)),
address nvarchar(24)
)
注意:表创建后修改起来比较麻烦,如果不是一定要修改的话可以删了再创建,尽量设计时就把握好需求,设计完美一点。
三、
数据操作
(
添、删、改、查
)
ß
传说中著名的添删改查
添加操作
(insert)
的语法格式:
Insert [into]
数据表
(
字段
) values (
数据
) -- [into]
可以省略
例:INSERT tbl_name (col1,col2) VALUES(15,
’abc’
);
修改操作
(update)
的语法格式:
Update
数据表
set
字段
=
新值
where
条件
例:UPDATE tbl_name SET col2=
’BBB’ WHERE col2=’abc’;
删除操作
(delete)
的语法格式:
Delete [from]
数据表
where
条件
-- []
内的可写可不写,最好是写,不过懒人都不写
例:DELETE tbl_name
WHERE col2=’abc’
;
查询操作
(select)
的语法格式:
select
字段
from
数据表
where
条件
order by
字段
desc/asc
/*
这里的
order by
是用来指定排序依赖列,
desc
是指以降序排列(默认的是
asc
升序)
*/
例:SELECT col1,col2 FROM tbl_name
WHERE col2=’abc’ ORDER BY col1 DESC
;
注意:方便数据的储存和查询是人们发明数据库的理由,所以查询操作是
SQL
中的精髓之一,我上面的格式只是列出了较常用的格式,但只要是程序功能要求稍微复杂点的就要用到许多查询语句的高级特性了,我会在后面介绍我所能了解的。
SQL
高级应用
一、
高级查询
1
.高级查询(就是把
SQL
定义的
SELECT
语句的语法都用到了的)
SELECT [STRAIGHT_JOIN] [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [HIGH_PRIORITY]
[DISTINCT | DISTINCTROW | ALL]
select_expression,...
[INTO {OUTFILE | DUMPFILE} 'file_name' export_options]
[FROM table_references
[WHERE where_definition]
[GROUP BY col_name,...]
[HAVING where_definition]
[ORDER BY {unsigned_integer | col_name | formula} [ASC | DESC] ,...]
[LIMIT [offset,] rows]
[PROCEDURE procedure_name] ]
GROUP BY
用于分组查询
HAVING
用于聚合函数的查询条件
LIMIT
用于限制SELECT
语句返回的行数
2
.多表查询(又叫联合查询)
查找与多个表相关的数据,例:
Select name,iage,city from students a inner join address b where a.addressid=b.id and name=
’Bill’
;
3
.子查询(很多内容,我不能尽举)
有两种类型的子查询:“嵌套”子查询和“相关”子查询。
例:
--
子查询
--
根据作者的名查找其编写的书籍
--
先通过子查询获取作者编号
--
然后,将其作为查询条件,找出相应的书籍编号
--
最后,在利用所得到的书籍编号来得到书籍信息
select au_id, title_id from titleauthor
where au_id =
(select au_id from authors where au_lname = 'Green')
select * from titles
where title_id in
(
select title_id from titleauthor
where au_id =
(select au_id from authors where au_lname = 'Green')
)
二、
视图
CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
例:
CREATE VIEW v AS SELECT qty, price, qty*price AS value FROM t;
三、
存储过程
CREATE PROCEDURE sp_name ([proc_parameter[,...]])
[characteristic ...] routine_body
例:
create procedure proGetJobsByPage
@CurrentPageSize int,
@PageSize int,
@CurrentPage int
as
Declare @strSql nvarchar(400)
set @strSql = 'select * from
(select top ' + convert(nvarchar(4), @CurrentPageSize) + ' *
from (select top ' + convert(nvarchar(4),(@PageSize * @CurrentPage)) + ' * from jobs) as tt
order by job_id desc) as stt
order by job_id'
exec sp_executesql @strSql
四、
触发器
CREATE TRIGGER trigger_nametrigger_timetrigger_event
ON tbl_name FOR EACH ROW trigger_stmt
例:
--
创建插入触发器
create trigger emp_marins
on emp_mgr
for insert
as
declare @e char(30),@m char(30)
declare cur_mgr cursor for
select emp_mgr.emp
from emp_mgr,inserted
where emp_mgr.emp = inserted.mgr
open cur_mgr
fetch next from cur_mgr into @e
while @@fetch_status = 0
begin
update emp_mgr
set emp_mgr.NoOfReports = emp_mgr.NoOfReports + 1
where emp_mgr.emp = @e
fetch next from cur_mgr into @e
end
close cur_mgr
deallocate cur_mgr
五、
索引(很有用,可以提高查询语句的执行效率)
CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name
[USING index_type]
ON tbl_name (index_col_name,...)
例:
此处展示的语句用于创建一个索引,索引使用列
name
。
CREATE INDEX part_of_name ON customer (name);
OK
,先些这些啦,累死了,呵呵
…
(如有错误,请大家不吝赐教
…
)
--- 冰川
2006-12-03