本站使用了 Pjax 等基于 JavaScript 的开发技术,但您的浏览器已禁用 JavaScript,请开启 JavaScript 以保证网站正常显示!

SQL语法学习 - 不用真的记不住

通过此链接从物理上认识数据库的体系和结构

SQL学习准备

--为了方便练习,在数据库中创建演示数据:
create database TEST;
use TEST ;
----------
go
create table t_icitem 
 (id int primary key,
  name varchar(255),
  model varchar(255),
  alexa varchar(255),
  country varchar(255)
  )
insert into t_icitem values 
('1','oppo','16g','1','CN')
,('2','索尼','8g','13','JAP')
,('3','苹果','8g','2','USA')
,('4','小米','64g','3','CN')
,('5','华为','32g','4','CN')
,('6','魅族','32gm','15','CN')
select * from t_icitem;
----------
create table icstockbillentry
 (id int primary key,
  item_id int not null,
  [count] int not null,
  date date not null
  )
insert into icstockbillentry values 
(1,1,45,'2016-05-10')
,(2,3,100,'2016-05-13')
,(3,1,230,'2016-05-14')
,(4,2,10,'2016-05-14')
,(5,5,205,'2016-05-14')
,(6,4,13,'2016-05-15')
,(7,3,220,'2016-05-15')
,(8,5,545,'2016-05-16')
,(9,3,201,'2016-05-17')
select * from icstockbillentry;

SQL初级教程

- SELECT

select column_name,column_name from table_name;
--从表中选取部分列
select * from table_name;
--从表中选取所有列

- SELECT DISTINCT

select distinct column_name from table_name;
--从列中选取不重复的值;即去重

- WHERE

select * from where column_name operator value;
--取符合条件的记录

where子句中的运算符

运算符描述
between在某个范围内
like模糊查询
in多个值
=,<,>,<> or !=,>=,<=

备注

  • 逻辑运算的优先级
    ( ) > not > and > or
  • 模糊查询
    %号表示多个字符,_表示一个字符;

    • M%:查询M开头的值;
    • %M%:查询包含M的所有值;
    • %M:查询M结尾的值;
    • %M_:查询M在倒数第二位的所有值;

- AND & OR

select * from table_name 
where column_name > value
and (column_name = 'a' or column_name = 'b');
--and和or可以结合使用,使用括号可以组成复杂的表达式

- ORDER BY

select * from table_name 
order by column_name asc,column_name desc;
--排列不写明asc,desc时默认为'asc';
--'asc'表示升序;'desc'表示降序。

- INSERT INTO

insert into table_name(column1,column2)
values(1,a),(2,b);
--没有指定列名,则需要插入所有的值

- UPDATE

update table_name set column1=value1,column2=value2
where some_column = some_value;
--更新时省略where子句,会更新所有记录,所以一定要注意
update te set te.fentryselfp0139 = te.fqty / ti.f_107 from PORequestEntry te,t_ICItem ti where te.FItemID = ti.FItemID and ti.F_107 >0

- DELETE

delete from table_name where some_column = some_value;
--如果省略where子句,将删除表中所有记录,但不改变表结构、属性、索引等

SQL高级教程

- SELECT TOP

select top number percent * from table_name;
--number代表返回的记录数,如:2;
--number后面输入percent代表返回所有行数的百分比

- AS

select T1.column_name as A,T2.column_name as B from table_name as T1,table_name as T2
在下面的情况下,使用别名很有用:
--查询中涉及多个表
--查询中使用了函数
--列名很长或可读性差
--需要把多个列结合在一起

- JOIN (INNER JOIN)

select * from table_A inner join table_B on A.column = B.column;
--如果条件为空,on后面输入1 = 1即可。

用于把来自俩个表或多个表的行结合起来;join等于inner jion。更多详细参考

- SELECT INTO

select * into table_name_bak from table_name;
--完全复制表,可以看作表的备份;
select column_name,column_name into table_nanme_bak from table_name where column_name operator value;
--复制部分列的满足部分条件的记录到新表;
select T1.column,T2.column into #table from T1 join T2 ON T1.fid = T2.fid;
--复制多个表中的数据到新表;

- INSERT INTO SELECT

insert into table_A(column_name,column_name) 
select column_name,column_name from table_B
where column_name operator value;
--复制B表中指定记录插入A表的指定列
INSERT INTO table2
SELECT * FROM table1;
--从一个表中复制所有的列插入到另一个已存在的表中

- CREATE

create database DB_name;
--创建数据库
create table table_name
(
column_name data_type(size) constraint default(value),
column_name data_type(size) constraint default(value),
....
);
--创建数据表;data_type为数据类型;constraint为约束;default为默认值;

常用数据类型

类型说明
varchar字符串
int整数
decimal(a,b)小数;a表示小数点前后所有位数的总长,b表示保留的小数位数
date日期

常用约束

类型说明
NOT NULL不允许为空值
UNIQUE不允许重复;每个表可以有多个UNIQUE约束
PRIMARY KEY=NOT NULL & UNIQUE;每个表只能有一个PRIMARY KEY约束

- ALTER

alter table table_name add column_name data_type(size);
--在表中添加一列;
alter table table_name drop column column_name;
--在表中删除一列;
alter table table_name alter column data_type;
--修改列的数据类型;

- DECLARE

