捐赠 | 广告 | 注册 | 发布 | 上传 | 关于我们    
  粤ICP备10103342号 DELPHI盒子 | 盒子文章 | 盒子问答悬赏 | 最新更新 | 盒子检索 | 下载中心 | 高级搜索    
  精品专区 | 繁體中文 | 奖励公告栏 | 直通车账号登陆 | 关闭GOOGLE广告 | 临时留言    
 
广告
评论:SQL基本要領
dglianda 21291 2006/1/29 1:21:53
谢谢!
aasxn 16051 2005/6/30 11:11:38
怎么了? 我喜欢!
smartroses 8626 2004/9/22 15:44:57
very good!
tim001 8076 2004/8/27 13:35:45
共享精神已经很不错了
kevinphoenix 7140 2004/7/25 13:12:04
这种东西也拿得出手?!!!
iliyaku 6480 2004/7/3 12:59:21
一个字, 强!
jijing 5874 2004/6/9 20:48:36
双语的阿、你们串通的吧 哈哈
swgweb 5365 2004/5/29 13:32:37
我送上简体的,以便用户阅读

SQL基本要领

SQL(Structured Query Language)数据型态(SQL Data Type)
    数据型态代表数据放在数据中的格式,Local Interbase 数据型态共有十种

◆SMALLINT:为2Bytes的整数(16 位的整数),其范围值为  -32768~32767
    使用于较小的整数字段以省硬盘空间,并可加快数据理的度
  例 货品编号(goods_no) 为 SMALLINT
    goods_no  SMALLINT
◆INTEGER:为4Bytes的整数(32 位的整数),其范围值为   
          -2147483648~2147483647
    使用于较大的整数字段,改善 SMALLINT 存放整数值大的缺点
    若在货品编号大于32767,无法以 SMALLINT表示则可订货品编号为INTEGER
  例 goods_no INTEGER 
◆NUMERIC:数值数据可指定整数及小数字数
    p 精确值和 s 大小的十进制整数,精确值p是指全部有几个数(digits)
    大小值,s是指小数后有几位数。如果没有特别指定,则系统会设为 
    p=5; s=0 
  NUMERIC及DECIMAL可储放190 进位的数值资料
  例 NUMERIC[precision[,scale]]
    若小数未指定,则内定值为0;
    若未指定精确度(整数字数)及小数点位数,则NUMERIC将自动转为INTEGER
    例员工薪资字段为15位整数,2位小数如下
      salary NUMERIC(15,2)
◆DECIMAL:数值数据可指定整数及小数字数
  例 DECIMAL[precision[,scale]]
    若小数未指定,则内定值为0;
    若未指定精确度(整数字数)及小数点位数,则NUMERIC将自动转为INTEGER
    例员工薪资字段为15位整数,2位小数如下
      salary NUMERIC(15,2)
◆DOUBLE PRECISION:64位双精确变量其范围值1.7x10-3808~1.7x10308
◆CHAR:固定长度的字符串型态,长度限制为值1~32767字节
  固定长度数据型态,存放的数据为系统采用的字符集(ASCII及EBCDIC)中的任意 
  字符,使用CHAR的数据型态时必须指定字符数据长度
  例 部门编号字段
     DEPT_NO CHAR(3)
     当字符数据宣告为固定长度时,
     若输入的数据小于数据域位长度,将自动以空格符补满字段;
     若输入的数据大于数据域位长度,超过部份将自动被舍去
◆VARCHAR:变量长度的字符串,长度限制为值1~32765★★★★★★(书D_6 15_7)
  存放变量长度的字符数据,宣告时必须指定字段可能的最大长度,当输入者的
  数据小于字段长度时,只存放输入的字符,故占用较少的空间
  例 员工的国别(job_country)为VARCHAR(15)
     job_country VARCHAR(15)
  注:CHAR 较浪费磁盘空间,但执行效率高
     VARCHAR:较节省磁盘空间,但执行效率低
◆DATE:日期型态,其范围值为  Jan 1, 100~Dec 11,5941
    存放日期格式数据(包含了 年份、月份、日期)
    例员工雇用日期(hire_date)
       hire_date Date Default 'Now' Not Null
       Default 设字段的初值 
       Now为 Interbase 的特殊用法,代表系统日期,也就是hire_date 的
              初始值系统日期;
       Not Null 代表字段新增数据时,必须指定字段值

◆FLOAT:存放浮点数,同REAL型态(32位的实数)
  Interbase 的FLOAT数据型态最大8位有效数字,超过有效数字时,则以科学
    符号表示
  例  1.23456789e+08
