T-SQL - 记录01_基础sql语句操作

Posted jswl

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了T-SQL - 记录01_基础sql语句操作相关的知识,希望对你有一定的参考价值。

  • 时间:2017-12-25 整理:byzqy

最近详细学习了一下MS SQL Server相关的知识,收获不小,在此记录一下,可能有点零散,后续会慢慢整理!

1、对数据库的一些认识

数据库中只认命令(脚本),所有的可视化操作实质上都是执行的SQL命令。

2、简单复习

1.数据库(要是使用数据库,首先需要打开服务),表(即数据表)

  安装了几个数据库实例,就有几个数据库服务(服务器名称,貌似就是数据库实例名称)

2.创建数据库,创建表

3.数据类型

  --带var表示不固定长度,不带var表示固定长度

  --n表示使用Unicode保存,保存双字节字符,不带n的表示使用单字节字符保存

4.主键、外键(为了减少数据冗余)

  --一个表中只能有一个主键,也可以没有主键(推荐表中要有主键)

  --主键可以只由一个列组成,也可以由多个列组成

  --有外键的表叫外键表,被引用的表叫主键表

5.t-sql语句创建数据库,创建表

  --创建默认参数数据库:create database TestDB;

  --创建表:create table MyTable(列名 数据类型 列的其他选项)

6.数据库的分离和附件(数据库分离之后,才能对数据库文件进行复制等操作)

3、关于SQL

SQL是最基本的命令;

T-SQL是微软对SQL的扩展(Teansact-SQL,Structured Query  Language);

PL/SQL是甲骨文对SQL的扩展。

SQL分类:

  DDL(数据定义语言)

  DML(数据操作语言)--我们程序员常用的

  DCL(数据控制语言)

4、C#和SQL的区别

  1. C# 中双引号表示字符串
     SQL 中使用单引号表示字符串

  2. C# 中使用==判断两个变量是否相等
     SQL 使用=表示两个值是否相等

  3. C# 严格区分大小写
     SQL 默认不区分大小写

  4. C# 中使用\(斜杠)来表示转义
     SQL 中使用‘(单引号)来表示转义

  5. SQL中的or相当于C#中的||(或者)
     C#中的!(非)对应SQL中的not
     C#中的&&(且)对应SQL中的and
     C#中的||(或)对用SQL中的or

5、C#中ADO.NET常用类

Connection 连接数据库
Command 执行sql语句
DataReader 读取数据
DataAdapter 封装上面三个对象的对象
DataSet 数据集


 

文件:SQLQuery4.sql

技术分享图片
--1.创建数据库(不设置参数)
create database MyDatabaseOne;

--2.删除数据库
drop database MyDatabaseOne;

--3.创建数据库时设置一些参数选项
create database MydatabaseTwo
on primary
(
    --配置主数据文件的选项
    name=MyDatabaseTwo,--主数据文件的逻辑名称
    filename=C:\DB_Test\MyDatabaseTwo.mdf,--主数据文件的实际保存路径
    size=5MB,
    maxsize=150MB,
    filegrowth=20%
)
log on
(
    --配置日志文件的选项
    name=MyDatabaseTwo_log,--日志文件的逻辑名称
    filename=C:\DB_Test\MyDatabaseTwo_log.ldf,--日志文件的实质保存路径
    size=5MB,--日志文件的初始大小
    filegrowth=5MB
)
--此处可能会报错,是一个C盘权限的问题
--如果忘记命令,还可以通过鼠标操作生成脚本的方式查看命令

--4.在数据库中创建一张表
--在执行之前先要切换到要创建的数据库到当前

use School

create table [Departments]
(
    ID int identity(1,1) primary key,
    Name nvarchar(50) not null
)

--5.通过代码删除数据库和表

use School

drop database [MyDatabaseTwo]

drop table [Departments]

--6.通过代码创建员工表
use [School];

create table Employees
(
    ID int identity(1,1) primary key,
    IDCard varchar(18) not null,
    Name nvarchar(50) null,
    Gender bit not null,
    JoinDate datetime,
    Age int,
    Address nvarchar(300),
    PhoneNumber varchar(100),
    DeptID int not null,
    Email varchar(100)
)

