精华内容
下载资源
问答
  • SQL是结构化查询语言(structrued query language)缩写,它实际上包括查询、定义、操纵和控制四个部分,是一种功能齐全的数据库语言。该语言早在70年代中期由Boyce和Chamberlin提出。由于SQL具有语言简洁、方便实用...
  • 包括数据模型、数据库结构、数据库系统、数据库设计、关系运算、关系规范化、关系查询(SQL语言)等方面知识;介绍至少一种实际的数据库管理系统构成与使用。目的使学生通过学习和上机操作实践掌握数据库系统...
  • 实际的应用系统开发中会设计多个数据表,每个表信息不是独立存在,而是若干个表之间信息存在一定关系,当用户查询某一个表信息时,很可能需要查询关联数据表信息,这就是多表关联查询

    一、SQL 查询语言

    1.1 多表关联查询

    1.1.1 多表关联查询介绍
    在实际的应用系统开发中会设计多个数据表,每个表的信息不是独立存在的,而是若干个表之间的信息存在一定的关系,当用户查询某一个表的信息时,很可能需要查询关联数据表的信息,这就是多表关联查询。

    SELECT语句自身是支持多表关联查询的,多表关联查询要比单表查询复杂得多。多表关联查询有内连接、外连接、自然连接和交叉连接等。

    1.1.2 表的别名
    在多表关联查询时,如果多个表之间存在同名的列,则必须使用表名来限定列的引用。但是,随着查询变得越来越复杂,语句就会因为每次限定列必须输入表名而变得冗长。

    对于这种情况,SQL语言提供了设定表别名的机制,使用简短的表别名就可以替代原有较长的表名称,这样就可以大大缩减语句的长度。

    select a.id ida, a.name namea, a.sal, b.id idb, b.name nameb, b.age 
      from emp as a, users as b
     where a.id = b.id
    

    另外,还需要注意一点,一旦在FROM子句中为表指定了别名,则必须在剩余的子句中都使用表的别名,而不允许再使用原来的表名称

    • 表的别名在FROM子句中定义,别名放在表名之后,它们之间用空格隔开。
    • 别名一经定义,在整个查询语句中就只能使用表的别名而不能再使用表名。
    • 表的别名只在所定义的查询语句中有效。
    • 应该选择有意义的别名,表的别名最长为30个字符,但越短越好。

    1.1.3 内连接
    内连接是一种常用的多表关联查询方式,一般使用关键字INNER JOIN来实现。其中,INNER关键字可以省略,当只使用JOIN关键字时,语句只表示内连接操作。

    在使用内连接查询多个表时,必须在FROM子句之后定义一个ON子句,ON子句指定内连接操作列出与连接条件匹配的数据行,使用比较运算符比较被连接列的值。

    简单地说,内连接就是使用JOIN指定用于连接的两个表,使用ON指定连接表的连接条件。若进一步限制查询范围,则可以直接在后面添加WHERE子句。

    内连接的语法格式如下:

    SELECT columns_list
      FROM table_name1 [INNER] JOIN table_name2
        ON join_condition;
    
    • columns_list:字段列表。
    • table_name1和table_name2:两个要实现内连接的表。
    • join_condition:实现内连接的条件表达式。
    select a.id ida, a.name namea, a.sal, b.id idb, b.name nameb, b.age 
      from emp as a inner join users as b
        on a.id = b.id
    

    1.1.4 外连接
    使用内连接进行多表查询时,返回的查询结果中只包含符合查询条件和连接条件的行。内连接消除了与另一个表中的任何行不匹配的行,而外连接扩展了内连接的结果集,除了返回所有匹配的行外,还会返回一部分或全部不匹配的行,这主要取决于外连接的种类。

    外连接通常有以下3种。

    • 左外连接:关键字为LEFT OUTER JOINLEFT JOIN
    • 右外连接:关键字为RIGHT OUTER JOINRIGHT JOIN
    • 完全外连接:关键字为FULL OUTER JOINFULL JOIN
      与内连接不同的是,外连接不只列出与连接条件匹配的行,还能够列出左表(左外连接时)、右表(右外连接时)或两个表(全部外连接时)中所有符合搜索条件的数据行。

    (1)左外连接
    左外连接的查询结果中不仅包含了满足连接条件的数据行,而且还包含左表中不满足连接条件的数据行。

    select a.id ida, a.name namea, a.sal, b.id idb, b.name nameb, b.age 
      from emp as a left join users as b
        on a.id = b.id
    

    (2)右外连接
    右外连接的查询结果中不仅包含了满足连接条件的数据行,而且还包含右表中不满足连接条件的数据行。

    select a.id ida, a.name namea, a.sal, b.id idb, b.name nameb, b.age 
      from emp as a right join users as b
        on a.id = b.id
    

    在外连接中也可以使用外连接的连接运算符,外连接的连接运算符为“(+)”,该连接运算符可以放在等号的左边,也可以放在等号的右边,但一定要放在缺少相应信息的那一边。

    //左外连接
    select a.id ida, a.name namea, a.sal, b.id idb, b.name nameb, b.age 
      from emp as a, users as b
     where a.id = b.id(+)
    
    //右外连接
    select a.id ida, a.name namea, a.sal, b.id idb, b.name nameb, b.age 
      from emp as a, users as b
     where a.id(+) = b.id
    

    使用“(+)”操作符时应注意:

    • 当使用“(+)”操作符执行外连接时,如果在WHERE子句中包含多个条件,则必须在所有条件中都包含“(+)”操作符。
    • “(+)”操作符只适用于列,而不能用在表达式上。
    • “(+)”操作符不能与ON和IN操作符一起使用。

    (3)完全外连接
    在执行完全外连接时,Oracle会执行一个完整的左外连接和右外连接查询,然后将查询结果合并,并消除重复的记录行。

    select a.id ida, a.name namea, a.sal, b.id idb, b.name nameb, b.age 
      from emp as a full join users as b
        on a.id = b.id
    

    1.1.5 自然连接
    自然连接和内连接的功能相似,自然连接是指在检索多个表时,Oracle会将第一个表中的列与第二个表中具有相同名称的列进行自动连接。

    在自然连接中,用户不需要明确指定进行连接的列,这个任务由Oracle系统自动完成,自然连接使用NATURAL JOIN关键字。

    select id, name, sal, age 
      from emp natural join users
    

    由于自然连接强制要求表之间必须具有相同的列名称,这样容易在设计表时出现不可预知的错误,所以在实际应用系统开发中很少用到自然连接。

    需要注意的是,在使用自然连接时,不能为列指定限定词(即表名或表的别名),否则Oracle系统会弹出“ORA-25155: NATURAL连接中使用的列不能有限定词”的错误提示。

    1.1.6 自连接
    在应用系统开发中,用户可能会拥有“自引用式”的外键,“自引用式”外键是指表中的一个列可以是该表主键的一个外键。

    自连接主要用在自参考表上显示上下级关系或者层次关系,自参照表是指在同一张表的不同列之间具有参照关系或主从关系的表。

    select id1, id2, name, sal, age 
      from emp a left join emp b
        on a.id1 = b.id2
    

    因为自连接是在同一张表之间的连接查询,所以必须定义表别名。

    1.1.7 交叉连接
    交叉连接实际上就是不需要任何连接条件的连接,它使用CROSS JOIN关键字来实现,其语法格式如下:

    select colums_list
      From table_name1 cross join table_name2
    
    • colums_list:字段列表。
    • table_name1和table_name2:两个实现交叉连接的表名。

    交叉连接的执行结果是一个笛卡尔积,这种查询结果是非常冗余的,但可以通过WHERE子句来过滤出有用的记录信息

    1.2 子查询

    1.2.1 子查询介绍
    在执行数据操作(包括查询、添加、修改和删除等)的过程中,如果某个操作需要依赖于另外一个SELECT语句的查询结果,那么就可以把SELECT语句嵌入到该操作语句中,这样就形成了一个子查询。实际上,在关系型数据库中,各表之间的数据关系非常密切,它们相互关联,相互依存,这样就可以根据数据之间的关系使用相应的子查询,从而实现复杂的查询。

    子查询是在SQL语句内的另外一条SELECT语句,也被称为内查询或是内SELECT语句。在SELECT、INSERT、UPDATE或DELETE命令中允许是一个表达式的地方都可以包含子查询,子查询甚至可以包含在另外一个子查询中。

    select id, uname, age from users where uname in (select ename from emp where ename = 'jack')
    //等价于
    select id, uname, age from users a, emp b where a.uname = b.ename and b.ename = 'jack';
    

    相比多表关联查询,子查询的使用更加灵活、功能更强大,而且更容易理解。但是多表关联查询也有它自身的优点,比如,它的查询效率要高于子查询。

    在执行子查询操作的语句中,子查询也称为内查询,包含子查询的查询语句也被称为外查询或主查询。

    在一般情况下,外查询语句检索一行,子查询语句需要检索一遍数据,然后判断外查询语句的条件是否满足。如果条件满足,则外查询语句将检索到的数据行添加到结果集中,如果条件不满足,则外查询语句继续检索下一行数据,所以子查询相对多表关联查询要慢一些。

    另外,在使用子查询时,还应注意以下规则:

    • 子查询必须用括号“()”括起来。
    • 子查询中不能包括ORDER BY子句。
    • 子查询允许嵌套多层,但不能超过255层。

    在Oracle 11g中,通常把子查询再细化为单行子查询、多行子查询和关联子查询3种

    1.2.2 单行子查询
    单行子查询是指返回一行数据的子查询语句。当在WHERE子句中引用单行子查询时,可以使用单行比较运算符(=、>、<、>=、<=和< >)。

    select id, uname, age from users where age = (select max(age) from emp)
    

    在上面的语句中,如果内层子查询语句的执行结果为空值,那么外层的WHERE子句就始终不会满足条件,这样该查询的结果就必然为空值,因为空值无法参与比较运算。

    在执行单行子查询时,要注意子查询的返回结果必须是一行数据,否则Oracle系统会提示无法执行。另外,子查询中也不能包含ORDER BY子句,如果非要对数据进行排序的话,那么只能在外查询语句中使用ORDER BY子句。

    1.2.3 多行子查询
    多行子查询是指返回多行数据的子查询语句。当在WHERE子句中使用多行子查询时,必须使用多行比较符(IN、ANY、ALL)。

    (1)使用IN运算符
    当在多行子查询中使用IN运算符时,外查询会尝试与子查询结果中的任何一个结果进行匹配,只要有一个匹配成功,则外查询返回当前检索的记录。

    (2)使用ANY运算符
    ANY运算符必须与单行操作符结合使用,并且返回行只要匹配子查询的任何一个结果即可。

    (3)使用ALL运算符
    ALL运算符必须与单行运算符结合使用,并且返回行必须匹配所有子查询结果。

    select id, uname, age from users where age in (select age from emp);
    select id, uname, age from users where age > any(select age from emp);
    select id, uname, age from users where age > all(select age from emp);
    

    1.2.4 关联子查询
    在单行子查询和多行子查询中,内查询和外查询是分开执行的,也就是说,内查询的执行与外查询的执行是没有关系的,外查询仅仅是使用内查询的最终结果。

    在一些特殊需求的子查询中,内查询的执行需要借助于外查询,而外查询的执行又离不开内查询的执行,这时,内查询和外查询是相互关联的,这种子查询就被称为关联子查询。

    select id, uname, age from users a where age > (
    	select avg(age) from emp b where a.uname = b.ename)
    

    在执行关联子查询的过程中,必须遍历数据表中的每条记录,因此如果被遍历的数据表中有大量数据记录,则关联子查询的执行速度会比较缓慢。

    需要补充一点的是,关联子查询不但可以作为SELECT语句的子查询,也可以作为INSERT、UPDATE或DELETE语句的关联子查询。

    二、数据库操作

    2.1 数据库操作介绍

    使用SQL语句操作数据库,除了查询操作之外,还包括完成插入、更新和删除等数据操作。后3种数据操作使用的SQL语言也称为数据操纵语言(Data Manipulation Language,DML),它们分别对应INSERT、DELETE和UPDATE三条语句。

    在Oracle 11G中,DML除了包括上面提到的3种语句之外,还包括TRUNCATE、CALL、LOCKTABLE和MERGE等语句。

    2.2 插入数据(INSERT语句)

    2.2.1 插入数据介绍
    插入数据就是将数据记录添加到已经存在的数据表中,Oracle数据库通过INSERT语句来实现插入数据记录。该语句既可以实现向数据表中一次插入一条记录,也可以使用SELECT子句将查询结果集批量插入数据表。

    使用INSERT语句有以下注意事项:

    • 当为数字列增加数据时,可以直接提供数字值,或者用单引号引住。
    • 当为字符列或日期列增加数据时,必须用单引号引住。
    • 当增加数据时,数据必须要满足约束规则,并且必须为主键列和NOT NULL列提供数据。
    • 当增加数据时,数据必须与列的个数和顺序保持一致。

    2.2.2 单条插入数据
    单条插入数据是INSERT语句最基本的用法,其用法格式如下:

    INSERT INTO table_name [(column_name1[,column_name2])]
        VALUES(express1[,express2])
    
    • table_name:表示要插入的表名。
    • column_name1和column_name2:指定表的完全或部分列名称。如果指定多个列,那么列之间用逗号分开。
    • express1和express2:表示要插入的值列表。

    当使用INSERT语句插入数据时,既可以指定列列表,也可以不指定列列表。如果不指定列列表,那么在VALUES子句中必须为每个列提供数据,并且数据顺序必须与表列顺序完全一致。如果指定列列表,则只需要为相应列提供数据。

    (1)使用列列表增加数据
    在INSERT语句的几种使用方式中,最常用的形式是在INSERT INTO子句中指定添加数据的列,并在VALUES子句中为各个列提供一个值。

    insert into users(id, name, age) values(1, 'Jack', 18);
    

    INSERT INTO子句中指定添加数据的列,既可以是数据表的全部列,也可以是部分列。在指定部分列时,需要注意不许为空(NOT NULL)的列必须被指定出来,并且在VALUES子句中的对应赋值也不许为NULL,否则系统显示“无法将NULL插入”的错误信息提示。

    在使用INSERT INTO子句指定为表的部分列添加数据时,为了避免产生不许为空值的错误,可以使用DESC命令查看数据表中的哪些列不许为空。对于可以为空的列,用户可以不指定其值。
    在这里插入图片描述

    (2)不使用列列表增加数据
    在向表的所有列添加数据时,也可以省略INSERT INTO子句后面的列表清单,使用这种方法时,必须根据表中定义的列的顺序,为所有的列提供数据。用户可以使用DESC命令来查看表中定义列的顺序。

    insert into users values(1, 'JACK', 18, '男');
    

    (3)使用特定格式插入日期值
    当增加日期数据时,默认情况下日期值必须匹配于日期格式和日期语言;否则在插入数据时会增加错误信息。如果希望使用习惯方式插入日期数据,那么必须使用TO_DATE函数进行转换。

    insert into users(id, name, age, birth) values(1, 'JACK', 18, to_date('2019-12-01','yyyy-mm-dd'));
    

    (4)使用DEFAULT提供数据
    从Oracle Database 9i开始,当增加数据时,可以使用DEFAULT提供数值。当指定DEFAULT时,如果列存在默认值,则会使用其默认值,如果列不存在默认值,则自动使用NULL。

    insert into users(id, name, age, birth) values(1, 'JACK', 18, default);
    

    (5)使用替代变量插入数据
    如果经常需要给某表插入数据,那么为了避免输入错误,可以将INSERT语句放到SQL脚本,并使用替代变量为表插入数据。如果经常需要为emp表插入数据,那么为了避免输入错误,可以使用SQL脚本插入数据。

    2.2.3 批量插入数据
    INSERT语句还有一种强大的用法,就是可以一次向表中添加一组数据,也就是批量插入数据。用户可以使用SELECT语句替换掉原来的VALUES子句,这样由SELECT语句提供添加的数值。

    其语法格式如下:

    INSERT INTO table_name [(column_name1[,column_name2])] selectSubquery
    
    • table_name:表示要插入的表名称。
    • column_name1和column_name2:表示指定的列名。
    • selectSubquery:任何合法的SELECT语句,其所选列的个数和类型要与语句中的column对应。
    insert into users1 
    	select * from user2
     	where users2.age > 19;
    

    需要注意的是,在使用这种组合语句实现批量插入数据时,INSERT INTO子句指定的列名可以与SELECT子句指定的列名不同,但它们之间的数据类型必须是兼容的,即SELECT语句返回的数据必须满足INSERT INTO表中列的约束。

    2.3 更新数据(UPDATE语句)

    2.3.1 更新数据介绍
    如果表中的数据不正确或不符合需求,那么就需要对其进行修改。Oracle数据库通过UPDATE语句来实现修改现有的数据记录。 在更新数据时,更新的列数可以由用户自己指定,列与列之间用逗号(,)分隔;更新的条数可以通过WHERE子句来加以限制,使用WHERE子句时,系统只更新符合WHERE条件的记录信息。

    UPDATE语句的语法格式如下:

    UPDATE table_name
       SET {(column_name1 = express1),(column_name2 = express2...)} 
     [WHERE condition]
    或者
    UPDATE table_name
       SET (column_name1, column_name2…) = (selectSubquery)
     [WHERE condition]
    
    • table_name:表示要修改的表名。
    • column_name1和column_name2:表示指定要更新的列名。
    • selectSubquery:任何合法的SELECT语句,其所选列的个数和类型要与语句中的column对应。
    • condition:筛选条件表达式,只有符合筛选条件的记录才被更新。

    使用UPDATE语句有以下注意事项:

    • 当更新数字列时,可以直接提供数字值,或者用单引号引住。
    • 当更新字符列或日期列时,必须用单引号引住。
    • 当更新数据时,数据必须要满足约束规则。
    • 当更新数据时,数据必须与列的数据类型匹配。

    2.3.2 更新单列数据
    当更新单列数据时,set子句后只需要提供一个列。

    update users set age = 18 where name = 'jack';
    

    2.3.3 更新多列数据
    当使用update语句修改表行数据时,既可以修改一列,也可以修改多列。当修改多列时,列之间用逗号分开。

    update users set age = 18 where age = '20';
    

    2.3.4 更新日期列数据
    当更新日期列数据时,数据格式要与日期格式和日期语言匹配;否则会显示错误信息。如果希望使用习惯方式指定日期值,那么可以使用TO_DATE函数进行转换。

    update users set birth = to_date('2019-12-01','yyyy/mm/dd') where age = '20';
    

    2.3.5 使用DEFAULT选项更新数据
    当更新数据时,可以使用DEFAULT选项提供数据。使用此方式时,如果列存在默认值,则会使用默认值更新数据;如果列不存在默认值,则使用NULL。

    update users set birth = default where age = '20';
    

    2.3.6 使用子查询更新数据
    另外,同INSERT语句一样,UPDATE语句也可以与SELECT语句组合使用来达到更新数据的目的。

    update users set age = (select avg(age) from user2) where age = '20';
    

    需要注意的是,在将UPDATE语句与SELECT语句组合使用时,必须保证SELECT语句返回单一的值,否则会出现错误提示,导致更新数据失败。

    2.4 删除数据(DELETE语句和TRUNCATE语句)

    2.4.1 删除数据介绍
    Oracle系统提供了向数据库添加记录的功能,同时也提供了从数据库删除记录的功能。从数据库中删除记录可以使用DELETE语句和TRUNCATE语句,但这两种语句还是有很大区别的

    2.4.2 DELETE语句
    DELETE语句用来删除数据库中的所有记录和指定范围的记录,若要删除指定范围的记录,同UPDATE语句一样,要通过WHERE子句进行限制.

    其语法格式如下:

    DELETE FROM table_name [WHERE condition]
    
    • table_name:表示要删除记录的表名。
    • condition:筛选条件表达式,是个可选项,当该筛选条件存在时,只有符合筛选条件的记录才被删除掉。

    删除满足条件的数据:当使用DELETE语句删除数据时,通过指定WHERE子句可以删除满足条件的数据。
    删除表的所有数据:当使用DELETE删除表的数据时,如果不指定WHERE子句,那么会删除表的所有数据。

    delete from users where age > 18
    

    2.4.3 TRUNCATE语句
    如果用户确定要删除表中的所有记录,那么除了可以使用DELETE语句之外,还可以使用TRUNCATE语句,而且Oracle本身也建议使用TRUNCATE语句。

    使用TRUNCATE语句删除表中的所有记录要比DELETE语句快得多。这是因为使用TRUNCATE语句删除数据时,它不会产生回滚记录。当然,执行了TRUNCATE语句的操作也就无法使用ROLLBACK语句撤销。

    truncate table users;
    

    在TRUNCATE语句中还可以使用REUSE STORAGE关键字或DROP STORAGE关键字,前者表示删除记录后仍然保存记录所占用的空间,后者表示删除记录后立即回收记录占用的空间。默认情况下TRUNCATE语句使用DROP STORAGE关键字。

    参考文献:

    1. Oracle 11g从入门到精通 第二版,明日科技 著,清华大学出版社有限公司
    展开全文
  • 这篇文章介绍嵌入式数据库产品SQLite 技术特点,并着重讨论研究与Java语言之间接口,并以实例说明如何使用JAVA 开发基于SQLite 的应用程序。 正文: 通常我们采用各种数据库产品来实现对数据存储、检索等...
  • 本书适合 SQL 数据库开发者、软件架构师,也适合 DBA ,尤其是数据库应用维护人员阅读,对九种 SQL 经典查询场景以及其性能影响讨论,非常便于实践,为的实际工作提出了具体建议。
  • 数据类型的实际最大长度由数据库页面大小决定,具体最 大长度算法如表 的区别在于前者长度不足时,系统自动填充空 格,而后者只占用实际的字节空间。 表 数据库页面大 实际最大长度 注:这个限制长度只针对建表的...
  • 2、针对给定的实际问题,完成数据库模式的设计,包括各表的结构(属性名、类型、约束等)及表之间的关系,在选定的DBMS上建立数据库表,用SQL命令和可视化环境分别建立数据库表,体会两种方式的特点; 3、熟悉和...
  • 图书简介《MySQL数据库原理及应用》从教学实际出发,系统地介绍了MySQL数据库的有关原理和基本操作,主要内容包括数据库技术概述、MySQL概述、数据库基本操作、数据表、索引、结构化查询语言SQL、视图、触发器、存储...

    图书简介

    《MySQL数据库原理及应用》从教学实际出发,系统地介绍了MySQL数据库的有关原理和基本操作,主要内容包括数据库技术概述、MySQL概述、数据库基本操作、数据表、索引、结构化查询语言SQL、视图、触发器、存储过程和存储函数、访问控制与安全管理、备份与恢复、PHP与MySQL数据库编程。

    《MySQL数据库原理及应用》的内容基于Sailing数据库展开讲述,并提供了大量的实例作为参考,可以帮助读者理解数据库管理的有关概念,并熟悉数据库操作流程和管理方法。

    《MySQL数据库原理及应用》既可作为高等院校“数据库原理”课程的教材,也可作为相关领域技术人员的参考书。

    《MySQL数据库原理及应用》配有授课电子课件、教学大纲、源代码、习题答案等,需要的教师可登录www.cmpedu.com免费注册,审核通过后下载,或联系编辑索取(微信:15910938545,电话:010-88379739)。

    章节目录

    前言

    第1章 数据库技术概述1

    1.1 引言1

    1.2 数据库系统2

    1.2.1 数据库系统的基本概念2

    1.2.2 数据库系统的特点4

    1.2.3 数据管理技术的产生和发展5

    1.3 数据库系统的三级数据模式结构7

    1.3.1 数据模式的概念7

    1.3.2 数据库系统的二级映像技术8

    1.4 概念模型8

    1.4.1 数据的三个表示范畴及描述8

    1.4.2 实体—联系模型9

    1.5 逻辑模型13

    1.5.1 数据模型13

    1.5.2 常见的数据模型13

    1.6 关系数据库15

    1.6.1 关系模型的基本概念15

    1.6.2 关系数据库的基本性质16

    1.6.3 关系数据模式的规范化16

    1.6.4 关系的完整性约束18

    1.6.5 关系数据操作基础20

    1.7 数据库设计的基本步骤25

    1.7.1 需求分析26

    1.7.2 概念设计26

    1.7.3 逻辑设计27

    1.7.4 物理设计29

    1.7.5 数据库实施30

    1.7.6 数据库运行和维护30

    习题31

    第2章 MySQL概述34

    2.1 MySQL简介34

    2.1.1 MySQL的发展历程34

    2.1.2 MySQL的优势和特性35

    2.1.3 MySQL的版本36

    2.2 MySQL服务器的安装与配置36

    2.3 MySQL服务器的启动与登录42

    2.3.1 启动和停止MySQL服务器43

    2.3.2 登录和退出MySQL数据库44

    2.3.3 配置Path变量45

    2.4 MySQL图形化管理工具46

    2.5 WampServer47

    2.5.1 WampServer的安装与配置47

    2.5.2 登录phpMyAdmin工具平台50

    习题52

    第3章 数据库基本操作54

    3.1 创建数据库54

    3.1.1 通过命令创建数据库54

    3.1.2 通过phpMyAdmin创建数据库55

    3.2 查看数据库57

    3.2.1 查看所有数据库57

    3.2.2 查看数据库详细信息57

    3.2.3 选择数据库58

    3.3 删除数据库59

    3.3.1 通过命令删除数据库59

    3.3.2 通过phpMyAdmin删除数据库59

    3.4 数据库存储引擎61

    3.4.1 查看MySQL存储引擎61

    3.4.2 事务与锁的概念63

    3.4.3 常用存储引擎介绍64

    3.4.4 选择存储引擎66

    习题66

    第4章 数据表68

    4.1 MySQL数据类型介绍68

    4.1.1 数值类型68

    4.1.2 日期时间类型72

    4.1.3 字符串类型73

    4.2 创建数据表76

    4.2.1 创建数据表的语法76

    4.2.2 主键约束77

    4.2.3 外键约束79

    4.2.4 非空约束79

    4.2.5 默认值约束80

    4.2.6 自动增值80

    4.2.7 唯一约束81

    4.3 数据表操作81

    4.3.1 数据表查看81

    4.3.2 数据表删除83

    4.3.3 数据表更名83

    4.4 修改表结构84

    4.4.1 修改字段的数据类型84

    4.4.2 修改字段名84

    4.4.3 添加字段84

    4.4.4 删除字段86

    4.4.5 修改字段排列顺序86

    4.4.6 修改完整性约束87

    4.5 表数据编辑89

    4.5.1 插入数据89

    4.5.2 修改数据90

    4.5.3 删除数据90

    4.6 工具平台中的数据表91

    4.6.1 数据表的创建91

    4.6.2 表结构的修改93

    4.6.3 数据表的操作95

    4.6.4 数据表关系96

    4.6.5 输入数据99

    习题103

    第5章 索引106

    5.1 概述106

    5.1.1 索引的特点106

    5.1.2 索引的分类107

    5.1.3 查询的基本原理108

    5.1.4 MySQL的索引110

    5.2 创建索引111

    5.2.1 创建表时创建索引111

    5.2.2 在已有表中创建索引113

    5.2.3 查看索引114

    5.3 删除索引116

    5.4 工具平台中的索引117

    5.4.1 索引的创建117

    5.4.2 索引的删除119

    习题120

    第6章 结构化查询语言SQL122

    6.1 运算符122

    6.1.1 算术运算符122

    6.1.2 比较运算符123

    6.1.3 逻辑运算符128

    6.1.4 位运算符129

    6.1.5 运算符的优先级132

    6.2 MySQL常用函数132

    6.2.1 数值函数133

    6.2.2 字符串函数133

    6.2.3 日期时间函数135

    6.2.4 系统信息函数136

    6.3 简单查询136

    6.3.1 单表查询137

    6.3.2 取消重复数据查询138

    6.4 条件查询139

    6.4.1 带条件表达式的查询139

    6.4.2 BETWEEN…AND条件139

    6.4.3 IS NULL条件141

    6.4.4 IN查询141

    6.4.5 LIKE条件142

    6.5 排序查询143

    6.5.1 单字段排序查询143

    6.5.2 多字段排序查询144

    6.6 限制查询结果记录条数145

    6.7 总计查询145

    6.7.1 总计函数146

    6.7.2 分组查询148

    6.7.3 分组结果的条件限制150

    6.8 连接查询150

    6.8.1 交叉连接151

    6.8.2 内连接151

    6.8.3 外连接查询154

    6.9 子查询156

    6.9.1 带ANY、SOME关键字的

    子查询156

    6.9.2 带ALL关键字的子查询157

    6.9.3 带EXISTS关键字的子查询157

    6.9.4 带IN关键字的子查询158

    6.9.5 带比较运算符的子查询159

    6.10 合并查询结果161

    6.11 数据操作162

    6.11.1 插入数据163

    6.11.2 修改数据164

    6.11.3 删除数据168

    6.12 工具平台中的查询设计170

    6.12.1 基于单表的查询实现170

    6.12.2 基于多表的查询172

    习题176

    第7章 视图179

    7.1 概述179

    7.2 创建视图180

    7.2.1 创建视图的语法形式180

    7.2.2 在单表上创建视图181

    7.2.3 在多表上创建视图182

    7.3 查看视图182

    7.3.1 查看视图的字段信息182

    7.3.2 查看视图基本信息183

    7.3.3 查看视图详细信息183

    7.4 修改视图184

    7.4.1 利用CREATE OR REPLACE VIEW

    语句修改视图184

    7.4.2 使用ALTER语句修改视图185

    7.5 更新视图186

    7.6 删除视图188

    7.7 工具平台中的视图189

    7.7.1 创建视图189

    7.7.2 查看视图190

    7.7.3 修改视图192

    7.7.4 更新视图192

    7.7.5 删除视图195

    习题195

    第8章 触发器197

    8.1 概述197

    8.2 创建触发器198

    8.2.1 创建触发器的语法形式198

    8.2.2 利用工具平台创建触发器200

    8.3 查看触发器201

    8.3.1 通过SHOW TRIGGERS语句

    查看触发器201

    8.3.2 通过系统表triggers查看触发器202

    8.4 删除触发器203

    8.4.1 通过DROP TRIGGER语句删除

    触发器203

    8.4.2 通过工具平台删除触发器204

    习题204

    第9章 存储过程和存储函数206

    9.1 概述206

    9.1.1 存储过程206

    9.1.2 存储函数207

    9.2 创建存储过程和存储函数207

    9.2.1 创建存储过程的语法形式207

    9.2.2 创建存储函数的语法形式208

    9.2.3 创建简单的存储过程和存储函数209

    9.2.4 通过工具平台创建存储过程和

    存储函数211

    9.3 存储过程体和存储函数体211

    9.3.1 局部变量211

    9.3.2 游标213

    9.3.3 流程控制语句214

    9.4 查看存储过程和存储函数219

    9.5 修改存储过程和存储函数221

    9.6 删除存储过程和存储函数223

    习题224

    第10章 访问控制与安全管理226

    10.1 用户账户管理226

    10.1.1 用户权限表226

    10.1.2 创建用户账号229

    10.1.3 删除用户231

    10.1.4 修改用户账号232

    10.1.5 修改用户口令232

    10.2 账户权限管理233

    10.2.1 权限的授予233

    10.2.2 权限的转移与限制236

    10.2.3 权限的撤销237

    习题238

    第11章 备份与恢复240

    11.1 MySQL数据库备份与恢复

    方法240

    11.1.1 使用SQL语句备份和恢复表

    数据240

    11.1.2 使用MySQL客户端实用程序

    备份和恢复数据243

    11.1.3 使用MySQL工具平台备份和

    恢复数据246

    11.2 日志文件247

    11.2.1 二进制日志247

    11.2.2 查询日志250

    习题251

    第12章 PHP与MySQL数据库编程253

    12.1 PHP编程基础254

    12.1.1 PHP代码与文本注释254

    12.1.2 PHP中的变量255

    12.1.3 PHP中的常量261

    12.1.4 PHP运算符262

    12.1.5 表达式270

    12.2 PHP函数271

    12.2.1 自定义函数271

    12.2.2 参数传递和返回值274

    12.2.3 PHP内置函数275

    12.2.4 PHP的标准输入与输出276

    12.3 数组的使用277

    12.3.1 定义数组277

    12.3.2 数组管理279

    12.4 PHP程序设计基础283

    12.4.1 选择结构283

    12.4.2 循环结构287

    12.5 PHP面向对象程序设计289

    12.5.1 定义类和对象289

    12.5.2 类的继承和多态292

    12.6 在PHP中访问MySQL

    数据库294

    12.6.1 MySqli扩展库的配置294

    12.6.2 连接数据库295

    12.6.3 执行数据库操作296

    12.6.4 关闭结果集和数据库连接300

    习题301

    附录 Sailing数据库结构304

    图书评论

    展开全文
  • 本节将对database/sql官方标准库作一些简单...5.5.1 从database/sql讲起Go官方提供了database/sql包来使用户进行和数据库打交道工作,实际上database/sql库只是提供了一套操作数据库的接口和规范,例如抽象好SQ...

    本节将对database/sql官方标准库作一些简单分析,并介绍一些应用比较广泛的开源ORM和SQL Builder。并从企业级应用开发和公司架构的角度来分析哪种技术栈对于现代的企业级应用更为合适。

    5.5.1 从database/sql讲起

    Go官方提供了database/sql包来使用户进行和数据库打交道的工作,实际上database/sql库只是提供了一套操作数据库的接口和规范,例如抽象好的SQL预处理、连接池管理、数据绑定、事务、错误处理等。官方并没有提供具体某种数据库实现的协议支持。

    和具体的数据库(如MySQL)打交道,还需要再引入MySQL的驱动,像下面这样:

    import "database/sql"import _ "github.com/go-sql-driver/mysql"db, err := sql.Open("mysql", "user:password@/dbname")import _ "github.com/go-sql-driver/mysql"

    上一句import,实际上是调用了mysql包的init()函数,做的事情也很简单:

    func init() {    sql.Register("mysql", &MySQLDriver{})}

    在sql包的全局map里把mysql这个名字的Driver注册上。实际上Driver在sql包中是一个接口:

    type Driver interface {    Open(name string) (Conn, error)}

    调用sql.Open()返回的db对象实际上就是这里的Conn,也是一个接口:

    type Conn interface {    Prepare(query string) (Stmt, error)    Close() error    Begin() (Tx, error)}

    实际上,如果仔细地查看database/sql/driver/driver.go的代码你会发现,这个文件里所有的成员全都是接口,对这些类型进行操作,实际上还是会调用具体的driver里的方法。

    从用户的角度来讲,在使用database/sql包的过程中,你能够使用的就是这些接口里提供的函数。来看一个使用database/sql和go-sql-driver/mysql的完整的例子:

    package mainimport (    "database/sql"    _ "github.com/go-sql-driver/mysql")func main() {    // db是一个sql.DB类型的对象    // 该对象线程安全,且内部已包含了一个连接池    // 连接池的选项可以在sql.DB的方法中设置,这里为了简单省略了    db, err := sql.Open("mysql",        "user:password@tcp(127.0.0.1:3306)/hello")    if err != nil {        log.Fatal(err)    }    defer db.Close()    var (        id int        name string    )    rows, err := db.Query("select id, name from users where id = ?", 1)    if err != nil {        log.Fatal(err)    }    defer rows.Close()    // 必须要把 rows 里的内容读完,或者显式调用 Close() 方法,    // 否则在 defer 的 rows.Close() 执行之前,连接永远不会释放    for rows.Next() {        err := rows.Scan(&id, &name)        if err != nil {            log.Fatal(err)        }        log.Println(id, name)    }    err = rows.Err()    if err != nil {        log.Fatal(err)    }}

    如果想了解官方database/sql库更加详细的用法,读者可以参考Go语言相关文档(http://go-database-sql.org/)。

    包括该库的功能介绍、用法、注意事项和反直觉的一些实现方式(例如,同一个Goroutine内对sql.DB的查询,可能在多个连接上)都有涉及,本章中不再赘述。

    你在上面这段简短的程序中可能已经嗅出了一些不好的味道。官方的db库提供的功能这么简单,我们每次去数据库里读取内容岂不是都要去写这么一套差不多的代码?或者如果我们的对象是结构体,把sql.Rows绑定到对象的工作就会变得更重复而无聊。

    是的,所以社区才会有各种各样的SQL Builder和ORM。

    5.5.2 提高生产效率的ORM和SQL Builder

    在Web开发领域常常提到的ORM是什么?我们先看看维基百科:对象关系映射(Object Relational Mapping,简称ORM、O/RM或O/R映射)是一种程序设计技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。从效果上说,它其实是创建了一个可在编程语言里使用的“虚拟对象数据库”。

    最为常见的ORM实际上做的是从数据库数据到程序的类或结构体这样的映射。所以你手边的程序可能是从MySQL的表映射到你的程序内的类。我们可以先来看看其他编程语言里的ORM使用起来是什么样的感觉:

    >>> from blog.models import Blog>>> b = Blog(name='Beatles Blog', tagline='All the latest Beatles news.')>>> b.save()

    完全没有数据库的痕迹,确实ORM的目的就是屏蔽数据库层,实际上很多语言的ORM只要把你的类或结构体定义好,再用特定的语法将结构体之间的一对一或者一对多关系表达出来,那么任务就完成了。然后你就可以对这些映射好了数据库表的对象进行各种操作,如增删改查。至于ORM在背地里做了什么,我们是不一定清楚的。使用ORM的时候,我们往往比较容易有一种忘记了数据库的直观感受。举个例子,我们有个需求:向用户展示最新的商品列表,我们再假设,商品和商家是1:1的关联关系,我们就很容易写出像下面这样的代码:

    # 伪代码shopList := []for product in productList {    shopList = append(shopList, product.GetShop)}

    当然,我们不能批判这样写代码的程序员是偷懒的程序员。因为ORM一类的工具在出发点上就是屏蔽SQL,让我们对数据库的操作更接近于人类的思维方式。这样很多只接触过ORM而且又是刚入行的程序员就很容易写出上面这样的代码。

    这样的代码将对数据库的读请求放大了n倍。也就是说,如果你的商品列表有15个SKU,那么每次用户打开这个页面,至少需要执行1(查询商品列表)+ 15(查询相关的商铺信息)次查询。这里n是16。如果你的列表页很大,比如说有600个条目,那么你就至少要执行1+600次查询。如果你的数据库能够承受的最大的简单查询是每秒12万个查询(QPS),而上述这样的查询正好是你最常用的查询的话,实际上你能对外提供的服务能力是多少呢?是每秒200个查询!互联网系统的忌讳之一,就是这种无端的读放大。

    当然,你也可以说这不是ORM的问题,如果手写SQL你还是可能会写出差不多的程序,那么再来看两个演示示例:

    o := orm.NewOrm()num, err := o.QueryTable("cardgroup").Filter("Cards__Card__Name", cardName).All (&cardgroups)

    很多ORM都提供了这种Filter类型的查询方式,不过实际上在某些ORM背后甚至隐藏了非常难以察觉的细节,比如生成的SQL语句会自动limit 1000。

    也许喜欢ORM的读者读到这里会反驳了,你是没有认真阅读文档就瞎写。是的,尽管这些ORM工具在文档里说明了All查询在不显式地指定Limit的话会自动在生成的SQL语句后拼接上 limit 1000,但对于很多没有阅读过文档或者看过ORM源码的人,这依然是一个非常难以察觉的“魔鬼”细节。喜欢强类型语言的人一般都不喜欢语言隐式地去做什么事情,例如各种语言在赋值操作时进行的隐式类型转换然后又在转换中丢失了精度的做法,一定让你非常头疼。所以一个程序库背地里做的事情还是越少越好,如果一定要做,就一定要显式地做。比如上面的例子,去掉这种默认的自作聪明的行为,或者要求用户强制传入limit参数都是更好的选择。

    除了limit的问题,我们再看一遍下面的这个查询:

    num, err := o.QueryTable("cardgroup").Filter("Cards__Card__Name", cardName).All (&cardgroups)

    你可以看得出来这个Filter是有表连接的操作么?当然了,有深入使用经验的用户还是会觉得这是在吹毛求疵。但这样的分析想证明的是,ORM想从设计上隐去太多的细节,而付出的代价是其背后的运行完全失控。这样的项目在经过几任维护人员之后,将变得面目全非,难以维护。

    当然,我们不能否认ORM的进步意义,它的设计初衷就是为了让数据的操作和存储的具体实现剥离。但是在上规模的公司的人们渐渐达成了一个共识,由于隐藏重要的细节,ORM可能是失败的设计,其所隐藏的重要细节对上规模的系统开发来说至关重要。

    相比ORM,SQL Builder在SQL和项目可维护性之间取得了比较好的平衡。首先SQL Builder不像ORM那样屏蔽了过多的细节,其次从开发的角度来讲,SQL Builder简单进行封装后也可以非常高效地完成开发,举个例子:

    where := map[string]interface{} {    "order_id > ?" : 0,    "customer_id != ?" : 0,}limit := []int{0,100}orderBy := []string{"id asc", "create_time desc"}orders := orderModel.GetList(where, limit, orderBy)

    写SQL Builder的相关代码,或者读懂都不费劲。把这些代码脑内转换为SQL也不会太费劲。所以通过代码就可以对这个查询是否命中数据库索引、是否走了覆盖索引、是否能够用上联合索引进行分析了。

    说白了,SQL Builder是SQL在代码里的一种特殊方言,如果你们没有数据库管理员(DBA)但研发人员有自己分析和优化SQL的能力,或者你们公司的DBA对于学习这样一些SQL的方言没有异议,那么使用SQL Builder是一个比较好的选择,不会导致什么问题。

    另外在一些本来不需要DBA介入的场景,使用SQL Builder也是可以的,例如你要做一套运维系统,且将MySQL当作了系统中的一个组件,系统的QPS不高,查询不复杂,等等。

    一旦你做的是高并发的OLTP在线系统,想在人员充足、分工明确的前提下最大程度控制系统的风险,使用SQL Builder就不合适了。

    5.5.3 脆弱的数据库

    无论是ORM还是SQL Builder都有一个致命的缺点,就是没有办法进行系统上线的事前SQL审核。虽然很多ORM和SQL Builder也提供了运行期打印SQL的功能,但只在查询的时候才能进行输出。而SQL Builder和ORM本身提供的功能太灵活,使得你不可能通过测试枚举出所有可能在线上执行的SQL。例如你可能用SQL Builder写出下面这样的代码:

    where := map[string]interface{} {    "product_id = ?" : 10,    "user_id = ?" : 1232 ,}if order_id != 0 {    where["order_id = ?"] = order_id}res, err := historyModel.GetList(where, limit, orderBy)

    如果你的系统里有类似上述示例的大量if的话,就难以通过测试用例来覆盖所有可能的SQL组合了。

    这样的系统只要发布,就已经蕴含了巨大的风险。

    对现在全天候(7×24)服务的互联网公司来说,服务不可用是非常重大的问题。存储层的技术栈虽经历了多年的发展,但在整个系统中依然是最为脆弱的一环。系统宕机对24小时对外提供服务的公司来说,意味着直接的经济损失。个中风险不可忽视。

    从行业分工的角度来讲,现今的互联网公司都有专职的DBA。大多数DBA并不一定有写代码的能力,阅读SQL Builder的相关“拼SQL”代码多多少少还是会有一点障碍。从DBA角度出发,还是希望能够有专门的事前SQL审核机制,并能让其低成本地获取到系统的所有SQL内容,而不是去阅读业务研发人员编写的SQL Builder的相关代码。

    所以现如今,大型的互联网公司核心线上业务都会在代码中把SQL放在显眼的位置提供给DBA评审,举一个例子:

    const (    getAllByProductIDAndCustomerID = `select * from p_orders where product_id in (:product_id) and customer_id=:customer_id`)// GetAllByProductIDAndCustomerID// @param driver_id// @param rate_date// @return []Order, errorfunc GetAllByProductIDAndCustomerID(ctx context.Context, productIDs []uint64, customerID uint64) ([]Order, error) {    var orderList []Order    params := map[string]interface{}{        "product_id" : productIDs,        "customer_id": customerID,    }    // getAllByProductIDAndCustomerID 是const类型的sql字符串    sql, args, err := sqlutil.Named(getAllByProductIDAndCustomerID, params)    if err != nil {        return nil, err    }    err = dao.QueryList(ctx, sqldbInstance, sql, args, &orderList)    if err != nil {        return nil, err    }    return orderList, err}

    像这样的代码,在上线之前把数据访问对象(DAO)层的变更集的const部分直接拿给DBA来进行审核,就比较方便了。代码中的sqlutil.Named()是类似于sqlx 中的Named()函数,同时支持 where表达式中的比较操作符和in。

    这里为了说明简便,函数写得稍微复杂一些,仔细思考一下的话查询的导出函数还可以进一步进行简化。请读者自行尝试。

    本文截选自《Go语言高级编程》,柴树杉,曹春晖 著.

    74daf6b536d2e99ee084c2eccb21986a.png

    本书从实践出发讲解Go语言的进阶知识。本书共6章,第1章简单回顾Go语言的发展历史;第2章和第3章系统地介绍CGO编程和Go汇编语言的用法;第4章对RPC和Protobuf技术进行深入介绍,并讲述如何打造一个自己的RPC系统;第5章介绍工业级环境的Web系统的设计和相关技术;第6章介绍Go语言在分布式领域的一些编程技术。书中还涉及CGO和汇编方面的知识,其中CGO能够帮助读者继承的软件遗产,而在深入学习Go运行时,汇编对于理解各种语法设计的底层实现是必不可少的知识。此外,本书还包含一些紧跟潮流的内容,介绍开源界流行的gRPC及其相关应用,讲述Go Web框架中的基本实现原理和大型Web项目中的技术要点,引导读者对Go语言进行更深入的应用。

    本书适合对Go语言的应用已经有一些心得,并希望能够深入理解底层实现原理或者是希望能够在Web开发方面结合Go语言来实现进阶学习的技术人员学习和参考。

    展开全文
  • 查询语言这块,又分为关系代数语言与关系演算语言。这里讲就是关系代数。所以可以这样定义,关系代数就是为数据库操作语言进行查询集合操作。需要从实际的例子来理解定义这样会便于理 解。对于基本操作,并...

    学习关系的完整性是给定的关系模型中数据及其联系的所有制约和依存规则,用以限定数据库状态及状态变化,从而保证数据的正确、相容和有效。

    对于关系型数据库的数据库操作语言分为查询和更新两类。而查询语言这块,又分为关系代数语言与关系演算语言。这里讲的就是关系代数。所以可以这样定义,关系代数就是为数据库操作语言进行查询的集合操作。需要从实际的例子来理解定义这样会便于理 解。对于基本的操作,并、交、差、笛卡尔积针对的都是两个不同的集合的操作。


    一、关系的完整性

    1、关系的三类完整性约束:实体完整性、参照完整性和用户定义的完整性。
    2、实体完整性和参照完整性是关系模型必须满足的两个条件。(关系的两个不变性)
    3、实体完整性规则:关系的主属性(主键的组成)不能是空值。
    4、参照完整性规则:
    在这里插入图片描述

    • 外码不可以是所在基本关系的主码,对应被参照关系中的主码。
    • 外码可以都取空值,或者在对应被参照关系已存在的主码中取值。(需要遵循实体完整性)

    5、用户定义的完整性

    用户可以根据实际状况自定义约束条件。

    二、传统的关系运算

    1、如果对R、S使用并、交、差运算,必须保证R和S有相同的目、属性域是相同的。
    2、传统的关系运算:并、交、差、笛卡尔积。

    举例示意:

    并(Union):设关系R和S具有相同的关系模式,R和S的并是由属于R或属于S的元组构成的集合,记为R∪S。
    并操作
    交(Intersection):是从两个集合内找出既属于R有属于S集合的元素的集合。符号:∩。
    交操作
    差(Difference):设关系R和S具有相同的关系模式,R和S的差是由属于R但不属于S的元组构成的集合,记为R-S。.
    差操作
    笛卡尔积(Cartesian Product):设关系R和S的元数分别为r和s,定义R和S的笛卡儿积是一个(r+s)元的元组集合,每个元组的前 r个分量(属性值)来自R的一个元组,后s个分量来自S的一个元组,记为R×S。
    笛卡尔积

    展开全文
  • 而且,尽管dBASE、Paradox本身DDL (Data Definition Language,即数据定义语言)和DML(Data Manipulation Language,即数据操纵语言)是非结构化查询的,但它们仍然可以使用VBSQL语句和JET引擎来操纵。...
  • 应用是用BeeGo框架进行一个WEB应用快速开发,是一个在生产环境实际运行商业软件。 适用数据库MySQL,详细配置请参阅conf\global\app.ini。本应用打包部署工具为Bee。 前端采用了amazeui制作工作台页面,标准...
  • 就本质而言,游标实际上即是一种能从包括多条数据记录结果集中每次提取一条记录机制游标就好比 C++ 语言指针,通过与某个查询结果构建技术联系,可以指定结果集中任何位置,然后允许用...
  • 应用是用BeeGo框架进行一个WEB应用快速开发,是一个在生产环境实际运行商业软件。 适用数据库MySQL,详细配置请参阅conf\global\app.ini。本应用打包部署工具为Bee。 前端采用了amazeui制作工作台页面,标准...
  • SODA允许您在Oracle数据库中创建和存储此类文档集合,并执行在这些文档上创建,检索,更新和删除(CRUD)操作,而无需了解结构化查询语言(SQL)或JDBC或数据如何存储在数据库中。 本质上,SODA在Oracle数据库之上...
  • SQL是一种非过程化的查询语言。 DDL数据定义语言:表,视图 QL 查询语言 DML 数据操纵语言 DCL 数据控制语言 Base table:基表,实际存在表 View: 视图,不是实际存在表,虚表 SELECT [DISTINCT] target_list...
  • wd wd 实验7数据库设计 一 实验目的 使学生能够对给定的实际需求选择一种编程语言或开发工具完成数据库 设讣并实现数据的查询等操作从而掌握数据库应用系统的设计方法和步骤 熟悉大型数据库管理系统的结构与组成 ...
  • 科克罗奇数据库在不牺牲结构化查询语言功能情况下提供了伸缩性。 它提供了完全分布式酸事务、零宕机模式更改以及对辅助索引和外键支持。 但是NoSQL数据库提供一些额外好处呢,比如使用半结构化数据能力? ...
  • 它使用结构化的查询语言。关系型数据库的列定义了表中表示实体数据属性。比如:商品表里有name、price、number等。 Flask本身不限定数据库的选择,你可以选择SQL或NOSQL任何一种。也可以选择更方便...
  • 就目前国内互联网存储来看实际用处并不大,对于互联网分布式存储开发工程师更多意义是提供了一个全面(发展历程)、笼统了解数据库的发展。 在数据模型部分介绍了,关系数据模型、文档数据模型并结合一对多、多...
  • CruiseYoung提供的带有详细书签的电子书籍目录 ... 数据库系统基础:初级篇(第5版)(讲述数据库系统原理的经典教材) ... 10.3.2 范式的实际使用 234 10.3.3 码的定义和参与码的属性 234 10.3.4...
  • 我国城市公交乘客信息系统发展处于一个较落后水平,广大乘客可以获得信息方式很少,为了解决这种问题,加快发展城市公交信息化,设计一个城市公交查询系统是具有一定实际应用意义。在此背景下,我开发了这个...
  • 作者从数据库的基本概念到数据库建模,从如何运用规范化原则到如何做成实际的数据库表,从如何保护数据库完整性到如何提高数据库的性能,从数据库的安全机制到并发事务控制,从数据库设计开发常用模式到应用程序...
  • 作者从数据库的基本概念到数据库建模,从如何运用规范化原则到如何做成实际的数据库表,从如何保护数据库完整性到如何提高数据库的性能,从数据库的安全机制到并发事务控制,从数据库设计开发常用模式到应用程序...
  •  我要向大家介绍最重要经验是充分利用SQL面向集合方法来解决数据库处理需求,而不是使用Java等过程化编程语言。  如果编程人员要在一个表中查找许多行,结果中每个行都会查找其他表中数据,最后,...
  • SQL(结构化查询语言)是世界上最流行和标准化的数据库语言,它使得存储、更新和存取信息更加容易。MySQL是一个客户机/服务器结构实现,它由一个服务器守护程序mysqld和许多不同客户程序以及库组成。因其多...
  • 数据库原理教案.doc

    2020-03-04 14:54:09
    本课程任务是让学生掌握数据库的基本原理,对于实际的应用能设计一个合理的数据库结构,会用数据库(DB)语言数据库进行查询,修改,并会对数据库作一些维护工作,为以后更深层的应用储备知识。配合本门课,还...
  • 例如:数据库查询条件传入问题是所有ORM框架都不能回避一个问题,所以我经常在想——既然我们可以用向DAO传入一个Entity来实现插入操作,为什么就不能用同样方法来描述一个不以主键为条件update/select/...
  • 论文在撰写过程中,力求将理论与实践应用相结合,对各种理论进行阐述同时配合系统从实际应用和操作技巧上加以说明,希望能够更充分地体现到这些知识与技术在本系统中应用与实现。 bootstrap自适应响应前界面...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 585
精华内容 234
关键字:

数据库查询语言的实际应用