--#声明
declare @dept varchar(255)
declare @batchno varchar(255)
declare @starttime date
declare @endtime date
--#赋值
set @dept = ''
set @batchno = ''
set @starttime = '2017-01-01'
set @endtime = '2017-12-30'
    --或者
select @dept = '',@batchno = '',@starttime = '2017-01-01',@endtime = '2017-12-30'
--#使用
slect * from t1,t2,t4 where 
t4.FName like '%'+@dept+'%'--like比较值格式:'%'+@变量+'%'
and t2.FBatchNo like '%'+@batchno+'%'
and t1.FDate >= @starttime
and t1.FDate <= @endtime

- IF (NOT) EXISTS

1.介绍
if not exists 即如果不存在,if exists 即如果存在
2.使用
a.判断数据库不存在时
if not exists(select * from sys.databases where name = 'database_name')
b.判断表不存在时
 if not exists (select * from sysobjects where id = object_id('table_name') and OBJECTPROPERTY(id, 'IsUserTable') = 1)
c.判断列不存在
  if not exists (select * from syscolumns where id=object_id('table_name') and name='column_name')
当判断的结果不存时,我可以执行创建数据库,创建表,增加列,可以执行相应的SQL语句;
而if exists同理判断,首先判断查询结果是否存在,如果存在执行判断后面的语句,查询的数据库,表,列的方法相同;

SQL骨灰教程

- CONVERT

convert(clume_type(length),date,style)
--示例:
select convert(varchar(20),getdate(),100)
--返回:01 24 2018  6:14PM
--style值代表的格式请参考w3school

- COUNT

select count({*,colume,index}) from table_name [where 条件]
--统计记录数
select count(distinct colume) from table_name [where 条件]
--统计不重复的记录数

- 日期的计算

DATEADD(datepart,number,date)
--示例:
DATEADD(dd,1,getdate())  --当前+1天
DATEADD(dd,-1,getdate())  --当前-1天
DATEADD(hh,1,getdate())  --当前+1小时
DATEADD(dd,-1,getdate())  --当前-1小时

- REPLACE

update [表名] set 字段名 =replace(与前面一样的字段名,'原内容','想要替换成什么') [where 可以限定条件]
-- 字符串替换函数

- DELETE和TRUNCATE区别

  • 区别1:DELETE语句执行删除的过程是每次从表中删除一行,并且同时将该行的删除操作作为事务记录在日志中保存以便进行进行回滚操作。在删除过程中激活与表有关的删除触发器。TRUNCATE TABLE 则一次性地从表中删除所有的数据并不把单独的删除操作记录记入日志保存,删除行是不能恢复的。并且在删除的过程中不会激活与表有关的删除触发器。执行速度快。
  • 区别2:表和索引所占空间。当表被TRUNCATE 后,这个表和索引所占用的空间会恢复到初始大小,而DELETE操作不会减少表或索引所占用的空间。drop语句将表所占用的空间全释放掉。
  • 区别3:应用范围。TRUNCATE 只能对TABLE;DELETE可以是table和view。
  • 区别4:对于由 FOREIGN KEY 约束引用的表,不能使用 TRUNCATE TABLE,而应使用不带 WHERE 子句的 DELETE 语句。
  • 区别5:DELETE自动编号不恢复到初始值。TRUNCATE自动编号恢复到初始值。

- 查询bak备份文件的版本

restore headeronly from disk=N'D:\chl\SQL.bak'
SQL Server版本databaseversion
SQL Server 2016852
SQL Server 2014782
SQL Server 2012706
SQL Server 2008 R2665
SQL Server 2008661
SQL Server 2005 with vardecimal enabled612
SQL Server 2005611
SQL Server 2000539
SQL Server 7515

- 常见系统存储过程

exec sp_databases
--查看数据库

exec sp_tables
--查看表

exec sp_columns table_name
--查看数据表的列

exec sp_helpIndex table_name
--查看索引

exec sp_helpConstraint table_name
--约束

exec sp_stored_procedures
--查看存储过程

exec sp_helptext '存储过程名[触发器名]'
-查看存储过程[触发器]的SQL语句

exec sp_rename table_name , table_rename
--修改表、索引、列的名称

exec sp_help table_name
--查询表的信息

exec sp_helpdb database_name
--查询数据库信息

exec sp_helpfile database_name
--查询数据库文件信息

exec sp_helpfilegroup ['文件组名']
--数据库文件组信息

- 查询存储过程和触发器

select * from sysobjects where xtype = 'TR'
--查询系统中所有的触发器
select * from sysobjects where xtype = 'p'
--查询系统中所有的存储过程
select distinct object_name(id) from syscomments where id in
(select id from sysobjects where type ='p') and text like'%TableName%'
--查询表名被哪些存储过程用到过

@[toc]

附:单词记忆

单词读音释义
distinct迪斯'厅科特不同的
column克拉姆
constraint坑死'脆n特约束
varchar哇'克儿字符串
decimal戴思茂小数
unique优'尼科唯一
primary普瑞迈儿瑞主要的;primary key主键

Offer

推广

 继续浏览关于 sql 的文章

 本文最后更新于:2020/05/21 11:06:50,可能因经年累月而与现状有所差异,有任何疑问可以随时与258771198@qq.com沟通,邮箱永久有效

 引用转载请注明:manacode(码扣) > SQL > SQL语法学习 - 不用真的记不住