◆BLOB大型对象数据型态,通常用以存放备忘数据,声音 影像等多媒体数据
  可储存大型对象的数据型态备忘数据(memo)声音(Wave)影像(image/picture)
  例 CREATE TABLE IMAGE_PRODUCT
     (FILENAME CHAR(12) NOT NULL PRIMARY KEY,
      MEMO BOLOB SUB_TYPE 1,
      BITMAP BOLOB SUB_TYPE -1,
      EXEjob_BOLOB SUB_TYPE -2)
  Interbase 将BOLOB字段分为数种子型态(SUB_TYPE),子型态
    1代表备忘数据域,负整数的子型态为使用者定义的子型态
   -1为可存放位图的字段型态
   -2可存放像执行文件的数据型态

建立数据库(Create Table)
  1、建资料表:
    create table table_name(column1_name data_type [DEFAULT data_value]                             
                            [null | not null [,...] )
      说明:table_type 数据表这数据表包含一个或多个指定数据型态的字段
        DEFAULT 指定字段初始值data_value 
        null表示是否允许数据的值为null当指定字段not null时,数据库系统将
        拒绝新增 null 数据至该字段
      例 CREATE TABLE customer(First_Name char(50),Last_Name char(50),
      Address char(50),City char(50),Country char(25),Birth_Date date) 
  2、更改数据表  
    alter table table_name add column column_name datatype 
    说明:增加一个字段(没有删除某个字段的语法。)
    lter table table_name add primary key (column_name)
    说明:更改表得的定义把某个字段设为主键。
    alter table table_name drop primary key (column_name)
    说明:把主键的定义删除。
  3、建立索引  
    create UNIQUE index empno_idx on table_name(emp_no)
    说明:对某个表格的字段建立索引以增加查询时的速度。
  4、删除  
    drop Table table_name //删除数据表 
    drop Table temp       //删除temp数据表
    drop Index index_name //删除索引

数据操作语言 DQL(Data Manipulation Language)

常用、主要的SQL指令:
●Select(选取数据,属DQL)
  数据查询
     SELCET * FROM Table                    //过滤显示所有数据库
     SELCET Name, Tel FROM Table            //过滤显示 Name Tel 资料
     SELCET DISTINCT dept_no FROM table_name //DISTINCT 取消重复部份
     SELCET DISTINCT au_lname FROM authors WHERE au_lname="Ringer"  
     SELCET full_name, salsry*12 FROM table_name //全名及计算年薪
     SELCET full_name, salsry*12 AS year_salary FROM table_name
      //在ISO 的SQL 语法标准中允许使用AS子句重新命名字段名称 
     SELCET * FROM table_name WHERE column1 = xxx [and column2 > yyy] 
              [or column3 <> zzz]
------------------------------------------------------------------
  整合性的查询:
    SELCET count (*) FROM table_name WHERE column_name = xxx
      //查询符合条件的数据共有几笔。
    SELCET SUM(column1) FROM table_name
      说明:
      1.计算出总和,所选的字段必须是可数的数字形态。
      2.除此以外还有 avg() 是计算平均、max()、min()计算最大最小值的
        整合性查询。
------------------------------------------------------------------
  组合查询
    组合查询是指所查询得数据来源并不只有单一的表格,而是联合一个以上
        的表格纔能够得到结果的。
    SELCET * FROM table1,table2 WHERE table1.colum1=table2.column1
      说明:
      1.查询两个表格中其中 column1 值相同的数据。
      2.当然两个表格相互比较的字段,其数据形态必须相同。
      3.一个复杂的查询其动用到的表格可能会很多个。
------------------------------------------------------------------
  复合性的查询
    SELCET * FROM table_name1 WHERE exists ( SELCET * FROM 
            table_name2 WHERE conditions )
      说明:1.where 的 conditions 可以是另外一个的 query。
            2.exists 在此是指存在与否。
    SELCET * FROM table_name1 WHERE column1 IN ( SELCET column1 
             FROM table_name2 WHERE conditions )
      说明:1. in 后面接的是一个集合,表示column1 存在集合里面。
            2. select 出来的数据形态必须符合 column1。 
------------------------------------------------------------------
  其它查询
    SELCET * FROM table_name1 WHERE column1 LIKE 'x%' 
      //说明:like 必须和后面的'x%' 相呼应表示以 x为开头的字符串。
    SELCET * FROM table_name1 WHERE column1 IN ('xxx','yyy',..)
      //说明:in 后面接的是一个集合,表示column1 存在集合里面。
    SELCET * FROM table_name1 WHERE column1 BETWEEN xx AND yy
      //说明:between 表示 column1 的值介于 xx 和 yy 之间。 
    SELCET * FROM 程序基本数据 WHERE 阳上姓名 LIKE "% 杨 %";
      //过滤不特定"徐"的数据
    SELCET * FROM Table WHERE Name LIKE "*徐*" 
      //过滤特定"徐"之中的数据
    SELCET full_name,hire_dat,phone_exit FROM table_name
       WHERE lase_name LIKE 'Le#%' ESCAPE '#';
      //ESCAPE 比对符号要检查lase_name是否内含'Le#% 的字符串
    SELCET full_name,hire_dat,phone_exit FROM table_name
       WHERE lase_name LIKE 'L%';    
    //lase_name LIKE 'L%' 代表第一个字母须以L字母为开头其余可任意字符串

    //lase_name NOT LIKE 'L%' 代表第一个字母不得为L字母 
    //lase_name LIKE 'L%' 代表第一个字母须以L字母为开头其余可任意字符串
    //lase_name LIKE 'L__' 姓氏须三个字符第一个字符为 L
                           (底线字符'_'类似DOS下的'?'字符)  
    //lase_name LIKE '%ee%'代表任何内含'ee'字符串 
    //lase_name LIKE '%e'最后一个字符须为'e'
------------------------------------------------------------------
  资料筛选
   资7料单一搜寻
     SELCET full_name, hire_date,phone_exit FROM table_name 
            WHERE dept_no=600 //显示部门代号等于600的所有员工....
     SELCET full_name,hire_dat,phone_exit FROM table_name
            WHERE phone_exit IS NULL 
        //列出所有没有分机号码的员工姓名(雇员)  
     SELCET full_name,hire_dat,phone_exit FROM table_name
            WHERE phone_exit IS NOT NULL 
        //列出所有有分机号码的员工姓名<非NULL值>
------------------------------------------------------------------
   数据多重搜寻
     SELCET full_name,phone_exit FROM table_name
            WHERE phone_exit IS NULL AND hire_date > '20-jan-1992';
             //未有分机且进入公司(雇员)日期之后员工
     <多资料表连结>
     SELCET full_name, job_country, currency FROM table_name,             
            table_name1 WHERE job_country = table_name1
     SELCET full_name, job_country, currency FROM table_name,             
            LEFT JOIN country ON job_country = table_name1
------------------------------------------------------------------
   搜寻数据范围
     SELCET full_name,salary FROM table_name 
            WHERE salary BETWEEN 100000 AND 200000; 
             //列出薪资在100000至200000的员工
     SELCET full_name,salary FROM table_name 
            WHERE salary >= 100000 AND salary <= 200000;
             //比较运算的查询语言
     SELCET full_name,job_country FROM table_name//集合成员运算(IN子句)
            WHERE job_country IN('Italy France')//意大利及法国员工
------------------------------------------------------------------
 数据排序结果
  单一排序数据
    SELCET full_name,salary,dept_no FROM table_name ORDER BY dept_no
      //依各部门代号顺序列出员工姓名及薪资
    SELCET column1,column2 FROM table_name order by column2 [desc]
      //说明:order by 是指定以某个字段做排序,[desc]是指从大到小排列,
          若没有指明,则是从小到大排列
    SELCET * FROM Table Order By Age Desc;  
      //以年龄栏反排序
  多栏排序数据
    SELCET full_name,salary,dept_no FROM table_name ORDER BY 
           dept_no, salary DESC;
      //部门代号由小而大,薪资由大而小输出所有员工姓名
------------------------------------------------------------------
 SQL合计函数(aggregate function)
    AVG  :平均值
    COUNT:笔数
    MIN  :最小值
    MAX  :最大值
    SUM  :加总值
    SELECT dept_no COUNT(salary)FROM table_name //错误的
    SELECT dept_no MAX(salary)FROM table_name   //错误的
    SELECT dept_no MAX(salary)FROM table_name GROUP BY dept_no//正确的 
    < COUNT 的应用 >
    SELECT COUNT(*)FROM table_name WHERE dept_no = 100
       //合计代号100的部门中有几位员工
    < COUNT(DISTINCT) 的应用 >
    SELECT COUNT(DISTINCT dept_no) FROM table_name 
       //公司共有几个部门
    < COUNT及SUM 的应用 >
    SELECT COUNT(*),SUM(salsry)FROM table_name WHERE dept_no = 100
       //部门代号为100的员工人数及薪资总数
    < MIN,MAX,AVG 的应用 >
    SELECT MIN(salsry),MAX(salsry),AVG(salsry)FROM table_name 
           WHERE dept_no = 100
       //部门代号为100的员工的最低薪资和最高薪资及平均薪资
    < GROUP BY子句应用 >
    SELECT COUNT(*),MIN(salsry),MAX(salsry),SUM(salsry)
           FROM table_name GROUP BY dept_no 
       //找出所有部门的人数最低薪资  最高薪资  薪资总数
    < HAVING子句应用 >
    SELECT COUNT(*),MIN(salsry),MAX(salsry),SUM(salsry)
           FROM table_name GROUP BY dept_no HAVING COUNT(dept_no)>2
       //找出所有部门的人数大于2个人的最低薪资  最高薪资  薪资总数
------------------------------------------------------------------
●Insert(新增资料,属DML)
  INSERT INTO 数据表名称 Values (字段1, 字段2,...);
  INSERT INTO table_name VALUES('Taiwan','NTD');
  INSERT INTO table_name(country,currency)VALUES('Taiwan','NTD');
     //table_name中有country,currency 两个字段 
  INSERT INTO table_name[(column_list)] SELECT column_list FROM 
         another_table_name...... 
     //复制多笔数据至另一数据表
  INSERT INTO table_name1 SELECT *  FROM table_name 
           //table_name 数据表所有数据加入table_name1中
  INSERT INTO Table Values ("陈建中","037-271135","苗市中路","40");
  INSERT INTO table_name(column1,column2,...)values(value1,value2,...)
    说明:1.若没有指定column 系统则会按表格内的字段顺序填入数据。
          2.字段的数据形态和所填入的数据必须吻合。
          3.table_name 也可以是景观 view_name。
  INSERT INTO table_name (column1,column2,...) select 
             columnx,columny,... from another_table
    说明:也可以经过一个子查询(subquery)把别的表格的数据填入。

●Update(更新数据,属DML)
    < 允许更新己存在的数据表数据>
    UPDATE table_name SET coumn_name1=data_value1[,coumn_name2 
               =data_value2,.........] WHERE search_condition]
      //table_name 须为数据表或可更新的view名称
      //SET 欲更新字段名称
      //WHERE 子句用指定更条件(可省略)WHERE 子句中search_condition
        条件符合会更新数据;更新的字段值须以字段所定义的数据型庇兼容 
    < 更新所有数据>
    UPDATE table_name SET salary =salary*1.05;
      //员工薪资依物价上涨年增率5%调整  
    < 更新指定数据>
    UPDATE table_name SET salary =salary*1.1 WHERE dept_no=100;
      //所有部门代号100的员工薪资调升 1.1
    < 更新多个字段> 
    UPDATE table_name SET job_grade=1 =salary= 11000 WHERE emp_no=2;
      //编号2号员工职级2级晋升为1级 ,薪资并调升110000
    UPDATE table_name SET column1='xxx' WHERE conditoins
    说明:
      1.更改某个字段设定其值为'xxx'。
      2.conditions 是所要符合的条件、若没有 where 则整个 table 的那个
        字段都会全部被更改。
