SQL语句入门

SQL语句入门



lSQL 全名是结构化查询语言(Structured Query Language),是关系数据库管理系统的标准语言
lSQL语句是和DBMS“交谈”专用的语句,不同DBMS都认SQL语法。
lT-SQL
lSQL语句中字符串用单引号
lSQL语句是大小写不敏感的,不敏感指的是SQL关键字,字符串值还是大小写敏感的
l建库、删除数据库、创建表、删除表不仅可以手工完成,还可以执行SQL语句完成,在自动化部署、数据导入中用的很多
l简单的Insert语句。
l(*) SQL主要分DDL(数据定义语言)、DML(数据操作语言)DCL(数据库控制语言)CreateTableDropTableAlterTable等属于DDLSelectInsertUpdateDelete等属于DML GRANT 授权、REVOKE取消授权属于DCL 

Insert into class (cName,cDescription)values(‘T001’, ‘这是一个高级班,人数50')

Insert into class (cName,cDescription)values(‘T002’, ‘这是一个高级班,人数60')

--drop database MySchool

create database MySchool

on

(

--括号一定是圆括号

name='MySchool_data',--数据库名称

filename='d:\MySchool_data.mdf',--物理文件名

size=5mb,--初始大小

maxsize=10mb,--最大大小

filegrowth=15%--主文件增长率

)

log on

(

name='MySchool_log',--日志文件名

filename='d:\MySchool_log.ldf',--日志物理文件名

maxsize=4mb,--最大大小

size=2mb,

filegrowth=1mb

)

go

use MySchool

go

--drop table Class

create table Class

(

  cIdintidentity(1,1) primary key,

  cNamenvarchar(50)not null,

  cDesciptiontext

)

--drop table student

create table Student

(--创建学生信息表

  sIdintidentity(1,1) primary key,--自动编号

  sClassIdintnot null,  --班级外键

  sNamenvarchar(50)not null,

  sAgeintnot null,

  sNonumeric(18,0),--身份证号,十八位数字,小数为

  sSexchar(2) not null,

  sEmailvarchar(50)

)



使用sql语句创建数据库和表

lcreate table Class
l(
l cIdintidentity(1,1) primary key,
l cNamevarchar(50)not null,
l cDescription text
l)
lgo
l--drop table student
lcreate table Student
l(--创建学生信息表
l sIdintidentity(1,1) primary key,--自动编号
l sClassIdintnot null,  --班级id,外键
l sNamenvarchar(50)not null,
l sAgeintnot null,
l sNonumeric(18,0),--身份证号,十八位数字,小数为0
l sSexnchar(1),
l sBirthdaydatetime
l 
l)



--DROP database MySchool

--创建数据库

create database MySchool

on

(

  --mdf文件

  name= 'MySchool_data',  --mdf的逻辑名

  filename= 'd:\MySchool_data.mdf',--mdf文件的路径

  size= 3mb,  --初始大小

  maxsize= 100mb  ,  --文件的最大值

  filegrowth= 1mb  --10% 文件增长量  --

)

log on

(

  --ldf文件

  name= 'MySchool_log',  --ldf的逻辑名

  filename= 'd:\MySchool_log.ldf',--ldf文件的路径

  size= 5mb,  --初始大小

  maxsize= 10mb  ,  --文件的最大值

  filegrowth=  1mb --10% 文件增长量 

)

go


创建表练习

创建学生成绩表Score
scoreId,studentId,english,math
创建老师表Teacher
tId,tName,tSex,tAge,tSalary,tBirthday

--drop table score

create table Score

(

  sIdintidentity(1,1),

  studentIdintnot null,   --学生id,外键

  englishfloat,

  mathfloat

)

go

--drop table score

create table teacher

(

  tIdintidentity(1,1) primary key,

  tNamenvarchar(50)not null,

  tSexnchar(1),

  tAgeint,

  tSalarymoney

)

go



数据插入

lInsert语句可以省略表名后的列名,但是不推荐。
l如果插入的行中有些字段的值不确定,那么Insert的时候不指定那些列即可。
l
l主键:insert into Student(Name,Age)values('lily',38);
l
lInsert [into] (字段名1,字段名2) values(1,值2)

insert into Class (cName,cDescription)values ('高一一班','快班')

insert into Class (cName,cDescription)values ('高一二班','中班')

insert into Class (cName,cDescription)values ('高一三班','慢班')

insert into Class (cName,cDescription)values ('高二一班','快班')

insert into Class (cName,cDescription)values ('高二二班','中班')

insert into Class (cName,cDescription)values ('高二三班','慢班')

insert into Student (sClassId,sName,sAge,sSex,sNo,sBirthday)values (1,'刘备',20,'',123456789012345678,'1987-5-6')

insert into Student (sClassId,sName,sAge,sSex,sNo,sBirthday)values (1,'关羽',19,'',123456789012345671,'1988-8-6')

insert into Student (sClassId,sName,sAge,sSex,sNo,sBirthday)values (1,'张飞',18,'',123456789012345672,'1989-5-19')

insert into Student (sClassId,sName,sAge,sSex,sNo,sBirthday)values (4,'曹操',22,'',123456789012345673,'1985-12-6')

insert into Student (sClassId,sName,sAge,sSex,sNo,sBirthday)values (4,'夏侯惇',22,'',123456789012345674,'1985-3-6')

insert into Student (sClassId,sName,sAge,sSex,sNo,sBirthday)values (4,'华佗',50,'',12345678901234565,'1957-1-16')

insert into Student (sClassId,sName,sAge,sSex,sNo,sBirthday)values (4,'甄姬',18,'',12345678901234565,'1989-8-8')

insert into Score (studentId,english)values(1,90)

insert into Score (studentId,english)values(2,90)

insert into Score (studentId,english)values(3,59)

insert into Score (studentId,english)values(4,100)

insert into Score (studentId,english)values(5,60)

insert into Score (studentId,english)values(6,0)

insert into Score (studentId,english)values(7,80)

数据更新
l更新一个列:updateStudentset sSex= ‘
l更新多个列: update Student setsSex ='',sAge = 18,sBirthday='1989-8-8'
l更新一部分数据:update Student setsClassId= 4 wheresClassId = 1,用where语句表示只更新Name’tom’的行,注意SQL中等于判断用单个=,而不是==
lWhere中还可以使用复杂的逻辑判断update Student setsAge=30wheresName='华佗' orsAge<25or相当于C#中的||(或者)
l所有学生的年龄加1updateStudent setsAge=sAge+ 1
lupdate Student setsClassId=6
lwhere (sAge>20 andsAge<30) or(sAge=50)
lWhere中可以使用的其他逻辑运算符:orandnot<>>=<=!=(或<>)等


数据删除

l删除表中全部数据:DELETE FROM Student
lDelete只是删除数据,表还在,和Drop Table不同。
lDelete也可以带where子句来删除一部分数据:DELETE FROM Student WHEREsAge> 20 
lTruncate清空表中的数据没有条件,和delete的区别不存日志,清空自动编号


约束

l数据库约束是为了保证数据的完整性(正确性)而实现的一套机制
l非空约束
l主键约束(PK)primary key constraint唯一且不为空
l唯一约束(UQ)unique constraint唯一,允许为空,但只能出现一次
l默认约束(DF)default constraint默认值
l检查约束(CK)check constraint范围以及格式限制
l外键约束(FK)foreign key constraint表关系

--添加主键约束

alter table Score

add constraint  PK_Scoreprimary key(sId)

 

--添加唯一约束

alter table student

add constraint UQ_studentunique(sNo)

--添加默认约束

alter table student

add constraint DF_studentdefault('')forsSex

--添加检查约束

alter table student

add constraint CK_studentcheck(sAge>=18 and sAge<=100)

--添加外键约束(主键表Class外键表student

alter table student

add constraint FK_student

foreign key(sClassId)references Class(cId)--外键student表中的sClassIdreferences引用主键表中的cid

--级联删除

--on delete cascade on updatecascade

--删除约束

alter table student

drop constraint FK_student


数据检索

l执行备注中的代码创建测试数据表。
l简单的数据检索:SELECT * FROM Student
l只检索需要的列:SELECTsName FROM StudentSELECTsName,sAge FROM Student
l列别名:SELECTsName AS姓名,sAge AS年龄,sBirthday AS出生日期FROM Student
l使用where检索符合条件的数据:SELECTsName FROM Student WHEREsSex=‘
l还可以检索不与任何表关联的数据:select 1+1;select selectgetdate();

insert into Class (cName,cDescription)values ('高一一班','快班')

insert into Class (cName,cDescription)values ('高一二班','中班')

insert into Class (cName,cDescription)values ('高一三班','慢班')

insert into Class (cName,cDescription)values ('高二一班','快班')

insert into Class (cName,cDescription)values ('高二二班','中班')

insert into Class (cName,cDescription)values ('高二三班','慢班')

insert into Student (sClassId,sName,sAge,sSex,sNo,sBirthday)values (1,'刘备',20,'',123456789012345678,'1987-5-6')

insert into Student (sClassId,sName,sAge,sSex,sNo,sBirthday)values (1,'关羽',19,'',123456789012345671,'1988-8-6')

insert into Student (sClassId,sName,sAge,sSex,sNo,sBirthday)values (1,'张飞',18,'',123456789012345672,'1989-5-19')

insert into Student (sClassId,sName,sAge,sSex,sNo,sBirthday)values (4,'曹操',22,'',123456789012345673,'1985-12-6')

insert into Student (sClassId,sName,sAge,sSex,sNo,sBirthday)values (4,'夏侯惇',22,'',123456789012345674,'1985-3-6')

insert into Student (sClassId,sName,sAge,sSex,sNo,sBirthday)values (4,'华佗',50,'',12345678901234565,'1957-1-16')

insert into Student (sClassId,sName,sAge,sSex,sNo,sBirthday)values (4,'甄姬',18,'',12345678901234565,'1989-8-8')

insert into Score (studentId,english)values(1,90)

insert into Score (studentId,english)values(2,90)

insert into Score (studentId,english)values(3,59)

insert into Score (studentId,english)values(4,100)

insert into Score (studentId,english)values(5,60)

insert into Score (studentId,english)values(6,0)

insert into Score (studentId,english)values(7,80)

TopDistinct
Top 获取前几条数据
获得年纪最小的5个学生
获得年纪最大的10%的学生
Distinct 去除重复数据
select distinct sName from student
select distinct sName,sAge from student
DISTINCT是对整个结果集进行数据重复处理的,而不是针对某一个列

Select top 5 sName,sAgefrom student

Select top 30 percentsName,sAgefrom student 非四舍五入,返回最大整数2.1返回3

聚合函数
lSQL聚合函数:MAX(最大值)、MIN(最小值)、AVG(平均值)、SUM(和)、COUNT(数量)
l平均成绩selectavg(english) from score
l男学生出生日期的最大值和最小值:SELECTselect max(sBirthday),min(sBirthday) from student where sSex=''


selectcount(*) from student;

selectmax(english) fromscore;

selectmin(english) fromscore;

selectavg(english) fromscore

selectsum(english) fromscore;

selectcount(*) from student

wheresSex=‘’;



带条件的查询

Select …from…where
查询没有及格的学生的学号
查询年龄在20-30岁之间的男学生
Between…and …在之间
查询年龄在20-30岁之间的男学生
查询成绩在80-90分之间的所有学生
查询班级id为1,2,3的所有学生
select sName,sAge from student where sClassId=1 or sClassId=2 or sClassId=3
select sName,sAge from student where sClassId in (1,2,3)


select studentIdfrom score whereenglish< 60

select sName,sAge,sSexfrom student wheresAge>=20 andsAge<=30 andsSex=''

select sName,sAge,sSexfrom student wheresAgebetween 20 and 30 andsSex=''



带条件的查询-模糊查询

查询所有姓张的同学
Select * from student whereleft(sName,1)=‘张‘  看上去很美,如果改成查询名字中带亮的学生怎么做?
换一种做法like 
Select  * from student where sName like ‘张%’   会吧所有姓张的都查询到,现在我想查询姓张并且名字是一个字的学生?
Select  * from student where sName like ‘%亮%’
通配符%多字符匹配的通配符,它匹配任意次数(零或多个)出现的任意字符
通配符_ 单字符匹配,它匹配单个出现的字符
[] 只匹配一个字符  并且这个字符必须是[]范围内的    [0-9]  [a-z]
[abc]

空值处理

数据库中,一个列如果没有指定值,那么值就为null,这个null和C#中的null,数据库中的null表示“不知道”,而不是表示没有。因此select null+1结果是null,因为“不知道”加1的结果还是“不知道”。
select * from score where english= null ;
select * from score where english!= null ;都没有任何返回结果,因为数据库也“不知道”。
SQL中使用is null、is not null来进行空值判断:select * from score where englishis null ; select* from score where english is not null ;

数据排序

ORDER BY子句位于SELECT语句的末尾,它允许指定按照一个列或者多个列进行排序,还可以指定排序方式是升序(从小到大排列,ASC)还是降序(从大到小排列,DESC)。
按照年龄升序排序所有学生信息的列表:SELECT * FROM  Student ORDER BY sAgeASC
按照英语成绩从大到小排序,如果英语成绩相同则按照数学成绩从大到小排序:SELECT * FROM  Score ORDER BY english DESC,math DESC
ORDER BY子句要放到WHERE子句之后: SELECT * FROM  Score where english>=60 and math>=60 ORDER BY englishDESC,mathDESC

数据分组

select 语句中可以使用group by 子句将行划分成较小的组,然后,使用聚组函数返回每一个组的汇总信息
按照班级进行分组统计各个班级的人数: select sClassId,count(sName) from student group by sClassId
GROUP BY子句必须放到WHERE语句的之后
没有出现在GROUP BY子句中的列是不能放到SELECT语句后的列名列表中的(聚合函数中除外)
错误: select sClassId,count(sName),sAge from student group by sClassId
正确: select sClassId,count(sName),avg(sAge) from student group by sClassId

可以使用having子句限制返回的结果集。group by 子句可以将查询结果分组,并返回行的汇总信息按照group by 子句中指定的表达式的值分组查询结果。

--group by

--每个班有多少人

select * from student

select sClassId,count(*)from student group by sClassId


Having语句









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值