CREATE DATABASE YqBang;
逐字翻译:创建 数据库 YqBang,非常容易理解。观察这条SQL语句,它主要由以下这些内容组成:
另外:
|
T-SQL |
mysql |
保留字/关键字/非规范符号等做库名、表名、列名等 |
方括号括住,如:[17bang] |
反引号括住,如`17bang` |
分号;用于一条SQL语句的末尾,标志一条SQL语句的结束。 |
可以(但不建议)省略 |
命令行窗口,或某些控制台必须加 |
USE YqBang; -- 切换到数据库17bang
SQL语句:
DROP DATABASE YqBang;但是,使用时注意两个问题:
-- 如果数据库YqBang存在就删除它,否则就啥也不做 DROP DATABASE IF EXISTS YqBang
其实在建表视图底部就可以观察到自动生成的建表T-SQL语句:
|
|
dbo是database owner(数据库所有者)的首字母缩写,可以理解为数据库的一个特殊用户(或默认用户),一般可以省略。 延伸阅读:一个数据库可以由多个用户访问,多个用户都可以创建“同名”的表,可以在这些表前面加上用户名加以区分。 比如Jimmy.Student,和ATai.Student,这是用户Jimmy和ATai各自不同的表。 dbo.Table即用户dbo的表Table,但dbo比较特殊——sysadmin下的所有用户都自动映射到dbo…… |
`17bang`指的是数据库 |
-- 创建 表格 [dbo].[Table],[Table]指表名,由开发人员指定。 CREATE TABLE [dbo].[Table] ( -- 括起来的部分确定表格的结构,包括了: -- Id列,只能是INT类型,不能为NULL值,是主键(后文详解) [Id] INT NOT NULL PRIMARY KEY, -- UserName列,只能是NCHAR(10)类型,可以为NULL [Name] NVARCHAR(10) NULL );
SQL是“强类型”的,设计表头的时候就应该指定数据类型。
相比其他语言,数据库的数据类型设置更加具体复杂,因为这样可以更高效的存储。把数据想象成大小不一的砖头(块,block),放在不同类型的盒子(box)里:盒子太小砖头装不进去,盒子太大浪费空间。
更好的规划盒子,让砖头放进去可以刚刚好或者空余少,就能够节约存储空间:
SQL为我们提供了很多数据类型,但常用的数据类型有:
表示数据以文本(字符串)形式存储,比如:“大飞哥”、“17bang”、“源栈”。
文本类型的数据一般需要指定其长度(Length),即该文本需要占用的字节数(不是字符个数)。
长度在类型后面用圆括号括起来,默认为1,最大值为8000。又可以分为:
如果最大长度可能超过8000,就只能使用TEXT,通常用于大篇幅不限字数的文章正文等。另:
整数
最常用的是INT,其他还有tinyint,smallint和bigint
他们的区别是能够容纳的数据大小不一样,比如tinyint就只能存储0-255的数据,超过这个大小的数据(比如986)就无法存放进去。
那为什么不通通使用最大的bigint呢?因为要节省存储空间。能够容纳更大数据的类型,所需要的空间更大。
合理的选择数据类型,比如存储一个人的年龄,就使用tinyint好了,没有人的年龄会小于0大于255,这比使用int要节省1/4的磁盘空间(tinyint的存储空间是1Byte,int是4Bytes)。
小数
常用的又有两种:
float和real:小数位数可变的(非精确的)存储方式。比如你输入32,整数,SQL Server就存放为32,不会像decimal那样加小数点并补0为32.00;你也可以输入32.986,SQL Server就把它存储为32.986。 参考:float and real
表示只能存储“真(是)”和“假(否)”两种值,
本质上还是一个整数类型:用1表示真,0表示假
表示存储的是时间,常用的有:
所有修改表结构的语句,都首先要使用ALTER TABLE,比如:
ALTER TABLE Student
上述SQL语句指明:修改 表 Student。接下来可以进行列的增删改。
比如增加列 Score,该列的数据类型为DECIMAL(3,1),那就需要在 ALTER TABLE Student 之后添加:
ALTER TABLE Student ADD Score DECIMAL(3,1);删除列 Score,同样在ALTER TABLE Student 之后添加(后文不再特别指明):
ALTER TABLE Student DROP COLUMN Score;
还可以修改列
T-SQL | mysql |
ALTER TABLE Student ALTER COLUMN SCORE FLOAT NULL; |
ALTER TABLE Student modify COLUMN SCORE FLOAT NULL; |
修改表名/列名需要使用系统存储过程 |
ALTER TABLE Student change `Name` SName VARCHAR(50); |
注意:为了保证数据安全,不能在两种完全不兼容(incompatible)的数据类型之间进行修改,比如INT转换成BIGINT,是完成没有问题的,986从INT转换成BIGINT还是986;但INT无法转换成DATETIME,986怎么转换成一个时间呢?
DROP TABLE Student;
同时运行建库和切换数据库的代码试试:
CREATE DATABASE YqBang; USE YqBang;
你会得到一个错误提示,说数据库不存在:
Msg 911, Level 16, State 1, Line 2 Database '17bang' does not exist. Make sure that the name is entered correctly.17bang
这个数据库我不是刚建立了的么?
OK,要理解这一点,需要我们首先理解一个 批处理 的概念
简单的说,SQL Server会把所有发送给它的SQL语句作为一个完整的可执行的单元进行处理(包括解析、优化、执行等等),这些SQL语句被称之为“一批”。
上述建库和切换数据库的命令无法在同一批次中完成,或者你可以理解成:创建一个数据库,这个数据库只能在下一“批次”才能被使用。
所以你有两个选择:
CREATE DATABASE YqBang; GO --GO后面不要加; USE YqBang;
使用SQL语句(以后所有作业均是要求使用SQL语句完成,不再额外声明)
使用SQL语句(以后所有作业均是要求使用SQL语句完成,不再额外声明)
多快好省!前端后端,线上线下,名师精讲
更多了解 加: