zoukankan      html  css  js  c++  java
  • 【原】数据库SQL语句入门

    1.数据定义DDL(Data Definition Language)语言即对表结构的一些定义,主要包括动词为CREATE/DROP/ALTER。

    1.1.CREATE语句

    CREATE TABLE <表名> (<列名> <数据类型>[列级完整性约束条件]
    [,<列名> <数据类型>[列级完整性约束条件]]
    ...
    [,<表级完整性约束条件>]
    )
    如果完整性约束条件涉及到该表的多个属性列,则必须定义在表级上,否则既可以定义在列级也可以定义在表级。
    (1)

    CREATE TABLE Student(
    Sno CHAR(9) PRIMARY KEY, /列级完整性约束条件,Sno是主键/
    Sname CHAR(20) UNIQUE, /Sname取唯一值/
    Ssex CHAR(2) DEFAULT '男',
    Sage SMALLINT,
    Sdept CHAR(20)
    )

    (2)

    DROP TABLE IF EXISTS Course;
    create table Course(
    Cno CHAR(4) PRIMARY KEY,
    Cname CHAR(40),
    Cpno CHAR(4),
    Ccredit SMALLINT,
    FOREIGN KEY (Cpno) REFERENCES Course(Cno)/表级完整性约束条件,被参照表是Course,被参照列是Cno/
    )ENGINE=InnoDB DEFAULT CHARSET=utf8;

    (3)

    DROP TABLE IF EXISTS SC;
    CREATE TABLE SC(
    Sno CHAR(9),
    Cno CHAR(4),
    Grade SMALLINT,
    PRIMARY KEY(Sno,Cno),
    FOREIGN KEY(Sno) REFERENCES Student(Sno),
    FOREIGN KEY(Cno) REFERENCES Course(Cno)
    )

    1.2.ALTER语句

    ALTER TABLE <表名>
    [ADD <新列名> <数据类型> [完整性约束]]
    [DROP <完整性约束名>]
    [ALTER COLUMN <列名><数据类型>]
    (1)

    ALTER TABLE Student ADD S_entrance DATE;

    1.3.DROP语句

    DROP TABLE <表名> [RESTRICT|CASCADE]
    若选择RESTRICT:则该表的删除是有限制条件的。欲删除的基本表不能被其他表的约束所引用(如CHECK、FOREIGN KEY等约束),
    不能有视图,不能有触发器,不能有存储过程或函数等。如果存在这些依赖该表的对象,则此表不能被删除。
    若选择CASCADE:则该表的删除没有限制条件。在删除基本表的同时,相关的依赖对象,例如视图都将被一起删除。
    DROP TABLE Student CASCADE

    2.数据操纵语言DML(Data Manipulation Language)即对表格数据中的一些操作,包括的动词为SELECT/INSERT/UPDATE/DELETE

    2.1.SELECT语句

    SELECT [ALL|DISTINCT] <目标列表达式> [,<目标列表达式>]...
    FROM <表名或视图名> [,<表名或视图名>]...
    [WHERE <条件表达式>]
    [GROUP BY <列名1> [HAVING <条件表达式>]]
    [ORDER BY <列名2> [ASC|DESC]]

    • 1.目标列表达式有以下可选格式:
      (1)*
      (2)<表名>.*
      (3)COUNT([DISTINCT|ALL] )
      (4)[<表名>.]<属性列名表达式>[,[<表名>.]<属性列名表达式>]...
      其中<属性列名表达式>可以是由属性列、作用于属性列的聚集函数和常量的任意算数运算(+-
      /)组成的运算公式。
    • 2.聚集函数的一般格式为:
      COUNT/SUM/AVG/MAX/MIN ([DISTINCT|ALL] <列名>)
    • 3.WHERE字句的表达式有以下可选格式:
      (1)<属性列名> <属性列名>/<常量>/ANY|ALL
      (2)<属性列名> [NOT] BETWEEN <属性列名>/<常量>/(SELECT语句) AND <属性列名>/<常量>/(SELECT语句)
      (3)<属性列名> [NOT] IN (<值1>[,<值2>]...)/(SELECT语句)
      (4)<属性列名> [NOT] LIKE <匹配串>
      (5)<属性列名> IS [NOT] NULL
      (6)[NOT] EXISTS (SELECT语句)
      (7)<条件表达式> AND/OR <条件表达式> [AND/OR <条件表达式>]

    2.1.1.单表查询

    (1)简单的查询指定列

    SELECT Sname,Sage FROM Student WHERE Sage<20;

    (2)确定范围,BETWEEN A AND B

    SELECT Sname,Sdept,Sage FROM Student WHERE Sage BETWEEN 20 AND 23;

    (3)查询经过计算的列

    SELECT Sname,2016-Sage FROM student

    (4)查询比较大小后的结果
    用于比较的运算符如下:=(等于),>(大于),<(小于),>=(大于等于),<=(小于等于),!= 或 <>(不等于),!>(不大于),!<(不小于)

    SELECT DISTINCT Sno FROm SC WHERE Grade <60

    (5)确定集合
    谓词IN用来查找属性值属于指定集合的元组

    SELECT Sname,Ssex FROM Student WHERE Sdept [NOT] IN('CS','MA','IS')

    (6)字符匹配
    谓词LIKE用来进行字符串的匹配,其语法格式为:[NOT] LIKE '<匹配字符串>'[ESCAPE '<换码字符>']
    其含义是查找指定的属性列值与<匹配串>相匹配的元组。<匹配串>可以是一个完整的字符串,也可以含有通配符%和_。
    其中,%(百分号)表示任意长度(长度可以为0)的字符串。例如a%b表示以a开头,以b结尾的任意长度的字符串。如acb,addgb,ab等都满足该匹配串。
    _(下横线)代表任意单个字符。例如a_b表示以a开头,以b结尾的长度为3的任意字符串。如acb,afb都满足该匹配串。

    SELECT Sname FROM student WHERE Sname [NOT] LIKE '欧阳__'
    SELECT Sname FROM student WHERE Sname [NOT] LIKE '欧阳%'

    若用户要查询的字符串本身就含有通配符%或_,这是就要使用ESCAPE '<换码字符>'短语,对通配符进行转义。
    ESCAPE ''表示""为换码字符。这样匹配串中紧跟在""后面的字符""不再具有通配符的含义,转义为普通的""字符。
    查询"DB_"开头,且倒数第3个字符为i的课程的详细情况。
    SELECT Cno,Ccredit FROM course WHERE Cname LIKE 'DB_%i__' ESCAPE '';
    (7)涉及空值的查询

    SELECT Cno,Ccredit FROM course WHERE Cno IS [NOT] NULL

    (8)ORDER BY字句

    SELECT * FROM student ORDER BY Sdept,Sage DESC

    (9)聚集函数

    SELECT COUNT(*) FROM student
    SELECT AVG(Sage) FROM student
    SELECT Max(Sage) FROM student

    (10)GROUP BY

    SELECT Cno,COUNT(Sno) FROM SC GROUP BY Cno

    (11)HAVING

    SELECT Sno FROM SC GROUP BY Sno HAVING COUNT(*) >3

    这里先用GROUP BY字句按Sno进行分组,再用聚集函数COUNT对每一组计数。HAVING短语给出了选择组的条件,只有满足条件(即元组个数>3,
    表示此学生选修的课超3门)的组才会被选出来。
    GROUP BY作用于所有的记录,HAVING短语作用于根据关键字GROUP BY后的组。

    2.1.2.连接查询

    自然连接,从表student中找到第一个元组然后和在表SC中逐一查找与其匹配的元组,全表扫描,如果已经建立索引的话,会很快。
    自然连接可能造成不符合条件的元组的舍弃,如果不想舍弃不满足条件的元组,请用左(右)外连接

    SELECT student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade FROM Student,SC WHERE student.Sno=sc.Sno

    自身连接

    SELECT FIRST.Cno,SECOND.Cpno FROM course FIRST,course SECOND WHERE FIRST.Cpno=SECOND.Cno

    外连接:把舍弃的元组也保存在结果关系中,而在其他属性上填空值(Null),那么这种连接就叫做外连接(outer join)。
    左外连接:只把左边关系R中要舍弃的元组保留就叫做左外连接(left outer join或left join)
    右外连接:只把右边关系S中要舍弃的元组保留的叫做右外连接(right outer join或right join)

    SELECT Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade FROM Student LEFT OUTER JOIN SC ON (Student.Sno=SC.Sno)

    多表连接

    SELECT student.Sno,Sname,Cname,Grade FROM student,SC,course WHERE student.Sno=sc.Sno AND sc.Cno=course.Cno

    嵌套查询,即多个SELECT语句嵌套在一起。

    SELECT Sname FROM Student WHERE Sno IN (SELECT Sno FROM SC WHERE Cno='2')

    2.2.INSERT语句

    INSERT INTO <表名>[(<属性列1>[,<属性列2>]...)]
    VALUES (<常量1>[,<常量2>...])

    INSERT INTO student (Sno,Sname,Ssex,Sdept,Sage) VALUES('201612545','Tom','男','IS',18)

    2.3.UPDATE语句

    UPDATE <表名> SET <列名>=<表达式>[,<列名>=<表达式>]... [WHERE <条件>]

    UPDATE student SET Sage=22 WHERE Sno='201612345'

    2.4.DELETE语句

    DELETE FROM <表名> [WHERE <条件>]

    DELETE FROM student WHERE Sno='20161565'

    参考自《数据库系统概论第4版》王珊 萨师煊

  • 相关阅读:
    认识hasLayout——IE浏览器css bug的一大罪恶根源 转
    web网站p教程 转
    可遇不可求的Question之SQLServer的INSERT ON DUPLICATE KEY UPDATE语法篇
    可遇不可求的Question之Protoc.exe无法编译proto文件篇
    python各个版本的下载地址
    可遇不可求的Question之WCF发布无法运行篇
    [转]理解JSON:3分钟课程
    可遇不可求的Question之Silverlight发布IIS设置篇
    可遇不可求的Question之C#中的匿名事件导致内存泄露的解决篇
    可遇不可求的Question之mysql连接数暴增的解决方法篇
  • 原文地址:https://www.cnblogs.com/yourarebest/p/5424486.html
Copyright © 2011-2022 走看看