--------------------------------------------
--7.创建学生表

create table Student
(
    id int identity(1,1) primary key,
    name nvarchar(50) not null,
    gender nchar(1),
    address nvarchar(500),
    age int,
    birthday datetime,
    card_id varchar(18),
    class_id int
)

--创建班级表
create table Class
(
    class_id int identity(1,1) primary key,
    class_name nvarchar(50)
)

--创建成绩表

create table Score
(
    score_id int identity(1,1) primary key,
    id int not null,--引用学生表中的学生id
    English float,
    Math float,
    Chinese float
)

--创建老师表

create table Teacher
(
    teacher_id int identity(1,1) primary key,
    teacher_name nvarchar(50) not null,
    gender bit,
    salary money,
    age int,
    birthday datetime
)

--8.向表中插入数据
/*
create table Class
(
    class_id int identity(1,1) primary key,
    class_name nvarchar(50)
)
*/
--①自动编号列,默认自动增长,不能也不需要插入值
insert into [Class](class_name) values(.NET黑马一期)

select * from [Class]

--向学生表中插入一条数据
/*
create table Student
(
    id int identity(1,1) primary key,
    name nvarchar(50) not null,
    gender nchar(1),
    address nvarchar(500),
    age int,
    birthday datetime,
    card_id varchar(18),
    class_id int
)
*/
insert into [Student](name,gender,address,age,birthday,card_id,class_id)
values(刘德华,,北京市海淀区,25,1970-10-10,123652199010021012,1)

--如果除自动编号列以外所有列都要插入时也可以省略列名
insert into [Student]
values(郭富城,,北京市天安门,25,1988-10-10,123652569010021012,1)

--向部分列插入数据
insert into [Student](name,gender,age)
values(宋祖英,,25)

--向自动编号列插入值
--a.需要启动某个表的"自动编号列"手动插入值的功能
--b.再次插入数据时,自动编号只会按照当前最大的编号增加

set identity_insert [Student] on    --打开插入自动编号功能
insert into [Student](id,name)
values(10,唐三藏)
set identity_insert [Student] off    --使用完后关闭插入自动编号列功能

--c.在插入字符串时如果包含中文一般在字符串引号前加上一个大写N,是为了防止"双字节字符乱码"(中文乱码)
--  在之前添加数据时,没有加N,也没有出现乱码,这跟当前的数据库排序规则有关(当前为简体中文排序规则)
insert into [Student](name)values(N猪八戒)

select * from [Student]

--小技巧:打开和关闭查询结果窗口:Ctrl + R
--9.数据更新(数据修改)
--修改[Student]表中gender等于‘女‘的行的数据,年龄减一,姓名后加‘<女>‘
update [Student] set age=age-1,name=name+<女> where gender=

select * from [Student]

--where中可以使用的其他逻辑运算符:
--or、and、not、<、>、>=、<=、<>(或!=)等

--10.删除数据
--删除表中所有数据
delete from [Student]

--删除表中指定数据(删除一部分数据)
delete from [Student] where gender=

--删除表中的全部数据,有两种方式
--a.delete from [表名]
--b.truncate table [表名] (推荐使用这中方法)
truncate table [Student]
--truncate的特点:
--a.truncate语句不能跟where条件(无法根据条件删除,只能全部删除)
--b.truncate删除可以使自动编号恢复到初始值
--c.使用truncate删除表中的所有数据要比delete效率高很多
--d.truncate删除数据,不会触发dalete触发器
--e.truncate删除数据当这个表与其他表有主外键关联时,无法删除

select * from [Student]

--11.练习和整理

