关于 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())
-- 获取字符串中的一段
printSUBSTRING( ‘ abcdef ’ ,1,3)
-- 获取纪录个数
select count(*) from employe;
-- 获取指定工资的和
select sum(salary) fromemploye;
-- 获取年龄大于 30 岁员工的最高工资
select max(salary) fromemploye 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 existsauto_incr_test; -- 先把以前数据库中有可能存在的表删除
create table auto_incr_test (
id int not nullauto_increment, -- 这里的 notnull 代表这一列的值不能为空默认是 null
name char(40),
timestamp timestamp,
primary key (id) -- 创建主键
foreign key (name) referencesstudents (no), -- 创建外键
)
/* 上面出现的 auto_increment 代表了 id这个列是一个自动增长列 */
要删除这个表就用 drop tableauto_incr_test; 就可以了 .
下面是包含约束的情况(设置约束可以增强数据库的完整性,但需要事先精确的设计,因为改动起来实在是太麻烦了):
create table students
(
no char(4) not null auto_incrementprimary 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((phoneis 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 条件
例:UPDATEtbl_name SET col2= ’BBB’ WHEREcol2=’abc’;
删除操作 (delete) 的语法格式:
Delete [from] 数据表 where条件 -- [] 内的可写可不写,最好是写,不过懒人都不写
例:DELETEtbl_name WHEREcol2=’abc’ ;
查询操作 (select) 的语法格式:
select 字段 from数据表 where 条件 order by 字段 desc/asc
/* 这里的 order by 是用来指定排序依赖列, desc 是指以降序排列(默认的是 asc 升序) */
例:SELECTcol1,col2 FROM tbl_name WHEREcol2=’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]
[FROMtable_references
[WHEREwhere_definition]
[GROUP BYcol_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 joinaddress b where a.addressid=b.id and name= ’Bill’ ;
3 .子查询(很多内容,我不能尽举)
有两种类型的子查询:“嵌套”子查询和“相关”子查询。
例:
-- 子查询
-- 根据作者的名查找其编写的书籍
-- 先通过子查询获取作者编号
-- 然后,将其作为查询条件,找出相应的书籍编号
-- 最后,在利用所得到的书籍编号来得到书籍信息
select au_id, title_id from titleauthor
where au_id =
(select au_idfrom authors where au_lname = 'Green')
select * from titles
where title_id in
(
selecttitle_id from titleauthor
whereau_id =
(selectau_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 ASSELECT 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
(selecttop ' + convert(nvarchar(4), @CurrentPageSize) + ' *
from(select top ' + convert(nvarchar(4),(@PageSize * @CurrentPage)) + ' * fromjobs) as tt
order byjob_id desc) as stt
order byjob_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
selectemp_mgr.emp
fromemp_mgr,inserted
whereemp_mgr.emp = inserted.mgr
open cur_mgr
fetch next from cur_mgr into @e
while @@fetch_status = 0
begin
updateemp_mgr
setemp_mgr.NoOfReports = emp_mgr.NoOfReports + 1
whereemp_mgr.emp = @e
fetch nextfrom 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 ,先些这些啦,累死了,呵呵 …
(如有错误,请大家不吝赐教 … )