博学而笃志,好问而近思

【原创】关于MySql的SQL语言

关于 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) 格式为YYYYMMDDHHMMSSTIMESTAMP(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

posted on 2006-12-03 21:08 冰川 阅读(1289) 评论(2)  编辑  收藏

评论

# re: 【原创】关于MySql的SQL语言 2006-12-07 22:02 mlsx

"而免费的数据库目前只有 MySql "
其实开源或者免费的数据库还有很多,比如和MySQL齐名的PostgreSQL(http://www.postgresql.org/),BDB等。

下面的链接是有关由数据的条目的介绍:

http://www.faqs.org/faqs/databases/free-databases/

有点找茬的味道,呵呵。
  回复  更多评论   

# re: 【原创】关于MySql的SQL语言 2006-12-08 09:15 冰川

呵呵,那个找茬的,哪天我也会找回去的
来而不往,非礼也  回复  更多评论   


只有注册用户登录后才能发表评论。


网站导航:
 
<2006年12月>
262728293012
3456789
10111213141516
17181920212223
24252627282930
31123456

导航

统计

常用链接

留言簿(14)

随笔档案

BlogJava的帮助

朋友的博客

搜索

最新评论

阅读排行榜

评论排行榜

快乐工作—享受生活