--创建数据库
create database [LiangshanHero]
--删除数据库
drop database [LiangshanHero]
--创建表
use [LiangshanHero]
go
create table [Hero]
(
    id int identity(1,1) primary key,
    name nvarchar(50) not null,
    nick_name nvarchar(50),
    star nvarchar(10),
    age int,
    hometown nvarchar(50),
    sex nchar(1),
    sal int
)
select * from [Hero]
--为表添加数据
insert into [Hero] values(宋江,及时雨,天魁星,28,山东,,6000)
insert into [Hero] values(卢俊义,玉麒麟,天罡星,35,河北,,7500)
insert into [Hero] values(吴用,智多星,天机星,31,黑龙江,,1000)
insert into [Hero] values(公孙胜,入云龙,天闲星,32,重庆,,5000)
insert into [Hero] values(关胜,大刀,天勇星,36,江苏,,3500)
insert into [Hero] values(林冲,豹子头,天雄星,34,浙江,,4000)
insert into [Hero] values(秦明,霹雳火,天猛星,35,上海,,5500)
insert into [Hero] values(呼延灼,双鞭,天威星,33,湖南,,2800)
insert into [Hero] values(花荣,小李广,天英星,24,湖北,,3400)
insert into [Hero] values(柴进,小旋风,天贵星,26,广西,,4800)
insert into [Hero] values(鲁智深,花和尚,天孤星,38,河南,,5000)
insert into [Hero] values(武松,行者,天伤星,28,河南,,2600)
insert into [Hero] values(史进,九纹龙,天微星,36,河南,,8000)
insert into [Hero] values(扈三娘,一丈青,地慧星,28,云南,,7000)
insert into [Hero] values(顾大嫂,母大虫,地阴星,37,贵州,,6000)
insert into [Hero] values(孙二娘,母夜叉,地壮星,32,四川,,5400)
insert into [Hero] values(石秀,null,null,null,null,null,null)
insert into [Hero] values(燕青,null,null,null,null,null,null)
insert into [Hero] values(阮小七,null,null,null,null,null,null)
insert into [Hero] values(李逵,null,null,null,null,null,null)

--查询所有数据
select * from [Hero]
--带条件查询
select name from [Hero] where sex= 
select count(*) as 工资大于5000人数 from hero where sal>=5000
--更新数据
update [Hero] set sal=sal*1.1 where sal<3000
--删除指定数据
delete from [Hero] where sex=
--清空表中数据
truncate table [Hero]
--删除整张表(包括表结构和所有数据)
drop table [Hero]

--12.约束(保证数据完整性,约束是建立在表上的)
--约束大致分类
--a.非空约束
--b.主键约束(PK)primary key constraint唯一且不为空
--c.唯一约束(UQ)unique constraint唯一,允许为空,但只能出现一次
--d.默认约束(DF)default constraint默认值
--e.检查约束(CK)check constraint范围以及格式限制
--f.外键约束(FK)foreign key constraint表关系

--新建一张表(无约束的表)
use [School]
go
create table [Employees]
(
    id int identity(1,1),
    name nvarchar(50),
    gender char(2),
    age int,
    email varchar(100),
    home_address varchar(500)
)
create table [Department]
(
    dep_id int identity(1,1),
    dep_name varchar(50)
)

--删除表
drop table [Employees]
drop table [Department]

--查询数据
select * from [Employees]
select * from [Department]

--13.t-sql语句实现约束(手动增加约束)
--新建一张表(无约束的表)
use [School]
go
create table [Employees]
(
    id int identity(1,1),
    name nvarchar(50),
    gender char(2),
    age int,
    email varchar(100),
    home_address varchar(500)
)
create table [Department]
(
    dep_id int identity(1,1),
    dep_name varchar(50)
)

--增加约束-------------------------------------

--手动删除一列
alter table [Employees] drop column home_address

--手动增加一列
alter table [Employees] add home_address1 nvarchar(1000)

--手动修改一下某列的数据类型
alter table [Employees] alter column email varchar(200)

--为某列增加一个主键约束(修改表结构,增加约束,约束类型:主键约束)
alter table [Employees] add constraint PK_Employees_id primary key(id)

--为某列增加一个非空约束(以修改列的方式完成,增加一个not null关键字就好)
alter table [Employees] alter column name nvarchar(50) not null

--为某列增加一个唯一约束(唯一约束要求值不能重复,允许只能有一个空值)
alter table [Employees] add constraint UQ_Employees_name unique(name)

--为性别增加一个默认约束,默认值为‘男‘
alter table [Employees] add constraint DF_Employees_gender default() for gender

--为性别增加一个检查约束,要求性别只能是:‘男‘ or ‘女‘
alter table Employees add constraint CK_Employees_gender check(gender= or gender=)