●Delete(删除数据,属DML)
    < 删除指定的数据>
    DELETE FROM table_name WHERE dept_no=621;
       //部门代号621被裁撤
    < 删除所有的数据>
    DELETE FROM table_name
    DELETE * FROM table_name//错误的
    DELETE FROM table_name WHERE conditions
      说明:删除符合条件的资料。
      说明:关于where条件后面如果包含有日期的比较,不同数据库有不同的
            表达式。具体如下:
       (1)如果是access数据库,则为:where mydate>#2000-01-01# 
       (2)如果是oracle数据库,则为:where mydate>cast('2000-01-01' 
          as date) 或:where mydate>to_date('2000-01-01','yyyy-mm-dd')
   在delphi中写成:
    thedate='2000-01-01';
    query1.sql.add('select * from abc where 
                    mydate>cast('+'+thedate+'+' as date)'); 
    如果比较日期时间型,则为:
    query1.sql.add('select * from abc 
    where mydatetime>to_date('2000-01-01 10:00:01','yyyy-mm-dd 
                              hh24:mi:ss')
tim001 4458 2004/4/29 11:15:16
OK
shaoxiao 4165 2004/4/22 19:20:43
it is simple but very useful thanks 
guofengnikon 2444 2004/2/22 20:23:58
谢谢  真是让我更好的学习啊
guohui 2420 2004/2/21 17:06:09
小儿科
waterstone 1936 2004/1/30 12:40:29
好!
太好了!
kwbin 1581 2004/1/7 19:03:30
但是如果更新的数据字段中含有双引号和单引号怎么办呢?
kwbin 1580 2004/1/7 18:57:15
啊 !简直是雪中送炭啊!
第一页 上一页 下一页 最后页 有 15 条纪录 共1页 1 - 15
 用户名:
 密 码:
自动登陆(30天有效)
 
  DELPHI盒子版权所有 技术支持:深圳市麟瑞科技有限公司 1999-2024 V4.01 粤ICP备10103342号 更新RSS列表