步步为营-35-SQL语言基础
SQL 结构化查询语言(Structured Query Language)
DDL DML DCL 在此不再对其进行详细解释
1 DDL 数据库定义语言
1.1 创建数据库脚本
--DDL create drop alter
--创建数据库
create database TestDB;
--删除数据库
drop database TestDB; --创建数据库
create database DemoDB2
on
(
name = 'DemoDB2',--逻辑名称于创建名字一致
size = 5MB, --最小为5MB
filegrowth = 2MB,--超过5MB后以步长为2MB增长
fileName = 'F:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\DemoDB2.mdf' -- 文件存放路径
)
log on
(
name = 'DemoDB2_log',
size = 2MB, --最小为2MB
filegrowth = 2MB,--超过5MB后以步长为2MB增长
fileName = 'F:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\DemoDB2_log.ldf' )
创建数据库
1.2 操作表脚本
use DemoDB
go
--1创建表
Create table Employee
(
--设置自增长主键,不为空
EmpId int identity(,) primary key not null,
EmpName nvarchar() null,--定义大小为2的幂 ,
EmpAge int default() not null, -- 设置默认值18
Delflag smallint default() not null
)
go
--2修改表
--2.1 修改表名称
--ALTER TABLE DemoDB.Employee rename to DemoDB.Student;--不好使
--通过存储过程重新命名
exec sp_rename 'Employee','Student'
--2.2 修改列
--2.2. 修改列名
exec sp_rename 'Student.EmpAge','StuAge'
--2.2. 新增列
Alter table Student add StuClassNo int
--2.2. 修改列
Alter table Student alter column StuClassNo nvarchar()
--2.2. 删除列
Alter table Student drop column StuClassNo
--3删除表
drop table UserInfo
2 DML 数据库操作语言(很重要)
2.1 Select 语句都被写烂了,这里总结一下执行顺序
From=>where=>group by =>having=>select=>order by
--Insert into 表名(列名称...) values (值..);
Insert into Student (EmpId, StuName, StuAge, Delflag) values (,'张三',,);
--删除
delete from Student where = --查询
select * from Student;
--修改 Update 表名 set 列名 = 值 where 条件表达式
Update Student set StuName = '李四' where EmpId = ;
2.2 约束:保证数据的完整性
alter table 表名 add constraint 约束的名字.....
-- 删除约束
--alter table 表名 drop constraint 约束的名字
alter table UserInfo drop constraint DF_UserInfo_DelFlag
-- 添加默认约束
--alter table 表名 add constraint 约束的名字 default() for ...
alter table UserInfo add constraint DF_UserInfo_DelFlag default() for DelFlag;
-- 添加主键约束
alter table UserInfo add constraint PK_UserInfo_EmpId primary key(EmpId);
-- 添加唯一约束
alter table UserInfo add constraint UN_UserInfo_StuName unique (StuName)
-- 添加检查约束
alter table UserInfo add constraint CK_UserInfo_StuAge check(StuAge> and StuAge<)
-- 非空约束
--以便建表的时候就创建了
-- 外键约束
-- 先建立外键表Class
create table ClassInfo
(
ClassId int identity(,) primary key,
ClassName nvarchar() null
)
-- 添加外键列
alter table UserInfo add ClassNo int null
-- 添加外键约束
alter table UserInfo add constraint FK_UserInfo_ClassInfo foreign key(ClassNO) references ClassInfo(ClassId);
约束
2.3 常用的函数
use DemoDB
go select * from UserInfo
-- 给列和表起别名
select EmpId as 编号 from UserInfo as U;
--count()优于count(*);因为count(*) 找出表中最短的数列
--常见的聚合函数
--count(),sum(),max(),min(),avg(),max(),min()
--常见的转换函数
--Convert(目标类型,转换的表达式,格式规范)
--Cast(表达式 as 类型)
select StuName+'年龄是'+CONVERT(nvarchar(),StuAge) as 学生年龄信息 from UserInfo;
select StuName+'年龄是'+Cast(StuAge as nvarchar()) as 学生年龄信息 from UserInfo;
--日期函数
--01获取当前日期
--select getdate();
--dateadd(要增加的计量单位,数量,原有日期)添加日期
select DATEADD(day,,'2012-12-12')
-- DATEDIFF(要比较的计量单位,日期,日期)时间差
select DATEDIFF(DAY,'2012-12-12','2012-12-19');
--DatePart
select DATEPART(MONTH,'2014-1-15');
select MONTH('2014-1-15');
--字符串函数
--转换大(upper)小(LOWER)写
select Upper('abc') ;
--字符串左(left)右(right)截取
select left('',);
--字符串长度
select DATALENGTH(N'');
--去掉左(LTRIM)右(RTRIM)空格
select LTRIM(' 1231 ');
常用的函数
2.4 Case When的两种使用
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms; namespace 完整的增删查改
{
public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
} private void MainForm_Load(object sender, EventArgs e)
{
string sqlStr = "select EmpId, Pwd, StuName, StuAge, Delflag, ClassNo from UserInfo where Delflag = 0 "; LoadUserInfoToGridView(sqlStr);
}
//获取连接字符串
public string ConnStr = SqlHelper.GetConnStr(); #region 02右击删除-多项删除
private void contextMenuDelete_Opening(object sender, CancelEventArgs e)
{
//02-01给出提示,判断是否确定删除
if (MessageBox.Show("确认删除选中信息吗?","提示信息",MessageBoxButtons.YesNo,MessageBoxIcon.Information) != DialogResult.Yes)
{
return;
}
//02-02 拿到选中行的主键,并把主键拼接起来
var rows = this.dataGridView1.SelectedRows;
//02-03 编写执行SQL脚本 #region 方法二- StringBuilder sbSql = new StringBuilder();
List<SqlParameter> parameters = new List<SqlParameter>( );
for (int i = ; i < rows.Count; i++)
{
sbSql.Append("Update UserInfo set DelFlag = 1 where EmpId=@EmpId"+i+";");
SqlParameter para = new SqlParameter("@EmpId"+i,SqlDbType.Int);
para.Value = int.Parse(rows[i].Cells["EmpId"].Value.ToString());
parameters.Add(para); }
string sqlStr2 = sbSql.ToString();
#endregion int resultNum = SqlHelper.ExcuteNonQuery(sqlStr2, parameters.ToArray());
if (resultNum > )
{
MessageBox.Show("删除成功!一共删除" + resultNum + "条");
} MainForm_Load(this,null);
}
#endregion #region 03双击事件-弹出修改窗体
private void dataGridView1_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
{
//03-01 拿到Id
int id = int.Parse(dataGridView1.SelectedRows[].Cells["EmpId"].Value.ToString()); //03-02打开修改窗体
EditForm frmEdit = new EditForm(new UserInfo (){EmpId = id});
//03-04让主窗体关注"编辑窗体"的关闭事件.
frmEdit.FormClosing += EditUserInfoFrm_FormClosing;
frmEdit.Show();
//03-03 通过构造函数传递数据
}
//03-04 当修改窗体关闭时候执行下面的事件响应方法
private void EditUserInfoFrm_FormClosing(object sender, FormClosingEventArgs e)
{
btnSearch_Click(this, null);
}
#endregion #region 04-多条件查询
private void btnSearch_Click(object sender, EventArgs e)
{
//string connStr = SqlHelper.GetConnStr();
#region 04-02拼接SQl语句
string sqlText = "select EmpId, Pwd, StuName, StuAge, Delflag, ClassNo from UserInfo";
List<string> whereList = new List<string>();
List<SqlParameter> parameters = new List<SqlParameter>(); if (!string.IsNullOrEmpty(this.txtName.Text.Trim()))
{
//把Where条件添加到List集合中
whereList.Add(" StuName like @StuName ");
//把参数进行赋值
SqlParameter parameter = new SqlParameter();
parameter.ParameterName = "@StuName";
parameter.Value = "%" + txtName.Text + "%";
parameters.Add(parameter);
} if (!string.IsNullOrEmpty(this.txtAge.Text.Trim()))
{
//把Where条件添加到List集合中
whereList.Add(" StuAge like @StuAge ");
//把参数进行赋值
SqlParameter parameter = new SqlParameter();
parameter.ParameterName = "@StuAge";
parameter.Value = "%" + txtAge.Text + "%";
parameters.Add(parameter);
} if (whereList.Count > )
{
sqlText += " where " + string.Join(" and ", whereList);
}
#endregion
LoadUserInfoToGridView(sqlText, parameters.ToArray()); }
#endregion #region 05-将01和04进行优化可得-----加载数据到GridView
private void LoadUserInfoToGridView(string sqlStr,params SqlParameter[] parameters)
{
//01-00 设置强类型数据源
List<UserInfo> userInfoList = new List<UserInfo>();
DataTable dt = SqlHelper.ExcuteDataTable(sqlStr, parameters);
//01-05 应该使用强类型数据
foreach (DataRow dr in dt.Rows)
{
//数据封装
UserInfo userInfo = new UserInfo();
userInfo.EmpId = int.Parse(dr["EmpId"].ToString());
userInfo.Pwd = dr["Pwd"].ToString();
userInfo.StuName = dr["StuName"].ToString();
userInfo.StuAge = int.Parse(dr["StuAge"].ToString());
userInfo.Delflag = Char.Parse(dr["Delflag"].ToString());
userInfo.ClassNo = int.Parse(dr["ClassNo"] == DBNull.Value ? "-1" : dr["ClassNo"].ToString());
//添加到列表中
userInfoList.Add(userInfo);
}
//01-06 配置数据源
this.dataGridView1.DataSource = userInfoList; }
#endregion }
}
Case When
2.5 IsNull(表达式,替换内容)函数
select CreateDate,IsNull(CreateDate,getDate()) from UserInfo
2.6 with 语句的使用
select distinct(VendorName),ve.*,ba.* from [dbo].[AS_Batch] as ba
inner join AS_Vendor ve on ba.VendorID = ve.VendorID
inner join AS_Equipment ae on ae.EquipmentID=ba.EquipmentID
where 1=1 order by ve.VendorID desc --新建了一台设备 "联想电脑"
select * from AS_Equipment where EquipmentID = '1AC91813-F636-43AD-82E1-0384051D0DB2'; --新建了3个厂商
select * from AS_Vendor where VendorID in ('065A1954-88A8-415E-BA19-549C17F3354E','EA7B0530-2D5C-4ADB-B2D7-5854C00787A7','2D8F6E94-7243-42C1-B6AD-1008F6D50CE8') --创建一个场景:
--批次 厂商 数量 价格
--批次1 A 10 100
--批次2 B 20 200
--批次3 C 30 300
--批次4 A 40 400 select * from [AS_Batch] where BatchID in ('027D504A-9EC2-43F3-BCC9-8A962831F603','FF8BA2CC-2662-469E-BB16-07DB7599FD06','187334AB-892D-4553-A928-7638067E1D77','F3768B5A-9AB2-497B-B8BB-06E81473996F') --根据设备ID查询供应商
select ve.* from [dbo].[AS_Batch] as ba
inner join AS_Vendor ve on ba.VendorID = ve.VendorID
inner join AS_Equipment ae on ae.EquipmentID=ba.EquipmentID
where 1=1
and ae.EquipmentName='联想电脑'
order by ve.VendorID desc --获取同一设备在不同厂商的均价(a),计算方法:(批次1数量*批次1价格+批次2数量*批次2价格…)/(批次1数量+批次2数量…);
select sum(ba.EquipmentPrice*ba.EquipmentNum)/sum(ba.EquipmentNum) as EquipmentAvgPrice,sum(ba.EquipmentNum) as EquipmentAmount,ba.VendorID
from [dbo].[AS_Batch] as ba
inner join AS_Vendor ve on ba.VendorID = ve.VendorID
inner join AS_Equipment ae on ae.EquipmentID=ba.EquipmentID
where 1=1
and ae.EquipmentName='联想电脑'
group by ba.VendorID
order by ba.VendorID desc --创建一个场景:
--批次 厂商 数量 价格 损坏个数/次数
--批次1 A 10 100 1/2
--批次2 B 20 200 2/(1+2)
--批次3 C 30 300 4/(1+1+2+1)
--批次4 A 40 400 2/(2+3) --获取同一设备在不同厂商的设备正常率(p)=(总设备个数-维修设备个数)/总设备个数
select count(distinct(af.QRCode)),ba.VendorID
from [dbo].[AS_Batch] as ba
inner join AS_Vendor ve on ba.VendorID = ve.VendorID
inner join AS_Equipment ae on ae.EquipmentID=ba.EquipmentID
inner join AS_AfterSale af on substring(af.QRCode,1,36)=ba.batchid
where 1=1
and ae.EquipmentName='联想电脑'
group by ba.VendorID
order by ba.VendorID desc -------------计算性厂商价比
with
pri as ( select sum(ba.EquipmentPrice*ba.EquipmentNum) as EquipmentAmountPrice, sum(ba.EquipmentPrice*ba.EquipmentNum)/sum(ba.EquipmentNum) as EquipmentAvgPrice,sum(ba.EquipmentNum) as EquipmentAmount,ba.VendorID as VendorID
from [dbo].[AS_Batch] as ba
inner join AS_Vendor ve on ba.VendorID = ve.VendorID
inner join AS_Equipment ae on ae.EquipmentID=ba.EquipmentID
where 1=1
and ae.EquipmentName='联想电脑'
group by ba.VendorID
),
repairs as (
select count(distinct(af.QRCode)) as RepairsNum,ba.VendorID as VendorID
from [dbo].[AS_Batch] as ba
inner join AS_Vendor ve on ba.VendorID = ve.VendorID
inner join AS_Equipment ae on ae.EquipmentID=ba.EquipmentID
inner join AS_AfterSale af on substring(af.QRCode,1,36)=ba.batchid
where 1=1
and ae.EquipmentName='联想电脑'
group by ba.VendorID
)
--设备正常率/均价
select (EquipmentAmount-RepairsNum)/EquipmentAmountPrice from pri,repairs where pri.VendorID=repairs.VendorID;
3 DCL语言
--03-01分配权限
grant select on UserInfo To zw
4 大的备份脚本还原
5:DBA管理,
查看表字段和表字段属性
SELECT
表名=d.name,
表说明=isnull(f.value,''),
字段序号=a.colorder,
字段名=a.name,
字段标题=isnull(g.[value],''),
标识=case when COLUMNPROPERTY( a.id,a.name,'IsIdentity')= then '√'else '' end,
主键=case when exists(SELECT FROM sysobjects where xtype='PK' and name in (
SELECT name FROM sysindexes WHERE indid in(
SELECT indid FROM sysindexkeys WHERE id = a.id AND colid=a.colid
))) then '√' else '' end,
类型=b.name,
占用字节数=a.length,
长度=COLUMNPROPERTY(a.id,a.name,'PRECISION'),
小数位数=isnull(COLUMNPROPERTY(a.id,a.name,'Scale'),),
允许空=case when a.isnullable= then '√'else '' end,
默认值=isnull(e.text,'')
--into ##tx
FROM syscolumns a
left join systypes b on a.xtype=b.xusertype
inner join sysobjects d on a.id=d.id and d.xtype='U' and d.name<>'dtproperties'
left join syscomments e on a.cdefault=e.id
left join sys.extended_properties g on a.id=g.class and a.colid=g.minor_id --sql2000此处替换为:left join sysproperties g on a.id=g.id and a.colid=g.smallid
left join sys.extended_properties f on d.id=f.class and f.minor_id= --sql2000此处替换为:left join sysproperties f on d.id=f.id and f.smallid=
where d.name='ProcessPublish' --如果只查询指定表,加上此条件
order by object_name(a.id),a.colorder
查看数据表及对应的记录数
SELECT SUM(记录条数) AS 总记录数
FROM (SELECT TOP () a.name AS 表名, MAX(b.rows) AS 记录条数
FROM sys.sysobjects AS a INNER JOIN
sys.sysindexes AS b ON a.id = b.id
WHERE (a.xtype = 'u')
GROUP BY a.name
ORDER BY 记录条数 DESC) AS t1 SELECT a.name AS 表名, MAX(b.rows) AS 记录条数
FROM sys.sysobjects AS a INNER JOIN
sys.sysindexes AS b ON a.id = b.id
WHERE (a.xtype = 'u')
GROUP BY a.name
ORDER BY 记录条数 DESC
步步为营-35-SQL语言基础的更多相关文章
- SQL语言基础和数据库操作
Sql语言基础: 核心思想:我们自己构造一段查询的代码,然后添加到语句后,从而得到想要的某些数据. Mysql是一种开源数据库 APP Serv:Apache+php+mysql,相当于phpstud ...
- PL/SQL语言基础
PL/SQL语言基础 进行PL/SQL编程前,要打开输出set serveroutput on 1.创建一个匿名PL/SQL块,将下列字符输出到屏幕:"My PL/SQL Block Wor ...
- orcale 之 SQL 语言基础
SQL 全称是结构化查询语句(Structure Query Language),是数据库操作的国际化语言,对所有的数据库产品都要支持. SQL 语言的分类 我们按照其功能可以大致分为四类: 数据定义 ...
- 浅谈PL/SQL语言基础
在前面的学习中,我们大部分接触的都是SQL语言,但是,在实现复杂操作的时候,SQL语言就无能为力了,这时候就需要引入新的语言,PL/SQL语言就是对SQL语言的扩展,可以实现存储过程,函数等的创建.下 ...
- 学习笔记:oracle学习三:SQL语言基础之sql语言简介、用户模式
目录 1.sql语言简介 1.1 sql语言特点 1.2 sql语言分类 1.3 sql语言的编写规则 2.用户模式 2.1 模式与模式对象 2.2 实例模式scott 本系列是作为学习笔记,用于记录 ...
- SQL语言基础-基本概念
SQL:IBM的圣约瑟(SanJose),SEQUEL 2(也就是现在的SQL语言) 1979.Oracle首先提出提供了商用的SQL语言 1986.10美国ANSI采用SQL作为关系数据库管理系统的 ...
- OCP认证之Oracle的SQL语言基础(一)
一.Oracle命令类别 数据操纵语言(DML):select;insert;delete;update;merge 数据定义语言(DDL):create;alter;drop;truncate 事物 ...
- SQL语言基础
主要学习链接1 http://www.cnblogs.com/anding/p/5281558.html 搜索学习链接2 http://www.cnblogs.com/libingql/p/41342 ...
- .NET面试题解析(11)-SQL语言基础及数据库基本原理
系列文章目录地址: .NET面试题解析(00)-开篇来谈谈面试 & 系列文章索引 本文内容涉及到基本SQL语法,数据的基本存储原理,数据库一些概念.数据优化等.抱砖引玉,权当一个综合复习! ...
- .NET面试题解析(9)-SQL语言基础及数据库基本原理
见面试题 1. 索引的作用?她的优点缺点是什么? 2. 介绍存储过程基本概念和 她的优缺点? 3. 使用索引有哪些需要注意的地方? 4. 索引碎片是如何产生的?有什么危害?又该如何处理? 5. 锁的目 ...
随机推荐
- 面向对象【day08】:问答式面相对象(四)
本节内容 1.什么是面向对象编程 2.什么是市类?什么是对象?又有什么关系? 3.什么时候适用面向对象? 4.self就是调用当前方法的对象 5.封装.继承.多态 6.字段方法 1.什么是面向对象编程 ...
- synchronized的一些记录
1.方法内的私有变量,不存在线程安全问题.非线程安全问题存在于实例变量(全局变量)中 2.在方法上加synchronized表示,当第一个线程进入时方法加锁(其他方法无法调用) 3.synchroni ...
- Study 1 —— Python简介
Python与其他语言的区别C\C++:学习成本高,学习周期长,偏系统底层,在开发硬件驱动.嵌入式.游戏引擎开发等领域有广泛的应用:JAVA:目前使用最广泛的编程语言,第一个跨平台运行的语言,在大型E ...
- 006、容器 What、Why、How(2018-12-21 周五)
参考https://www.cnblogs.com/CloudMan6/p/6751516.html What - 什么是容器? 容器是一种轻量级.可移植.自包含的软件打包技术,是应用 ...
- 虚拟机centos7系统下安装hadoop ha和yarn ha(详细)
一:基础环境准备 (一):虚拟机新建五个centos7系统(复制文件夹的方式) (二):角色分配 (三)按照角色分配表配置 (1)更改主机ip(自行查找),如果只是个人搭建玩一玩,可选择安装cento ...
- C# 简单线程实例
1.简单线程实例 以及委托(同步委托.异步委托) using System; using System.Collections.Generic; using System.Linq; using Sy ...
- VMware workstation 网络选择 NAT模式 访问外网
多年不用本地做测试 尽然被 nat 模式給卡着了 :动手的还是所以要记录一下: 1.根据自己需求创建 虚拟机 之后: 配置[网络适配器] -- 选择 nat 模式 ( 选择网卡 ) 虚拟机 ...
- Nginx proxy开启cache缓存
proxy_temp_path /tmp/proxy_temp_dir; // 设置缓存位置 proxy_cache_path /tmp/proxy_cache_dir levels = : keys ...
- Java SE 之 DAO层接口设计思想
用图说话 好处 1.只需要定义好IBaseDao的接口方法,并只需要实现BaseDaoImpl的方法,而具体的业务类和业务类/接口的方法的基本方法(IBaseDao已定义的)并不需要再考虑实现. 2. ...
- luogu P2680 运输计划
传送门 要最长链的长度最短,一秒想到二分,因为如果对于某个长度满足改掉一边的边权后能使得所有链长度不超过该长度,则所有比他长的长度也满足. 二分最终答案.我们要使得原来长度大于二分的\(mid\)的链 ...