精华内容
下载资源
问答
  • 我前面一篇博客讲解了什么是数据库中数据定义语言和操作语言,接下来我们就详细讲解下 首先是数据定义语言 1.CREATE DATABASE 语句 CREATE DATABASE 用于创建数据库。 SQL CREATE DATABASE 语法 CREATE DATABASE...

    我前面一篇博客讲解了什么是数据库中数据的定义语言和操作语言,接下来我们就详细讲解下

    首先是数据的定义语言

    1.CREATE DATABASE 语句

    CREATE DATABASE 用于创建数据库。
    SQL CREATE DATABASE 语法
    CREATE DATABASE database_name

    2.CREATE TABLE 语句

    CREATE TABLE 语句用于创建数据库中的表。

    SQL CREATE TABLE 语法
    CREATE TABLE 表名称
    (
    列名称1 数据类型,
    列名称2 数据类型,
    列名称3 数据类型,

    )

    3.CREATE INDEX 语句。

    该语句用于在表中创建索引
    在不读取整个表的情况下,索引使数据库应用程序可以更快地查找数据。
    索引
    您可以在表中创建索引,以便更加快速高效地查询数据。

    用户无法看到索引,它们只能被用来加速搜索/查询。

    注释:更新一个包含索引的表需要比更新一个没有索引的表更多的时间,这是由于索引本身也需要更新。因此,理想的做法是仅仅在常常被搜索的列(以及表)上面创建索引。

    SQL CREATE INDEX 语法
    在表上创建一个简单的索引。允许使用重复的值:

    CREATE INDEX index_name
    ON table_name (column_name)
    注释:“column_name” 规定需要索引的列。

    SQL CREATE UNIQUE INDEX 语法
    在表上创建一个唯一的索引。唯一的索引意味着两个行不能拥有相同的索引值。

    CREATE UNIQUE INDEX index_name
    ON table_name (column_name)
    CREATE INDEX 实例
    本例会创建一个简单的索引,名为 “PersonIndex”,在 Person 表的 LastName 列:

    CREATE INDEX PersonIndex
    ON Person (LastName)
    如果您希望以降序索引某个列中的值,您可以在列名称之后添加保留字 DESC:

    CREATE INDEX PersonIndex
    ON Person (LastName DESC)
    假如您希望索引不止一个列,您可以在括号中列出这些列的名称,用逗号隔开:

    CREATE INDEX PersonIndex
    ON Person (LastName, FirstName)

    4. ALTER TABLE 语句

    ALTER TABLE 语句用于在已有的表中添加、修改或删除列。

    SQL ALTER TABLE 语法
    如需在表中添加列,请使用下列语法:

    ALTER TABLE table_name
    ADD column_name datatype
    要删除表中的列,请使用下列语法:

    ALTER TABLE table_name
    DROP COLUMN column_name
    注释:某些数据库系统不允许这种在数据库表中删除列的方式 (DROP COLUMN column_name)。

    要改变表中列的数据类型,请使用下列语法:

    ALTER TABLE table_name
    ALTER COLUMN column_name datatype

    5.通过使用 DROP 语句,可以轻松地删除索引、表和数据库。

    SQL DROP INDEX 语句
    我们可以使用 DROP INDEX 命令删除表格中的索引。

    用于 Microsoft SQLJet (以及 Microsoft Access) 的语法:
    DROP INDEX index_name ON table_name
    用于 MS SQL Server 的语法:
    DROP INDEX table_name.index_name
    用于 IBM DB2 和 Oracle 语法:
    DROP INDEX index_name
    用于 MySQL 的语法:
    ALTER TABLE table_name DROP INDEX index_name
    SQL DROP TABLE 语句
    DROP TABLE 语句用于删除表(表的结构、属性以及索引也会被删除):

    DROP TABLE 表名称
    SQL DROP DATABASE 语句
    DROP DATABASE 语句用于删除数据库:

    DROP DATABASE 数据库名称
    SQL TRUNCATE TABLE 语句
    如果我们仅仅需要除去表内的数据,但并不删除表本身,那么我们该如何做呢?
    请使用 TRUNCATE TABLE 命令(仅仅删除表格中的数据):
    TRUNCATE TABLE 表名称

    数据操作语言的讲解

    1.SELECT 语句

    SELECT 语句用于从表中选取数据。
    结果被存储在一个结果表中(称为结果集)。
    SQL SELECT 语法
    SELECT 列名称 FROM 表名称
    以及:SELECT * FROM 表名称
    注释:SQL 语句对大小写不敏感。SELECT 等效于 select。
    ##2. Update 语句
    Update 语句用于修改表中的数据。
    语法:
    UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值

    3.DELETE 语句

    DELETE 语句用于删除表中的行。
    语法
    DELETE FROM 表名称 WHERE 列名称 = 值

    4.INSERT INTO 语句

    INSERT INTO 语句用于向表格中插入新的行。
    语法
    INSERT INTO 表名称 VALUES (值1, 值2,…)
    我们也可以指定所要插入数据的列:
    INSERT INTO table_name (列1, 列2,…) VALUES (值1, 值2,…)

    展开全文
  • 3-2数据定义

    千次阅读 2016-06-30 13:13:14
    3-2数据定义tags:数据库 关系数据库系统支持三级模式结构,其模式、外模式和内模式中单基本对象幽默师表,视图和索引等.因此SQL的数据定义功能包括,模式定义,表定义,视图和索引定义. 操作对象 创建 删除 修改 模式...

    3-2数据定义

    tags:数据库

    关系数据库系统支持三级模式结构,其模式、外模式和内模式中单基本对象幽默师表,视图和索引等.因此SQL的数据定义功能包括,模式定义,表定义,视图和索引定义.

    操作对象创建删除修改
    模式create schemadrop schema
    create tabledrop tablealter table
    视图create viewdrop view
    索引create indexdrop indexalter

    架构(模式schema)

    为避免此处模式域数据库逻辑模式混淆使用架构一词

    架构的概念

    架构是形成单个命名空间的数据库实体的集合。命名空间是一个集合,其中每个元素的名称都是唯一的。微软的官方说明(MSDN): “数据库架构是一个独立于数据库用户的非重复命名空间,您可以将架构视为对象的容器”,详细参考[http://technet.microsoft.com/zh-cn/library/ms190387.aspx](微软 sql server 文档)

    架构的意义/架构与用户分离的好处

    以往 SQL Server 内的对象命名是“服务器.数据库.用户名.对象”,但新版的对象命名改为“服务器.数据库.Schema.对象”。这让你规划数据库对象命名时更有弹性。
    将架构与数据库用户分离对管理员和开发人员而言有下列好处:
    1. 多个用户可以通过角色成员身份或 Windows 组成员身份拥有一个架构。这扩展了允许角色和组拥有对象的用户熟悉的功能。
    2. 极大地简化了删除数据库用户的操作。
    3. 删除数据库用户不需要重命名该用户架构所包含的对象。因而,在删除创建架构所含对象的用户后,不再需要修改和测试显式引用这些对象的应用程序。
    4. 多个用户可以共享一个默认架构以进行统一名称解析。
    5. 开发人员通过共享默认架构可以将共享对象存储在为特定应用程序专门创建的架构中,而不是 DBO 架构中。
    6. 可以用比早期版本中的粒度更大的粒度管理架构和架构包含的对象的权限。

    架构相关SQL

    定义模式

    create schema <模式名> authorization <用户名>
    

    authorization ->授权,许可
    要创建模式,调用命令的用户必须拥有数据库管理员权限,或者获得了数据库管理员授予的creare schema的权限.
    若没有指定模式名,那么模式名默认为用户名.
    定义模式实际上定义了一个命名空间,在空间中可进一步定义其他数据库对象如view table grant
    在create schema 中可以接受create table view grant子句.

    删除模式

    drop schema <模式名> <cascade|restrict>
    

    其中cascade(级联)和restrict(限制)量着必选其一,cascade表示在删除该模式的同时删除该模式中的数据库对象,restrict表示如果该模式中已经定义了下属的数据库对象,则拒绝该删除语句的执行.只有该模式中没有任何下属的对象时才能执行drop schema语句.

    oracle和sql server 架构区别

    SQL Server中的Schema
    SQL Server中一个用户有一个缺省的schema,其schema名就等于用户名,这也就是我们在企业管理器的方案下看到schema名都为数据库用户名的原因。当然一个用户还可以使用其他的schema。如果我们访问一个表时,没有指明该表属于哪一个schema中的,系统就会自动给我们在表上加上缺省的sheman名。比如我们在访问数据库时,访问scott用户下的emp表,通过select * from emp; 其实,这sql语句的完整写法为select * from scott.emp。在数据库中一个对象的完整名称为schema.object,而不属user.object。类似如果我们在创建对象时不指定该对象的schema,在该对象的schema为用户的缺省schema。这就像一个用户有一个缺省的表空间,但是该用户还可以使用其他的表空间,如果我们在创建对象时不指定表空间,则对象存储在缺省表空间中,要想让对象存储在其他表空间中,我们需要在创建对象时指定该对象的表空间。

    Oracle中的Schema
    Oracle中的schema就是指一个用户下所有对象的集合,schema本身不能理解成一个对象,oracle并没有提供创建schema的语法,schema也并不是在创建user时就创建,而是在该用户下创建第一个对象之后schema也随之产生,只要user下存在对象,schema就一定存在,user下如果不存在对象,schema也不存在;如果创建一个新用户,该用户下如果没有对象则schema不存在,如果创建一个对象则和用户同名的schema也随之产生。实际上在使用上,shcema与user完全一样,没有什么区别,在出现schema名的地方也可以出现user名。

    基本表(table)

    表相关SQL

    定义表

    create table <表名> (<列名><数据类型>[列级完整性约束条件]
                        [,<列名><数据类型>[列级完整性约束条件]]
                        [,<列名><数据类型>[列级完整性约束条件]]
                        [,<列名><数据类型>[列级完整性约束条件]]
                        [表级完整性约束条件]     );
    create table t_course(  cno cahr(4) primary key,  /*列级完整性约束cno是主码*/
                            cname char(40) not null, /*列级完整性约束,cname不能取空值*/
                            cpno char(4), /*cpno的含义是先修课*/
                            ccredit smallint,
                        foreign key(cpno) references t_course(cno) /*表级完整性约束条件,cpno是外码*/
                                            )
    

    check约束

    CHECK 约束用于限制列中的值的范围。如果对单个列定义 CHECK 约束,那么该列只允许特定的值。如果对一个表定义 CHECK 约束,那么此约束会在特定的列中对值进行限制。

    CREATE TABLE 表名(   销售商 VARCHAR(20) NOT NULL CHECK(销售商 LIKE '%销售公司'),
                        电话 VARCHAR(8) CHECK(电话 LIKE '[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]'),
                        销售日期 DATE NOT NULL DEFAULT GETDATE())
    create(sex char check(sex='男' or sex='女') not null )
    alter table 表名 add constraint 约束名(sex_check) check(列名=‘男’or 列名=‘女’)
    

    修改基本

    alter table <表名>
    [add [column] <新列名> <数据类型> [完整性约束]]
    [add <表级完整性约束>]
    [drop [column] <列名> [cascade|restrict]]
    [drop constraint<完整性约束名> [cascade|restrict]]
    [alter column<列名><数据类型>]
    
    alter table student add s_time date
    

    不论基本表中原来是否已有数据,新增加的列一律为空值.
    drop column 子句用于删除表中的列,如果指定了cascade短语,则自动删除应用了该列的其他对象,如果指定了restrict短语则如果删除该列被欠他对象引用,rdbms将拒绝删除该列.
    add 子句用于增加新列,新的列级,表级完整性约束条件.
    drop constraint 子句用于删除指定的完整性约束条件.
    alter column 子句用于修改原有的列定义,包括修改列名和数据类型.

    删除基本表

    drop table <表名> [restrict|cascade]
    

    索引(index)

    索引的概念

    当表的数据量比较大时,查询操作会比较耗时.建立索引是加快查询速度的有效手段.数据库索引类似于图书后边的索引,能快速定位到所查询的内容.用户可以根据需要在基本表上建立一个或者多个索引,以提供多重存取路径,加快查找速度.

    索引的类型

    索引类型
    • 唯一索引:唯一索引不允许两行具有相同的索引值
    • 主键索引:为表定义一个主键将自动创建主键索引,主键索引是唯一索引的特殊类型。主键索引要求主键中的每个值是唯一的,并且不能为空
    • 聚集索引(Clustered):表中各行的物理顺序与键值的逻辑(索引)顺序相同,每个表只能有一个
    • 非聚集索引(Non-clustered):非聚集索引指定表的逻辑顺序。数据存储在一个位置,索引存储在另一个位置,索引中包含指向数据存储位置的指针。可以有多个,小于249个

    唯一索引

    唯一索引不允许两行具有相同的索引值。如果现有数据中存在重复的键值,则大多数数据库都不允许将新创建的唯一索引与表一起保存。当新数据将使表中的键值重复时,数据库也拒绝接受此数据。例如,如果在stuInfo表中的学员员身份证号(stuID) 列上创建了唯一索引,则所有学员的身份证号不能重复。
    提示:创建了唯一约束,将自动创建唯一索引。尽管唯一索引有助于找到信息,但为了获得最佳性能,建议使用主键约束或唯一约束。

    主键索引

    在数据库关系图中为表定义一个主键将自动创建主键索引,主键索引是唯一索引的特殊类型。主键索引要求主键中的每个值是唯一的。当在查询中使用主键索引时,它还允许快速访问数据。

    聚集索引(clustered index)

    在聚集索引中,表中各行的物理顺序与键值的逻辑(索引)顺序相同。表只能包含一个聚集索引。例如:汉语字(词)典默认按拼音排序编排字典中的每页页码。拼音字母a,b,c,d……x,y,z就是索引的逻辑顺序,而页码1,2,3……就是物理顺序。默认按拼音排序的字典,其索引顺序和逻辑顺序是一致的。即拼音顺序较后的字(词)对应的页码也较大。如拼音“ha”对应的字(词)页码就比拼音“ba” 对应的字(词)页码靠后。

    非聚集索引(Non-clustered)

    如果不是聚集索引,表中各行的物理顺序与键值的逻辑顺序不匹配。聚集索引比非聚集索引(nonclustered index)有更快的数据访问速度。例如,按笔画排序的索引就是非聚集索引,“1”画的字(词)对应的页码可能比“3”画的字(词)对应的页码大(靠后)。
    提示:SQL Server中,一个表只能创建1个聚集索引,多个非聚集索引。设置某列为主键,该列就默认为聚集索引

    索引的优点和缺点

    索引的优缺点
    • 优点
    – 加快访问速度
    – 加强行的唯一性
    • 缺点
    – 带索引的表在数据库中需要更多的存储空间
    – 操纵数据的命令需要更长的处理时间,因为它们需要对索引进行更新

    创建索引的指导原则

    创建索引的指导原则
    • 请按照下列标准选择建立索引的列。
    – 该列用于频繁搜索
    – 该列用于对数据进行排序
    • 请不要使用下面的列创建索引:
    – 列中仅包含几个不同的值。
    – 表中仅包含几行。为小型表创建索引可能不太划算,因为SQL Server在索引中搜索数据所花的时间比在表中逐行搜索所花的时间更长

    索引相关SQL

    创建索引

    CREATE [UNIQUE] [CLUSTERED|NONCLUSTERED]
    INDEX   index_name
     ON table_name (column_name…)
      [WITH FILLFACTOR=x]
      CREATE NONCLUSTERED INDEX IX_writtenExam
     ON stuMarks(writtenExam)
          WITH FILLFACTOR= 30
    /*-----指定按索引 IX_writtenExam 查询----*/
    SELECT * FROM stuMarks  (INDEX=IX_writtenExam)
    WHERE writtenExam BETWEEN 60 AND 90
    

    虽然我们可以指定SQL Server按哪个索引进行数据查询,但一般不需要我们人工指定。SQL Server将会根据我们创建的索引,自动优化查询
    UNIQUE表示唯一索引,可选
    CLUSTERED、NONCLUSTERED表示聚集索引还是非聚集索引,可选
    FILLFACTOR表示填充因子,指定一个0到100之间的值,该值指示索引页填满的空间所占的百分比

    修改索引

    alter index <旧的索引名> rename to <新的索引名>

    删除索引

    索引一经建立就由系统使用和维护,不需要用户干预.建立索引是为了减少查询操作的时间,但如果数据增、删、操作频繁,系统会话费许多时间来维护索引,从而降低了查询效率.这时可以删除一些不必要的索引.

    数据字典

    数据字典是关系数据库系统内部的一组系统表,它记录了数据库中所有的定义信息包括关系模式定义、视图定义、索引定义、完整约束定义、各类用户对数据库的操作权限统计信息等.关机数据库管理系统在执行SQL的数据定义语句时,实际上就是在更新数据字典中的相应信息.在进行查询优化和处理时,数据字典中的信息是其重要依据.

    展开全文
  • SSAS 定义和部署多维数据

    千次阅读 2016-10-07 21:27:38
    摘要:数据源试图创建之后,就可以定义多维数据集。可以使用多维数据集向导,通过单个步骤定义一个多维数据集及其维度。也可以先定义一个或多个维度,然后使用多维数据集向导定义一个使用这些维度的多维数据集。如果...

    摘要:数据源试图创建之后,就可以定义多维数据集。可以使用多维数据集向导,通过单个步骤定义一个多维数据集及其维度。也可以先定义一个或多个维度,然后使用多维数据集向导定义一个使用这些维度的多维数据集。如果要设计一个复杂的解决方案,通常是先定义维度。下面将依次完成下列任务:

    • 定义维度
    • 定义多维数据集
    • 向维度中添加属性
    • 检查多维数据集和维度属性
    • 部署 Analysis Services 项目
    • 浏览多维数据集

     定义维度

    1   如下图,右击“维度”文件夹,并选择“新建维度”,然后点击“下一步”


    2  选择“使用现有表”,并单击“下一步”

    3  如下图,主表选择Date,然后点击“下一步”

    4  依次选择下列属性名称,并将属性类型对应设置为小括号里的指定的类型,之后点击“下一步”
    Date Key 
    Full Date Alternate Key (日期)
    English Month Name (月份)
    Calendar Quarter (季度)
    Calendar Year (年)
    Calendar Semester(半年)


    5  点击“完成”


    6  这时可以看到刚刚创建的日期维度及维度设计器


    定义多维数据集(Cube)
    多维数据集向导可以帮助您为多维数据集定义度量值组和维度,下面一起看看如何一步步定义多维数据集:
    1  右击“多维数据集”并选择“新建多维数据集”,然后“下一步”

    2  选择“使用现有表”,然后“下一步”

    3   单击“建议”,建议要用来创建度量值组的表,度量值组表(又称为事实数据表)包含您感兴趣的度量值(如已销售的单位数)。

    4  如下图,清除不是实际的度量值,然后“下一步”
    默认情况下,该向导会选择将事实数据表中未链接到维度的所有数值列作为度量值。 但这四列不是实际的度量值。 前三列是将事实数据表与未在此多维数据集的初始版本中使用的维度表链接起来的键值。

    5  选择Date维度,然后“下一步”

    6  清除掉InternetSales维度,然后“下一步”

    7  指定多维数据集名称,然后“完成”

    8  结果如下图所示。这里,可以看到多维数据集内的维度和事实数据表(事实数据表是黄色的,维度表是蓝色的)。


    向维度中添加属性
    定义了维度之后,可以用表示维度中各数据元素的属性填充这些维度。 属性通常基于数据源视图中的字段在向维度中添加属性时,您可以在数据源视图中包括来自任何表的字段。
    1    向Customer维度里添加属性,然后全部保存
    双击打开Customer维度,进入维度设计器,然后从数据源视图的Customer和Geography两张表中的所需列拖到左边的属性栏里


    2  向Product维度里添加属性,然后全部保存


    检查多维数据集和维度属性
    1  在解决方案资源管理器里双击打开多维数据集cube_AdventureWorksDW2012.cube

    2   在“度量值”窗格中,将度量值到所需的顺序中可以更改它们的顺序。所创建的度量值顺序将影响某些客户端应用程序对这些度量值进行排序的方式度量值组及其包含的每个度量值都有属性,在“属性”窗口中可以编辑这些属性
    3  在“维度”窗格中,多出的与日期相关的维度也称为“角色扮演维度”。 使用三个与日期相关的多维数据集维度,用户可以按照下列三个与每个产品销售相关的单独事实数据在多维数据集中组织维度:产品订单日期、履行订单的到期日期和订单发货日期。通过将一个数据库维度重复用于多个多维数据集维度,Analysis Services 简化了维度管理,降低了磁盘空间使用量,并减少了总体处理时间。

    4  在“维度”窗格中,展开Customer,可以编辑它。

    5  在多维数据集设计器中,单击“维度用法”选项卡,可以看到度量值组所用的多维数据集维度。此外,可以定义每个维度及使用该维度的每个度量值组之间的关系类型。

    6  另外有“维度用法”,“分区”及“浏览器”等选项卡。

    部署 Analysis Services 项目
    若要查看多维数据集和维度数据,必须将项目部署到指定的 Analysis Services 实例中,然后再处理多维数据集及其维度。部署Analysis Services 项目将在 Analysis Services 实例中创建定义的对象。“处理”Analysis Services 实例中的对象会将基础数据源中的数据复制到多维数据集对象中。
    下面将查看SSAS Solution项目的部署属性,然后将该项目部署到 Analysis Services 的本地实例中:
    1  右击项目名称(SSAS Solution),然后点击“属性”
    将出现“SSAS Solution 属性页”对话框,并显示活动(开发)配置的属性。可以定义多个配置,每个配置可以具有不同的属性例如,开发人员可能需要将同一项目配置为部署到不同的开发计算机,并具有不同的部署属性,如数据库名称或处理属性。注意“输出路径”属性的值。该属性指定生成项目时保存项目的 XMLA 部署脚本的位置。 这些脚本用于将该项目中的对象部署到 Analysis Services 实例。


    2  在左窗格的配置属性节点中,单击部署,然后单击“确定
    查看项目的部署属性。 默认情况下,Analysis Services 项目模板将 Analysis Services 项目配置为将所有项目增量部署到本地计算机上的默认 Analysis Services 实例,以创建一个与此项目同名的 Analysis Services 数据库,并在部署后使用默认处理选项处理这些对象。


    3  再次右击项目,然后点击“部署”


    4  部署成功

    注意: 部署时可能会遇到诸如下面的错误信息,这时你可以尝试“使用特定Windows用户名和密码”(如下图),我是用这个选项才成功部署的。
    错误1            数据源“Adventure Works DW2012”包含无法用于处理操作的 ImpersonationMode。
    错误2           高级关系引擎中存在错误。 无法与 DataSourceID 为“Adventure Works DW2012”、名称为“Adventure Works DW2012”的数据源建立连接。
    错误3           OLE DB 错误: OLE DB 或 ODBC 错误 : 用户 'QUANTACN\C07065113-1$' 登录失败。

    浏览部署的多维数据集
    Cube部署完成后,可以在多维数据集设计器的“浏览器”选项卡中查看多维数据集数据,以及在维度设计器的“浏览器”选项卡中查看维度数据。对于多维数据集,“浏览器”选项卡提供了两种用于浏览数据的方法。 您可以使用内置 MDX 查询设计器生成从多维数据库返回平展行集的查询。 或者,您可以使用 Excel 快捷方式。对于浏览数据而言,Excel 将是首选解决方案。
    1   双击“Product”维度打开维度设计器


    2  点击“浏览器”,便可以看到相关成员

    3  单击Cube设计器中“浏览器”选项卡里的“重新连接”

    至此,定义和部署多维数据集相关工作已完成。

    本文参考MSDN

    展开全文
  • 类型别名(type alias)是一个名字,它是某种类型的同义词。...有两种方法可用于定义类型别名:传统的方法是使用关键字typedef;C++11中规定了一种新的方法,使用别名声明(alias declaration)来定义类型的别名,即使用...

    类型别名(type alias)是一个名字,它是某种类型的同义词。使用类型别名有很多好处,它让复杂的类型名字变得简单明了、易于理解和使用,还有助于程序员清楚地知道使用该类型的真实目的。在C++中,任何有效类型都可以有别名。

    有两种方法可用于定义类型别名:传统的方法是使用关键字typedef;C++11中规定了一种新的方法,使用别名声明(alias declaration)来定义类型的别名,即使用using.

    关键字typedef作为声明语句中的基本数据类型的一部分出现。含有typedef的声明语句定义的不再是变量而是类型别名。和以前的声明语句一样,这里的声明符也可以包含类型修饰,从而也能由基本数据类型构造出复合类型来。

    C++11中用关键字using作为别名声明的开始,其后紧跟别名和等号,其作用是把等号左侧的名字规定成等号右侧类型的别名。

    类型别名和类型的名字等价,只要是类型的名字能出现的地方,就能使用类型别名

    如果某个类型别名指代的是复合类型或常量,那么把它用到声明语句里就会产生意想不到的后果。

    使用typedef定义的别名和使用using定义的别名在语义上是等效的。 唯一的区别是typedef在模板中有一定的局限性,而using没有。

    尽管typedef具有更长的历史记录并且在现有代码中可能更常见,但using更通用。

    无论是typedef还是using,它们都不会创建新的数据类型,它们仅仅创建现有类型的同义词(synonyms)。不能用于更改现有类型名称的含义。

    typedef和using标识符可以声明数组和函数类型,指针和引用,类类型等等。但不能与任何其它标识符组合使用。仅在它们可见的范围内有效:不同的函数或类声明可以定义具有不同含义的相同名字的类型。

    typedef的用法包括:定义一种类型的别名;用于struct声明;用来定义与平台无关的类型;用于回调函数;为复杂的声明定义一个新的简单的别名。

    typedef是定义了一种类型的新别名,不同于宏,并不是简单的字符串替换。当const和typedef一起出现时,typedef不是简单的字符串替换:

    注意:typedef int* INT; const INT p;相当于int* const p;而不是const int* p;

    在使用typedef时,不能在声明中有多个存储类关键字:ypedef就像auto,extern, mutable, static, register一样,是一个存储类关键字。即typedef中不能出现这些关键字。

    下面是从其他文章中copy的测试代码,详细内容介绍可以参考对应的reference:

    typedef.cpp内容如下:

    #include "typedef.hpp"
    #include <iostream>
    #include <vector>
    #include <string>
    #include <ios>
    #include <type_traits>
    #include <typeinfo>
    
    namespace typedef_ {
    
    ///
    // reference: https://en.cppreference.com/w/cpp/language/typedef
     
    // std::add_const, like many other metafunctions, use member typedefs
    template< class T>
    struct add_const {
    	typedef const T type;
    };
    
    int test_typedef_1()
    {
    	// simple typedef
    	typedef unsigned long ulong;
     
    	// the following two objects have the same type
    	unsigned long l1;
    	ulong l2;
    
    	// more complicated typedef
    	typedef int int_t, *intp_t, (&fp)(int, ulong), arr_t[10];
    
    	// the following two objects have the same type
    	int a1[10];
    	arr_t a2;
    	for (int i = 0; i < 10; ++i)
    		a2[i] = i;
    	for (int i = 0; i < 10; ++i)
    		fprintf(stdout, "a2 value: %d\n", a2[i]);
     
    	// common C idiom to avoid having to write "struct S"
    	typedef struct {int a; int b;} S, *pS;
     
    	// the following two objects have the same type
    	pS ps1;
    	S* ps2;
     
    	// error: storage-class-specifier cannot appear in a typedef declaration
    	// typedef static unsigned int uint;
     
    	// typedef can be used anywhere in the decl-specifier-seq
    	long unsigned typedef int long ullong;
    	// more conventionally spelled "typedef unsigned long long int ullong;"
    
    	// std::add_const, like many other metafunctions, use member typedefs
    	/*template< class T>
    	struct add_const { // error: a template declaration cannot appear at block scope
    		typedef const T type;
    	};*/
     
    	typedef struct Node {
        		//struct listNode* next; // declares a new (incomplete) struct type named listNode
    	} listNode; // error: conflicts with the previously declared struct name
    
    	struct Node2 {
    		int data;
    		struct Node2* nextptr;
    	};
    
    	// 使用typedef可以将上面的Node2改写为:
    	typedef struct Node3 Node3;
    	struct Node3 {
    		int data;
    		Node3* nextptr;
    	};
    
    	typedef double wages; // wages是double的同义词
    	typedef wages base, *p; // base是double的同义词,p是double*的同义词
    	
    	return 0;
    }
    
    
    // reference: http://www.cplusplus.com/doc/tutorial/other_data_types/
    int test_typedef_2()
    {
    	// In C++, there are two syntaxes for creating such type aliases:
    	// The first, inherited from the C language, uses the typedef keyword:
    	// typedef existing_type new_type_name;
    {	
    	typedef char C;
    	typedef unsigned int WORD;
    	typedef char * pChar;
    	typedef char field [50];
    	
    	C mychar, anotherchar, *ptc1;
    	WORD myword;
    	pChar ptc2;
    	field name;
    }
    
    	// a second syntax to define type aliases was introduced in the C++ language:
    	// using new_type_name = existing_type;
    {
    	//the same type aliases as above could be defined as:
    	using C = char;
    	using WORD = unsigned int;
    	using pChar = char *;
    	using field = char [50];	
    }
    
    {
    	// 注意: typedef int* INT; const INT p;相当于int* const p;而不是const int* p;
    	typedef int* INT;
    	int a[] = {1, 2, 3};
    	const INT p1 = &a[0];
    	const int* p2 = &a[0];
    	//++p1; // error: increment of read-only variable 'p1'
    	p1[0] = -100;
    	fprintf(stdout, "a[0]: %d\n", a[0]);
    	++p2;
    	//p2[0] = -200; // error: assignment of read-only location '*p2' 
    }
    
    	return 0;
    }
    
    
    // reference: https://msdn.microsoft.com/en-us/library/dn467695.aspx
    void actual_function(int arg) { fprintf(stdout, "value: %d\n", arg); }  
    template<typename T>
    using ptr2 = T*;
    
    template<typename T>
    struct MyAlloc {
    	typedef T value_type;
    
    	MyAlloc() { }
    	template<typename U>
    	MyAlloc(const MyAlloc<U>&) { }
    
    	bool operator == (const MyAlloc&) const { return true; }
    	bool operator != (const MyAlloc&) const { return false; }
    
    	T* allocate(const size_t n) const {
    		fprintf(stdout, "start allocate\n");
    		if (n == 0) {
    			return nullptr;
    		 }
    
    		if (n > static_cast<size_t>(-1) / sizeof(T)) {
    			throw std::bad_array_new_length();
    		 }
    
    		void* const pv = malloc(n * sizeof(T));
    
    		if (!pv) {
    			 throw std::bad_alloc();
    		 }
    
    		return static_cast<T*>(pv);  
    	}
      
    	void deallocate(T* const p, size_t) const {
    		fprintf(stdout, "start deallocate\n");
    		free(p);
    	}
    };
    
    using MyIntVector = std::vector<int, MyAlloc<int>>;
    
    int test_typedef_3()
    {
    
    { // An alias does not introduce a new type and cannot change the meaning of an existing type name
    	// C++11  
    	using counter = long;  
      
    	// C++03 equivalent:  
    	// typedef long counter; 
    }
    
    { // Aliases also work with function pointers
    	// C++11  
    	using func = void(*)(int);  
      
    	// C++03 equivalent:  
    	// typedef void (*func)(int);  
      
    	// func can be assigned to a function pointer value  
    	func fptr = &actual_function;
    	fptr(10);
    }
    
    { // A limitation of the typedef mechanism is that it doesn't work with templates. However, the type alias syntax in C++11 enables the creation of alias templates:
    	//template<typename T> using ptr = T*; // error: a template declaration cannot appear at block scope   
      
    	// the name 'ptr<T>' is now an alias for pointer to T  
    	ptr2<int> ptr_int;
    }
    
    { // an alias template with a custom allocator
    	MyIntVector foov = { 1701, 1764, 1664 };
    	for (auto a: foov)
    		fprintf(stdout, " %d ", a);
    	fprintf(stdout, "\n");
    }
    
    	return 0;
    }
    
    ///
    // reference: https://zh.wikipedia.org/zh-hk/Typedef
    int do_math(float arg1, int arg2) { return arg2;  }
    
    int call_a_func(int (*call_this)(float, int))
    {
    	int output = call_this(5.5, 7);
    	return output;
    }
    
    // 将上面改为使用typedef,回调函数
    typedef int (*MathFunc)(float, int);
    int call_a_func2(MathFunc call_this)
    {
    	int output = call_this(5.5, 7);
    	return output;
    }
    
    int test_typedef_4()
    {
    	int final_result = call_a_func(&do_math);
    	fprintf(stdout, "final_result: %d\n", final_result);
    
    	int final_result2 = call_a_func2(&do_math);
    	fprintf(stdout, "final_result2: %d\n", final_result2);
    
    	return 0;
    }
    
    
    // reference: https://en.cppreference.com/w/cpp/language/type_alias
    // type alias, identical to
    // typedef std::ios_base::fmtflags flags;
    using flags = std::ios_base::fmtflags;
    // the name 'flags' now denotes a type:
    flags fl = std::ios_base::dec;
     
    // type alias, identical to
    // typedef void (*func)(int, int);
    using func = void (*) (int, int);
    // the name 'func' now denotes a pointer to function:
    void example(int, int) {}
    func f = example;
     
    // alias template
    template<class T>
    using ptr = T*; 
    // the name 'ptr<T>' is now an alias for pointer to T
    ptr<int> x;
     
    // type alias used to hide a template parameter 
    template<class CharT>
    using mystring = std::basic_string<CharT, std::char_traits<CharT>>;
    mystring<char> str;
     
    // type alias can introduce a member typedef name
    template<typename T>
    struct Container { using value_type = T; };
    // which can be used in generic programming
    template<typename Container>
    void g(const Container& c)
    {
    	typename Container::value_type n;
    	fprintf(stdout, "type: %s\n", typeid(n).name());
    }
     
    // type alias used to simplify the syntax of std::enable_if
    template<typename T>
    using Invoke = typename T::type;
    template<typename Condition>
    using EnableIf = Invoke<std::enable_if<Condition::value>>;
    template<typename T, typename = EnableIf<std::is_polymorphic<T>>>
    int fpoly_only(T t) { return 1; }
     
    struct S { virtual ~S() {} };
    
    int test_typedef_5()
    {
    	Container<int> c;
    	g(c); // Container::value_type will be int in this function
    	//fpoly_only(c); // error: enable_if prohibits this
    	S s;
    	fpoly_only(s); // okay: enable_if allows this
    
    	return 0;
    }
    
    } // namespace typedef_
    
    

    CMakeLists.txt内容如下:

    PROJECT(CppBaseTest)
    CMAKE_MINIMUM_REQUIRED(VERSION 3.0)
    
    # 支持C++11
    SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -Wall -O2 -std=c11")
    SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}  -g -Wall -O2 -std=c++11")
    # 支持C++14, when gcc version > 5.1, use -std=c++14 instead of c++1y
    SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}  -g -Wall -O2 -std=c++1y")
    
    MESSAGE(STATUS "project source dir: ${PROJECT_SOURCE_DIR}")
    SET(PATH_SRC_FILES ${PROJECT_SOURCE_DIR}/./../../demo/CppBaseTest)
    MESSAGE(STATUS "path src files: ${PATH_SRC_FILES}")
    
    # 指定头文件的搜索路径
    INCLUDE_DIRECTORIES(${PATH_SRC_FILES})
    
    # 递归查询所有匹配的文件:*.cpp
    FILE(GLOB_RECURSE CPP_LIST ${PATH_SRC_FILES}/*.cpp)
    FILE(GLOB_RECURSE C_LIST ${PATH_SRC_FILES}/*.c)
    #MESSAGE(STATUS "cpp list: ${C_LIST}")
    
    # 编译可执行程序
    ADD_EXECUTABLE(CppBaseTest ${CPP_LIST} ${C_LIST})
    # 用来为target添加需要链接的共享库,指定工程所用的依赖库,包括动态库和静态库
    TARGET_LINK_LIBRARIES(CppBaseTest pthread)
    

    build.sh脚本内容如下:

    #! /bin/bash
    
    real_path=$(realpath $0)
    dir_name=`dirname "${real_path}"`
    echo "real_path: ${real_path}, dir_name: ${dir_name}"
    
    new_dir_name=${dir_name}/build
    mkdir -p ${new_dir_name}
    cd ${new_dir_name}
    cmake ..
    make
    
    cd -
    

    编译及测试方法如下:首先执行build.sh,然后再执行./build/CppBaseTest即可。

    GitHubhttps://github.com/fengbingchun/Messy_Test  

    展开全文
  • SSAS_定义和部署多维数据

    千次阅读 2012-06-01 12:19:03
    摘要:数据源试图创建之后,就可以定义多维数据集。可以使用多维数据集向导,通过单个步骤定义一个多维数据集及其维度。也可以先定义一个或多个维度,然后使用多维数据集向导定义一个使用这些维度的多维数据集。如果...
  • SQL-DLL-数据定义语言

    千次阅读 2009-01-23 11:56:00
    3.2.2.1 创建数据表(1) 创建一个数据表的命令组成部分:创建一个数据表的命令组成部分有字段名,字段数据类型,字段长度,精度和小数位数以及字段的NULL值与DEFAULT值。(2) 创建数据表的SQL语法格式在SQL语言...
  • problem下列哪些方法可以用来对高维数据进行降维:A. LASSOB. 主成分分析法C. 聚类分析D. 小波分析法E. 线性判别法F. 拉普拉斯特征映射答案: A B C D E FanalysisLasso(Least absolute shrinkage and selecti...
  • 超硬核!数据结构学霸笔记,考试面试吹牛就靠它

    万次阅读 多人点赞 2021-03-26 11:11:21
    上次发操作系统笔记,很快浏览上万,这次数据结构比上次硬核的多哦,同样的会发超硬核代码,关注吧。
  • 数据结构基础概念篇

    万次阅读 多人点赞 2017-11-14 13:44:24
    数据结构就是研究数据的逻辑结构和物理结构以及它们之间相互关系,并对这种结构定义相应的运算,而且确保经过这些运算后所得到的新结构仍然是原来的结构类型。数据:所有能被输入到计算机中,且能被计算机处理的...
  • 1.定义物料类型 概念及功能说明 物料类型是对物料进行分组的一种方式,每一种类型的物料有相同的基本属性,例如原材料、半成品和成品。创建物料主记录时,将物料分配到物料类型。物料类型属于物料的一般数据。控制着...
  • 浅析数据一致性

    万次阅读 多人点赞 2016-02-19 15:27:38
    什么是数据一致性?  在数据有多分副本的情况下,如果网络、服务器或者软件出现故障,会导致部分副本写入成功,部分副本写入失败。这就造成各个副本之间的数据不一致,数据内容冲突。 实践中,导致数据不一致的情况...
  • 数据挖掘面试 150 道题(附答案)

    万次阅读 多人点赞 2019-09-21 13:50:38
    1. 某超市研究销售纪录数据后发现,买啤酒的人很大概率也会购买尿布,这种属于数据挖掘的哪类问题?(A) A. 关联规则发现 B. 聚类 C. 分类 D. 自然语言处理 2. 以下两种描述分别对应哪两种对分类算法的评价标准...
  • 数据结构知识整理

    万次阅读 多人点赞 2018-07-30 18:50:47
    1.数据结构:是一门研究非数值计算的程序设计问题中计算机的操作对象以及他们之间的关系和操作等的学科。 2.数据结构涵盖的内容: 3.基本概念和术语: 数据:对客观事物的符号表示,在计算机科学中是指所有能...
  • C#数据类型

    千次阅读 多人点赞 2012-04-23 19:11:16
    C#的数据类型可以分为3类:数值类型,引用类型,指针类型。指针类型仅在不安全代码中使用。  值类型包括简单类型(如字符型,浮点型和整数型等),集合类型和结构型。引用类型包括类类型,接口类型,代表类型和数组...
  • 数据挖掘报告

    万次阅读 热门讨论 2010-04-10 10:03:00
    研究方向前沿读书报告数据挖掘技术的算法与应用 目录第一章 数据仓库... 51.1 概论... 51.2 数据仓库体系结构... 61.3 数据仓库规划、设计与开发... 71.3.1 确定范围... 71.3.2 环境评估... 71.3.3 分析... 71.3.4 ...
  • 1. 使用 ANSYS 仿真的时候为什么要进行材料特性的定义? >> 在分析物理几何模型的时候,对于不同的材质区域需要定义不同的材料区域。对于电磁场仿真而言,常用的需要定义材料特性的区域有: 1. 空气(自由空间...
  • 数据结构基础知识核心归纳(一)

    万次阅读 多人点赞 2017-09-09 09:56:42
    堆是一种树状的数据结构。一般由程序员分配释放,存放由new创建的对象和数组(C中是由malloc分配和free释放),JVM不定时查看这个对象,如果没有引用指向这个对象就回收.1)优点:可动态分配内存大小,生成周期不必事先...
  • 数据仓库的数据质量

    千次阅读 2011-08-31 22:20:41
    (一)数据质量的衡量标准、好处和问题   数据质量的好坏是决定一个数据仓库成功的关键,但是... 可以从下列方面衡量系统中的数据质量:  准确性:存储在系统中的关于一个数据元素的值是这个数据元素的正确值 ;
  • Oracle 数据字典和数据字典视图

    万次阅读 2010-07-03 22:43:00
    本文介绍了Oracle数据字典和数据字典视图。
  • 用户定义函数不能用于执行修改数据库状态的操作。与系统函数一样,用户定义函数可从查询中调用。标量函数和存储过程一样,可使用 EXECUTE 语句执行。用户定义函数可使用 ALTER FUNCTION 修改,使用 DROP FUNCTION ...
  • 2.1线性表的类型定义

    千次阅读 2017-01-25 16:57:53
    2.1线性表的类型定义
  • 通常来说,模型中的数据项包含一系列不同的数据角色,数据角色定义在 Qt.ItemDataRole 枚举中,包括下列枚举值: Qt.DisplayRole:文本表格中要渲染的关键数据 Qt.EditRole:编辑器中正在编辑的数据 Qt.To...
  • 数据挖掘之聚类k-means

    千次阅读 2015-04-15 16:36:35
    4、聚类 聚类分析提供由个别...注意:簇的定义是不精确的,而最好的定义依赖于数据的特征和期望的结果。聚类分析与其他将数据对象分组的技术有关。监督学习(也叫监督分类或分类):使用一个由类标号已知的对象开
  • c++之数据结构

    万次阅读 2018-02-08 18:02:13
    结构用于表示一条记录,假设您想要跟踪图书馆中书本的动态,您可能需要跟踪每本书的下列属性:Title :标题Author :作者Subject :类目Book ID :书的 ID定义结构为了定义结构,您必须使用 struct 语句。...
  • 数据结构】数据结构中常用的树

    万次阅读 多人点赞 2016-07-31 21:29:17
    1、树的定义首先给出树的相关定义:树(tree)是包含n(n>0)个结点的有穷集,其中: 1)每个元素称为结点(node); 2)有一个特定的结点被称为根结点或树根(root); 3)除根结点之外的其
  • 1. 在软件开发过程中,我们可以采用不同的过程模型,下列有关增量模型描述正确的() A. 已使用一种线性开发模型,具有不可回溯性 B, 把待开发的软件系统模块化,将每个模块作为一个增量组件,从...
  • 敏感信息定义与实例

    万次阅读 2019-06-16 16:05:46
    通信记录和内容、短信、彩信、电子邮件,以及描述个人通信的数据(通常称为元数据)等 9 联系人信息 通讯录、好友列表、群列表、电子邮件地址列表等 10 个人上网记录 指通过日志储存的...
  • 网易2018校园招聘数据分析工程师笔试卷(来源:牛客网) 题型 客观题:单选51道,不定项选择12道 完成时间 120分钟 牛客网评估难度系数 3颗星 1. 在软件开发过程中,我们可以采用不同的过程模型,下列有关 增量模型...
  • SQL Server2005 中的数据类型总结

    千次阅读 2009-08-15 11:15:00
    SQL Server2005 中的数据类型总结 SQL Server 2005 中的数据类型归纳为下列类别:精确数字 bigint decimal int numeric smallint money tinyint smallmon
  • 数据结构(C语言)第二版 第一章课后答案

    千次阅读 多人点赞 2020-02-01 18:19:12
    数据结构(C语言)第二版 第一章课后答案 就是这本,我以后也会用,所以趁着考完试做个...1. 简述下列概念:数据数据元素、数据项、数据对象、数据结构、逻辑结构、存储结构、抽象数据类型。 数据是对客观事物的符...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 181,739
精华内容 72,695
关键字:

下列不是用于数据定义的