创建数据库

图形模式
在这里插入图片描述
在这里插入图片描述

命令模式

create database myTestDb02

产生两个文件
在这里插入图片描述

删除数据库

图形模式
鼠标邮件点击要删除的数据库,选删除
命令模式

Drop database myTestDb02

修改数据库名字

Alter database myTestDb02 Modify Name = myTestDb03

修改数据库密码

1、首先需要知道SQL Server默认用户名是sa,密码是安装的时候设置的密码,连接服务器的时候选择SQL Server身份验证,输入用户名和密码就完成了。

2、如果忘记了安装设置的默认密码,选择Windows身份验证,然后进去修改默认用户的密码就可以,也可以通过这个方式查看账户和密码。

在这里插入图片描述

3、进去之后,点击安全性->登录名->sa。

在这里插入图片描述

4、鼠标右键sa用户,选择属性。

在这里插入图片描述

5、进去之后,可以查看到账户密码,也可以重新设置账户密码,输入要设置的密码,这里设置123456,点击确定,就成功设置了默认用户的密码。

在这里插入图片描述

创建表

首先选在创建表所在的数据库

设计创建

在这里插入图片描述

在sql窗口写sql语句


create table myTestTable01 

create table gendertable 
(
	id int primary key ,
	gender nvarchar(50) not null
)

根据旧表创建新表

1、只要表结构不要数据 :select * into newtable from oldtable where 1=2

2、 既要表结构又要数据 :select * into newtable from oldtable

主键约束

# primary key约束唯一表示数据库表中的每条记录
# 主键必须包含唯一的值
# 主键列不能包含null值
# 每个表都应该有一个主键,并且每个表只能有一个主键

# mysql 创建表的时候创建主键
CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
PRIMARY KEY (Id_P)
)

# mysql / SQL Server / Oracle / MS Access:

CREATE TABLE Persons
(
Id_P int NOT NULL PRIMARY KEY,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)

# 表已存在的时间添加主键,如果您使用 ALTER TABLE 语句添加主键,必须把主键列声明为不包含 NULL 值(在表首次创建时)
ALTER TABLE Persons
ADD PRIMARY KEY (Id_P)
# 撤销主键约束
ALTER TABLE Persons
DROP PRIMARY KEY

设计外键

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
crtl+s 保存
在这里插入图片描述
在这里插入图片描述
外键冲突,是因为有外键的表的外键的值在对应的外键表的主键没有这个值,修改下外键值。重新保存即可。

通过语句创建外键

先删除外键
在这里插入图片描述

alter table EmployeeTable 
add constraint FK_EmployeeTable_GenderId_GenderTable_ID
foreign key (genderid) references gendertable(id)
# 父表 persons 子表 orders
# persons中的Id_P是父表的primary key
# orders中的Id_P是字表中的foreign key

# 外键约束用于预防破坏表之间连接的动作
# 外键约束也能预防非法数据插入外键列,因为他必须指向父表中的值之一

# 在创建子表的时候创建外键

CREATE TABLE Orders
(
Id_O int NOT NULL,
OrderNo int NOT NULL,
Id_P int,
PRIMARY KEY (Id_O),
FOREIGN KEY (Id_P) REFERENCES persons(Id_P)
}

# 在子表已经存在的情况下创建外键约束
ALTER TABLE ORDERS ADD FOREIGN KEY(Id_P) REFERENCES persons (Id_P)

# 如果需要命名FOREIGN KEY约束,以及为多个列定义外键约束
ALTER TABLE orders ADD CONSTRAINT fk_PerOrders FOREIGN KEY (Id_P) 

# 撤销外键约束
ALTER TABLE orders DROP FOREIGN KEY fk_PerOrders

创建默认约束

给定字段一个默认值,添加纪录时候,自动获得这个默认值。

alter table EmployeeTable 
add constraint Default_Phone_99999
Default 99999 for Phone


insert into EmployeeTable (ID,[Name],GenderID)values (5,'赵六',3)

语句中的字段名的大小写任意,方括号可以不用。

在这里插入图片描述

唯一约束

# UNIQUE 约束唯一表示数据库表中的每条记录
# UNIQUE 和 PRIMARY KEY约束均为列或列集合提供了唯一性的保证
# PRIMARY KEY拥有自动定义的UNIQUE约束
# 注意!!每个表可以有多个UNIQUE约束,但是每个表只能有一个PRIMARY KEY约束

# Mysql 创建UNIQUE约束
CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
UNIQUE (Id_P)
)

外键更新规则

在这里插入图片描述
1·不执行任何操作:更新或删除被禁止
2·级联:同时被更新或删除
3·设置NULL:被设置为NULL
4·设置默认值:被设置为该列默认值

添加Check & Unique 约束

CheckConstraint:给列设置条件,检查新插入的数据或者更新的数据是否符合该条件
UniqueKey:设置为Unique的列不允许有重复值的出现,可以允许一个NULL

添加一个电话号码大于零的约束。

alter table employeetable 
add constraint CK_phone
check (phone>0)

插入一个电话号码小于零的记录,报错。

insert into employeetable values(6,'mike',-100,3)