--为年龄增加一个检查约束:年龄必须在0-120岁之间,含岁与岁.
alter table [Employees] add constraint CK_Employees_age check(age>=0 and age<=120)

--为部门表设置主键,主键列:dep_id(即为部门表某列增加主键约束)
alter table [Department] add constraint PK_Employees_dep_id primary key(dep_id)

--为员工表增加列,部门ID:dep_id
alter table [Employees] add dep_id int not null

--增加某张表外键约束(命令后增加:on delete cascade 可实现级联删除)
alter table [Employees] add constraint FK_Employees_Department foreign key(dep_id) references Department(dep_id)

--删除约束--------------------------------
alter table [Employees] drop constraint FK_Employees_Department,CK_Employees_age,CK_Employees_gender,UQ_Employees_name,DF_Employees_gender

--通过一条代码来增加多个约束
alter table [Employees] add
constraint FK_Employees_Department foreign key(dep_id) references Department(dep_id),
constraint CK_Employees_gender check(gender= or gender=),
constraint CK_Employees_age check(age>=0 and age<=120),
constraint UQ_Employees_name unique(name)

--创建表的同时就为表增加约束
use [School]
go
create table [Employees]
(
    id int identity(1,1) primary key,
    name nvarchar(50) not null unique check(len(name)>2),
    gender char(2) default(),
    age int check(age>0 and age<120),
    email varchar(100) unique,
    home_address varchar(500) not null,
    dep_id int foreign key references [Department](dep_id) on delete cascade --添加外键约束,并设置可以级联删除
)
create table [Department]
(
    dep_id int identity(1,1) primary key,
    dep_name varchar(50) not null unique    --(唯一约束且不为空)
)
--小经验:以上代码在"一起执行"的时候会报错:外键 ‘FK__Employees__dep_i__7C4F7684‘ 引用了无效的表 ‘Department‘。
--这是因为在代码中先创建了员工表(外键表),之后才创建了部门表(主键表),外键表需要引用主键表,所有被引用的主键表需要先创建

--删除表
drop table [Employees]
drop table [Department]

--查询数据
select * from [Employees]
select * from [Department]

--14.数据检索(查询)
--*表示显示所有列
--查询语句没有加where条件表示查询所有行
select * from [Student]

--只查询部分列
select id,name,address from [Student] 

--只查询部分行(使用where条件筛选部分行显示)
select * from [Student] where class_id=1

--列别名(为查询结果集中的列起别名)
select id as 编号,name as 姓名,gender as 性别 from [Student]
--美化一下格式
select
    id as 编号,
    name as 姓名,
    gender as 性别
from [Student]
--列别名1(也可以把as省略掉)
select
    id 编号,
    name 姓名,
    gender 性别
from [Student]
----列别名2(也可以用引号把列名引起来)
select
    id 编 号,
    name 姓      名,
    gender 性别
from [Student]
--列别名3(也可以使用等号=的方式)
select
    编号=id,
    姓名=name,
    性别=gender
from [Student]

--查询结果中增加新列
select
    编号=id,
    姓名=name,
    性别=gender,
    婚否=
from [Student]

--获取服务器时间(没有from,select也可以单独使用)
select
    当前系统时间=getdate()

--select单独使用
select
    班长=刘德华,
    班花=王美丽,
    班草=待定,
    班主任=习大大

--15.数据检索,关键字:top 、distinct(去重)
select distinct * from [Student]

--distinct关键字,针对已经查询出的结果去除重复

select distinct name,gender from [Student]

--top关键字一般都与order by连用

--排序order by
--按照年龄降序排序
select * from [Student] order by age desc
--按照年龄升序排序
select * from [Student] order by age asc
--默认排序(升序排序)
select * from [Student] order by age

--排序联系
use [LiangshanHero]
select * from [Hero] order by sal desc
select * from [Hero] order by sal

--查询工资最高的前5名
select top 5 * from [Hero] order by sal desc

--查询工资最低的前5名
select top 5 * from [Hero] order by sal asc

--top后面跟表达式,需要使用括号将表达式括起来
select top (2*2) * from [Hero] order by sal desc