在这里插入图片描述

唯一约束
在这里插入图片描述

select 和 where

所有字段

select * from orders

选定字段

select t.orderid,t.OrderDate from orders t

去重字段
在这里插入图片描述
where 条件
在这里插入图片描述
在这里插入图片描述

通配符
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

group by

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
执行顺序
在这里插入图片描述

join

cross join
在这里插入图片描述

# join用于根据两个或多个表中的列之间的关系,从这些表中查询数据
# 数据库的表可通过键将彼此联系起来

# 可以通过引用两个表的方式来获取数据
SELECT persons.lastname, persons.firstname, orders.orderNO FROM persons,orders
WHERE persons.ID = orders.ID

# 使用关键词 JOIN 来从两个表中获取数据
SELECT persons.lastname, persons.firstname, orders.orderNO FROM persons
INNER JOIN orders ON persons.ID = orders.ID ORDERBY persons.lastnam
# 不同的SQL JOIN
上面使用的INNER JOIN(内连接)

还有这些join类型
JOIN: 如果表中至少一个匹配,则返回行
LEFT_JOIN: 即使右表中没有匹配,也从左表返回所有的行
RIGHT_JOIN: 即使左表中没有匹配,也从右表返回所有的行
FULL JOIN: 只要其中一个表存在匹配,就返回行

inner join
在这里插入图片描述

# 当表中至少存在一个匹配时, inner join关键字返回行, inner join和join是相同的

SELECT column_name(s)
FROM table_name1
INNER JOIN table_name2 
ON table_name1.column_name=table_name2.column_name

left join
先增加一行

在这里插入图片描述
在这里插入图片描述

# left join 关键字会从左表那里返回所有的行,即使在右表中没有破匹配的行

SELECT column_name(s)
FROM table_name1
LEFT JOIN table_name2 
ON table_name1.column_name=table_name2.column_name

RIGHT JOIN

# RIGHT JOIN 关键字会右表 (table_name2) 那里返回所有的行,即使在左表 (table_name1) 中没有匹配的行。

SELECT column_name(s)
FROM table_name1
RIGHT JOIN table_name2 
ON table_name1.column_name=table_name2.column_name

FULL JOIN

# 只要其中某个表存在匹配, FULL JOIN关键字就会返回行
SELECT column_name(s)
FROM table_name1
FULL JOIN table_name2 
ON table_name1.column_name=table_name2.column_name

UNION 和 UNION ALL 操作符

# UNION 操作用于合并两个或多个select 语句的结果集

# union
# 默认的,union操作符选取不同的值,如果允许重复的值,应该使用union all
SELECT column_name(s) FROM table_name1
UNION
SELECT column_name(s) FROM table_name2

# union all
SELECT column_name(s) FROM table_name1 
UNION ALL 
SELECT column_name(s) FROM table_name2

select into

# select into语句用于创建表的备份复件
# select into从一个表中选取数据,然后插入另一个表

# 把所有列插入新表
SELECT *
INTO new_table_name [IN externaldatabase] 
FROM old_tablename

# 只把希望的列插入新表
SELECT column_name(s)
INTO new_table_name [IN externaldatabase] 
FROM old_tablename

# 下面的例子会制作 "Persons" 表的备份复件:
SELECT *
INTO Persons_backup
FROM Persons

# IN 子句可用于向另一个数据库中拷贝表:
SELECT *
INTO Persons IN 'Backup.mdb'
FROM Persons

存储过程

在这里插入图片描述
带参数的存储过程
在这里插入图片描述
或者这样调用
在这里插入图片描述

输出参数

在这里插入图片描述

top子句

top子句用于规定要返回的记录的数目

并非所有数据库系统都支持top子句

# sqlserver
SELECT TOP number|percent column_name(s) FROM table_name

# mysql
SELECT column_name(s) FROM table_name LIMIT number

# oracle
SELECT column_name(s) FROM table_name WHERE ROWNUM <= number

# 选取50%内容

SELECT TOP 50 PERCENT * FROM persons

like操作符实例

# 例1
# 从 "Persons" 表中选取居住在以 "N" 开始的城市里的人:
SELECT * FROM Persons WHERE City LIKE 'N%'

# 从 "Persons" 表中选取居住在以 "g" 结尾的城市里的人:
SELECT * FROM Persons WHERE City LIKE '%g'

# 从 "Persons" 表中选取居住在不包含 "lon" 的城市里的人:
SELECT * FROM Persons WHERE City NOT LIKE '%lon%'

通配符

在这里插入图片描述

# 从上面的 "Persons" 表中选取名字的第一个字符之后是 "eorge" 的人
SELECT * FROM Persons WHERE FirstName LIKE '_eorge'# 从上面的 "Persons" 表中选取居住的城市以 "A" 或 "L" 或 "N" 开头的人SELECT * FROM Persons WHERE City LIKE '[ALN]%'# 从上面的 "Persons" 表中选取居住的城市不以 "A" 或 "L" 或 "N" 开头的人SELECT * FROM Persons WHERE City LIKE '[!ALN]%'

SQL IN操作符

SELECT column_name(s) FROM table_name WHERE column_name IN (value1,value2,...)

BETWEEN

# BETWEEN 操作符在 WHERE 子句中使用,作用是选取介于两个值之间的数据范围
# 操作符 BETWEEN ... AND 会选取介于两个值之间的数据范围。这些值可以是数值、文本或者日期。
SELECT column_name(s) FROM table_name WHERE column_name BETWEEN value1 AND value2

# 显示范围之外的人
SELECT * FROM Persons WHERE LastName 
NOT
 BETWEEN 'Adams' AND 'Carter'

SQL Alias(别名)

# 通过使用 SQL,可以为列名称和表名称指定别名(Alias)

# 表的别名用法
SELECT column_name(s) FROM table_name AS alias_name
# 列的别名用法
SELECT column_name AS alias_name FROM table_name

# 假设我们有两个表分别是:"Persons" 和 "Product_Orders"。我们分别为它们指定别名 "p" 和 "po"。
SELECT PO.orderID, p.lastname, p.firstname FROM Persons AS p, Product_orders AS po WHERE p.LastName='Adams' AND p.FirstName='John'

# 使用一个列名别名
SELECT LastName 
AS Family
, FirstName 
AS Name
 FROM Persons

CREATE INDEX 索引

# create index语句用于在表中创建索引
# 在不读取整个表的情况下,索引使数据库应用程序可以更快的查找数据

# 可以在表中创建索引,一遍更加快速高效的查询数据
# 用户无法看到索引,他们只能用来加速搜索/查询

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

# 语法
在表上创建一个简单的索引,允许使用重复的值, column_name对顶需要索引的列
CREATE INDEX index_name ON table_name (column_name)

# 创建唯一索引
CREATE UNIQUE INDEX index_name ON table_name (column_name)

# 创建索引
CREATE INDEX PersonIndex
ON Person (LastName) 

# 降序索引某个列中的值,在列名称之后添加保留字 DESC
CREATE INDEX PersonIndex
ON Person (LastName DESC) 

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

DROP语句

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

ALTER TABLE table_name DROP INDEX index_name

DROP TABLE 表名称

DROP DATABASE 数据库名称


# 如果我们仅仅需要除去表内的数据,但并不删除表本身,那么我们该如何做呢?
# truncate table 表名称
# 仅仅是删除表格中的数据
TRUNCATE TABLE 表名称

ALTER语句

# 添加
ALTER TABLE table_name
ADD column_name datatype

# 删除
ALTER TABLE table_name
DROP column_name datatype

# 在表 "Persons" 中添加一个名为 "Birthday" 的新列
ALTER TABLE Persons ADD  Birthday date

# 改变 "Persons" 表中 "Birthday" 列的数据类型
ALTER TABLE Persons  ALTER CLOUMN Birthday year

# 删除 "Person" 表中的 "Birthday" 列
ALTER TABLE Persons DROP COLUMN Birthday

AUTO_INCREMENT

# 我们通常希望在每次插入新记录时,自动地创建主键字段的值

CREATE TABLE Persons
(
P_Id int NOT NULL PRIMARY KEY AUTO_INCREMENT,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)

MySQL 使用 AUTO_INCREMENT 关键字来执行 auto-increment 任务。
默认地,AUTO_INCREMENT 的开始值是 1,每条新记录递增 1。
要让 AUTO_INCREMENT 序列以其他的值起始,请使用下列 SQL 语法:

ALTER TABLE Persons AUTO_INCREMENT=100

查询数据库所有表名及行数

--查询数据库所有表名
 
select name from sysobjects where xtype='u'
--查询数据库中所有表
 
select * from sys.tables
--查询数据库所有表名及每个表的行数
 
SELECT a.name, b.rows FROM sysobjects AS a 
 
INNER JOIN sysindexes AS b ON a.id = b.id
 
WHERE (a.type = 'u') AND (b.indid IN (0, 1))
 
ORDER BY a.name,b.rows DESC
--查询所有的表名及空间占用量\行数
 
select
 
object_name(id) tablename,
 
8*reserved/1024 reserved,
 
rtrim(8*dpages)+'kb' used,
 
8*(reserved-dpages)/1024 unused,
 
8*dpages/1024-rows/1024*minlen/1024 free,
 
rows
 
--,*
 
from sysindexes
 
where indid=1
 
order by tablename,reserved desc

视图 VIEW

# 如何创建、更新和删除视图。
# 视图是基于SQL语句结果集的可视化的表
# 视图包含行和列,就像一个真实的表。视图中的字段就是来自一个或多个数据库中的真实的表中的字段。我们可以向视图添加 SQL 函数、WHERE 以及 JOIN 语句,我们也可以提交数据,就像这些来自于某个单一的表。

# 数据库的设计和结构不会受到视图中的函数、where 或 join 语句的影响

CREATE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition

# 使用以下语法来更新视图
SQL CREATE OR REPLACE VIEW Syntax
CREATE OR REPLACE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition


# DROP VIEW 命令来删除视图
SQL DROP VIEW Syntax
DROP VIEW view_name

DROP VIEW IF EXISTS view_name
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