--查看前百分之30工资最高的(如果百分比的结果不是整数条,会向上取整返回结果)
select top 30 percent * from [Hero] order by sal desc


--16.聚合函数
--sql聚合函数
--a.MAX(最大值)
--b.MIN(最小值)
--c.AVG(平均值)
--d.SUM(和)
--e.COUNT(计数)
--注意
--①聚合函数对null值不计算
--②如果一行的数据都是null,count(*)包含对空值行、重复行的统计

use [LiangshanHero]
go
create table [Hero]
(
    id int identity(1,1) primary key,
    name nvarchar(50) not null,
    nick_name nvarchar(50),
    star nvarchar(10),
    age int,
    hometown nvarchar(50),
    sex nchar(1),
    sal int
)
select * from [Hero]

--统计出所有人的年龄的总和
select sum(age) as 年龄总和 from [Hero]

--统计当前表中一共有多少条记录
select count(*) from [Hero]

--计算平均年龄
select 
    平均年龄=(select sum(age) as 年龄总和 from [Hero])*1.0  --*1.0可以让数据变成小数
            /(select count(*) from [Hero])

--计算年龄最大的
select max(age) from [Hero]

--计算年龄最小的
select min(age) from [Hero]

--计算平均值avg
select avg(age) from [Hero]
select avg(age*1.0) from [Hero]    --将整型数据变为小数,或者直接将表中数据类型换为小数
--可以使用round()控制小数位数

--聚合函数的一下其他问题----------
--①聚合函数不统计空值
select * from [Hero]        /*=>21*/
select count(age) from [Hero]        /*count()是不统计空值的*/
select avg(age) from [Hero]            /*avg()也是不统计空值的*/
select sum(age) from [Hero]            /*sum()对于null,认为是0*/
select min(age) from [Hero]            /*max()和min()也是忽略空值的*/
--②聚合函数默认把整个表中的数据当做"一组",然后才进行的统计
--如果使用聚合函数的时候,没有手动group by分组,那么聚合函数会把整个表中的数据当作"一组"来进行统计

--③所有的聚合函数(帮助文档中列出的)
/*--12个
avg
checksum agg
count
count big
grouping
max
min
sum
stdev
stdevp
var
varp
*/

--------------------------------------------用户登录数据库练习--------------------------------------------
--创建数据库
create database [LoginInfoDB]
--删除数据库
drop database [LoginInfoDB]
--创建表
use [LoginInfoDB]
go
create table [Users]
(
    autoid int identity(1,1) primary key,
    username varchar(50) not null,
    pwd varchar(50) not null,

)
select * from [Users]
--为表添加数据
insert into [Users] values(ldh,liudehua)
insert into [Users] values(lm,liming)
insert into [Users] values(zxy,zhangzueyou)
insert into [Users] values(gfc,guofucheng)
insert into [Users] values(swk,sunwukong)
insert into [Users] values(zbj,zhubajie)
insert into [Users] values(shs,shaheshang)
insert into [Users] values(tsz,tangsanzang)
insert into [Users] values(bgj,baigujing)


--查询所有数据
select * from [Users]
--带条件查询
select username from [Users] where sex= 
select count(*) as 工资大于5000人数 from hero where sal>=5000
--更新数据
update [Users] set sal=sal*1.1 where sal<3000
--删除指定数据
delete from [Users] where autoid=7
--清空表中数据
truncate table [Users]
--删除整张表(包括表结构和所有数据)
drop table [Hero]

--存储过程 & 带参数的sql语句
exec sp_executesql 
Nselect count(*) from [Users] where [email protected] and [email protected],
N@username varchar(50),@pwd varchar(50),
@username=ldh,
@pwd=123456
View Code

 

--The End.

以上是关于T-SQL - 记录01_基础sql语句操作的主要内容,如果未能解决你的问题,请参考以下文章

翻译——T-SQL的进阶之路:超过基础的2级水平:写子查询

T-SQL语句基础

T-SQL语句

T-SQL基础之增删改

使用T-SQL语句操作数据表-删除数据

SQL Server基础操作(此随笔仅作为本人学习进度记录七 !--存储过程)