欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

数据库基础学习之SQL代码实例讲解

程序员文章站 2022-04-12 20:17:51
--先选择 use student go --查看表是否存在,若存在可以查询结果可查看表结构,如果不存在则提示表不存在 sp_help studentinfo --查询表中所有的数据 select...

--先选择

use student

go

--查看表是否存在,若存在可以查询结果可查看表结构,如果不存在则提示表不存在

sp_help studentinfo

--查询表中所有的数据

select *from studentinfo;

--先选择数据库

use worker

--创建数据库

create database worker

use worker

--创建workerinfo表

create table workerinfo(

工号  varchar(10) not null primary key,

姓名  varchar(20) not null,

工龄  int,

年龄  varchar(20)

)

go

--删除表

drop table workerinfo

--查看表workerinfo的结构

sp_help workerinfo

--查询表workerinfo的所有信息

select * from workerinfo;

--在libray数据库中,创建customer表和book表,并插入数据,进行查询

use library

go

--创建顾客表

create table customer(

cid       char(8) not null primary key,  --主键

cname     varchar(20) not null,          --姓名

sex       char(2),                       --性别

address   varchar(60),                   --地址

phone     char(15),                      --电话

email     varchar(50)                    --邮箱

)

go

sp_help customer

--创建表

create table book(

bid       char(8) not null primary key,--书编号

bname     varchar(40) not null,        --书名

pub       varchar(20),                 --出版社

author1   varchar(20),                 --作者1

author2   varchar(20),                 --作者2

type      varchar(20),                 --类型

numinput  int not null,                --入库量

numstore  int not null                 --现存量

)

go

--查看表结构

sp_help book

--向表中插入数据:dml:insert

--语法1:默认插入所有列 insert into 表名 values(值1,值2);

--注意:值得顺序、类型以及宽度要与字段的类型、顺序、宽度一致--

--一条insert只能插入一条

--向学生表中插入一条记录

use student

sp_help studentinfo

select * from studentinfo

insert into studentinfo values('004','张鑫',19,'北京海定');

--向customer表插入数据

use library

sp_help customer

select * from customer

insert into customer values('10001','张鑫','男','北京海淀','88886565','zhangxin@163.com');

select * from customer

insert into customer values('10002','刘小娜','女','北京密云','77776666','liuxiaona@163.com');

insert into customer values('10003','刘振家','男','北京怀柔','67676677','liuzhenjia@163.com');

insert into customer values('10004','李然','女','北京海淀','88886565','liran@163.com');

select * from customer

--向book表插入数据

use library

go

sp_help book

insert into book values('a0001','*理论','人民出版社','*','','政治类型',20,20);

select * from book

use library

select * from customer

select * from book

insert into book values('a0001','*理论','人民出版社','*','','政治',20,20);

insert into book values('a0002','*理论基础','人民出版社','*','','政治',25,25);

insert into book values('b0001','计算机基础','电子出版社','谭强','赵肖','计算机',30,30);

insert into book values('b0002','计算机理论基础','邮电出版社','赵爽','','计算机',35,35);

insert into book values('c0001','军事天地','军事出版社','李娜','李鑫','军事',40,40);

select * from book

/*

第2种语法:向指定的列插入数据

不插入字段,默认为空值

insert into 表名(字段1,字段2...)values(值1,值2,...)

注意,值得类型和顺序保持一一对应

如果字段为非空,必须插入值

*/

--像学生表中插入记录 005 李清

use student

go

sp_help studentinfo

insert into studentinfo (学号,姓名) values('005','李清');

select * from studentinfo 

--练习向customer表以及book表插入部分数据

use library

go

sp_help customer

insert into customer(cid,cname) values('20001','张三');

select * from customer

insert into customer(address,cname,cid) values('北京东城','李四','20002');

select * from customer

go

sp_help book

insert into book (bid,bname,pub,author1,type,numinput,numstore) values('d0003','田径','运动出版社','赵垒','体育',100,100);

select * from book

insert into book(bid,bname,numinput,numstore) values('n0001','娱乐天地',100,100);

select * from book;

/*

删除表中的数据(记录、行)

删除0,1,n行

语法:dml:delete

delete from 表名 where条件

注意:如果不写where 子句,会删除所有的行

满足where中条件的行才会删除

*/

use student 

go 

create table test1(

id    int primary key,

name  varchar(30)

);

insert into test1 values(1,'tom');

insert into test1 values(2,'james');

insert into test1 values(3,'mary');

insert into test1 values(4,'tony');

insert into test1 values(5,'andi');

select * from test1

--比较相等=

delete from test1 where(id=3);

select * from test1;

delete from test1 where(name='mary');

delete from test1 where(name='tony');

--删除test1中所有的数据

delete from test1

select * from test1;

--删除表 drop ddl:drop 和结构有关

drop table test1;

sp_help test1

--删除数据库 ddl:drop

drop datebase testing;

/*

修改表中的数据 dml:update语句

语法:

update 表名

set 字段1=新的值,字段2=新的值,...

where 记录的匹配条件

说明:如果不写where子句,默认修改所有的行

心中要有表

*/

use worker

go

drop table worker;

--先删后创建

create table worker(

id       int not null primary key,

name     varchar(20) not null,

salary   float not null,

phone    varchar(20)

);

insert into worker values(1,'张三',3366.50,'999999');

insert into worker values(2,'李四',4500.00,'995555');

insert into worker values(3,'王五',5300.50,'776666');

insert into worker values(4,'马六',3200.50,'888888');

insert into worker values(5,'赵琦',3690.80,'666887');

select *from worker

--所有员工加薪1000

update worker set salary=salary+1000.0;

update worker set salary=salary+100 where id=3;

--给赵七加薪300

update worker set salary=salary+310 where name='赵琦' ;

--练习可以同时修改多个点和字段

--给id=3的员工加薪300,电话修改为0000000

update worker set salary=salary+300,phone='000000' where id=3;

select * from worker

select * from worker where id=3;

--练习:操作library数据库

use library

sp_help book

go

select * from book

--书为娱乐天地,出版社改为新华出版社

update book set pub='新华出版社' where bname='娱乐天地';

select * from book where bname='娱乐天地'

--将author1位为‘*’改为author2改为‘*’

--numinput and numstore 改为100

update book set author2='*',numinput=100,numstore=100 where author1='*';

/*

查询语句 dml :select 语句 dql query查询

select  字段名,表达式,函数调用

from 表名

where 查询的物理条件

*/

--查询book表中bid=a0001的部分信息bid,bname,pub

select * from book;

select bid,bname,pub from book  where  bid='a0001';

--查询出bid为‘c0001的所有信息’

select * from book where bid='c0001';

--查询book,给查询的字段起别名

--语法:as 别名  临时的,

select bname as 书名,author1 as 作者,pub as 出版社

from book;

--as可以省略

--查询customer表,字段其别名

--可以省略as

select cid 序号,cname 姓名,address,phone as 电话 from customer;

--sqlserver中还可以通过=起别名

select 书名=bname,书号=bid,pub  from book;

--查询结果拼接

--将多个列合并成一个列显示

select bname as 书名, author1+' '+author2 as 作者 from book;

--使用常量,select 之后可以跟 表达式、字段名、函数调用、常量、*

use worker

sp_help worker

select name,salary, '试用' as 类型  from worker;

select 1+2 from worker;--有几行就算几遍

select 1+2;--sqlserver 中值只写select是可以的

select getdate()as 当前时间;

select '试用' as 类型;

--查询的时候指定条件  where子句

--选择  过滤出需要的行(记录)

--查询出学生表中姓名为张三的所有信息

use student

select * from studentinfo

--等值的比较

select * from studentinfo where 姓名='张三';

--使用比较运算符表示各种条件

--= > < >= <= !> !<

--不等于:!= 或者 <>

--查询顾客表中性别为女的所有顾客的cid,cname,adress,sex 信息

use library

go

sp_help customer

select * from customer

select  cid,cname,address,sex from customer where sex='女';

select * from book where numinput!>50;

select * from book where numinput!=40;

select * from book where numinput<>40;

--查询出不住在北京海淀的顾客

--查询出姓名和住址

select * from customer

select cname,address from customer where address!='北京海淀';

--空值带来的影响

--结论:空值和任何值,包括null都无法直接比较;

--比较后都为假

--判断是否为空 is null

--判断是否不为空 is not null

select * from customer where address is null;

select * from customer where address is not null;

--逻辑表达式

--and  并且   优先级比or 高

--or   或者

--not  非

--查询地址为’北京海淀‘的并且性别为’男‘

select cid,cname,address,sex from customer where address='北京海淀' and sex='男';

select * from customer

--查询库存量在10和35之间,包括边界,的图书信息

select * from book where numstore>=10 and numstore<=35;

--between... and... 包括边界

select * from book where numstore between 10 and 35;

--between m and n  在[m,n]之间 闭区间

--in (m,n,k,...)   只要出现在括号中,返回真列举

select * from book where bid ='b0001' or bid='b0002';

select * from book where bid  in('b0001','b0002');

/*

模糊查询

语法:字段名 like '匹配字符串'

匹配字符串:

%    0个或者多个字符(任意个字符)

——   任意一个字符

[]   在范围内的一个字符

[^]  不在范围内的一个字符

*/

--查询出图书的名称,以’*‘开头

select * from book where bname like '*%';

--查询出图书名称包含有‘小平’的图书

select * from book where bname like '%小平%';

--已知bid员工有5个字符

--查询出bid以“b000”开头的图书信息

select * from book where bid like 'b000_';

--[]只能表示一个字符

--表示字符范围abc开头,后面任意

select * from book  where bid like'[a-c]%';

select * from book  where bid like'[abd]%';

select * from book  where bid like'[a-cn]%';

--不以and开头,后面任意

select * from book  where bid like'[^adn]%';

/*

关于查询的其他技巧:

1.top(n)问题,返回查询结果中前n条

1)表示前n条

select top n 列名 from 表名 where 条件

2)表示前n%

select top n percent 列名 from 表名 where 条件 

*/

use library

sp_help customer

go

--返回查询结果的前3条记录

select top 3 * from customer;

--返回查询结果的前20%的记录

select top 20 percent * from customer;

--返回满足条件的一半数据

select top 50 percent cid,cname,sex from customer where sex='女';

/*

测试时候比较注重数据备份

2.使用select可以复制表

语法:select * into 新表名 from 原表名;

会根据原表的结构创建新的表,同时将查询回的结果插入到新表中

*/

use library

go

sp_help book

select * from book;

--使用book表复制新的表名为book1

select * into book1 from book;

--7行受影响

go

sp_help book1;

select * from book1;

--复制时可以指定条件、行、列

select bid,bname,pub,author1 into book2 from book where pub='人民出版社';

sp_help  book2

select * from book2

--创建新的表book3,只拷贝book表的结构

--不拷贝数据

select * into book3 from book where 1<>1;--永假式 技巧

sp_help book3

select * from book3

/*

分离数据库 library

    将数据库脱离管理器

    注意:不能分离正在使用的数据库

附加数据库 library

    将数据库加入管理器管理     

*/

/*

sql_server常用的数据类型:

1.数值型

int 整数

float 小数

2.字符型

char(n)   定长字符串

varchar(n) 可变长字符串

3.日期型

datatime

*/

select getdate();--返回日期型数据

/*

数据完整性:

       保证数据的准确性、一致性

       关键在于设计

 分为3种:

 1)实体完整性(行完整性)     保证每一行的唯一性 id(pk)  

 2)域完整性  (属性完整性)   确保某个字段的值符合业务要求

   比如:email格式  必须要有@符号

 3)引用完整性(参照完整性)    

   比如:emp表的dept_id要参照于dept表的id才有意义

   

为了实现以上的完整性,需要使用:约束 constraint  各种主流数据库约束语法都相同

分类:

1.主键约束    pk(primary key)

2.唯一约束    uk(unique)

3.外键约束    fk(foreign key)

4.非空约束    nn(not null)

5.检查约束    ck(check key)

6.默认值约束  default

约束是针对表中的某个字段添加的

*/

/*

主键约束  pk  primary key

pk=uk+nn  唯一且非空

具备类似的效果

保证实体的完整性,即每一行都是唯一的

uk:unique

nn:not null

*/

use worker

--创建新的表,员工表emp,提供pk约束

drop table emp;

create table emp(

id      int constraint emp_id_pk primary key,

name    varchar(30) not null,

salary  float

);--列级约束  约束直接定义在字段之后  语法:constraint 约束名称 约束类型

insert into emp values(1,'tom',5000.0); 

insert into emp values(1,'tom',5000.0);

select * from emp;

--表级约束  所有的字段后追加一个约束

create table emp1(

id      int,

name    varchar(30) not null,

salary  float,

constraint emp1_id_pk primary key(id)

);--约束名不能重复,表存在约束就在,名字不能随便取

insert into emp1 values(1,'tom',6000.0);

insert into emp1 values(1,'tom',6000.0);

--需求:创建一张表stu,存在两个pk

--无法将多个 primary key 约束添加到表 'stu'。

--一张表无法同时定义多个pk

drop table stu

create table stu(

id1 int primary key,

--id2 int primary key, --无法将多个 primary key 约束添加到表 'stu'。

name varchar(20)

);

--联合主键

--使用表级约束,定义联合主键

--定义:联合起来是唯一且非空的

--目前只能够使用表级约束

create table stu(

id1 int,

id2 int,

name varchar(30),

constraint stu_id1_id2_pk primary key(id1,id2) 

);

insert into stu values(1,1,'tom');

insert into stu values(1,2,'james');

insert into stu values(1,3,'mary');

select * from stu

insert into stu values(1,1,'tony');--违反了 primary key 约束 'stu_id1_id2_pk'。不能在对象 'dbo.stu' 中插入重复键。

insert into stu values(2,1,'andi');

/*

联合主键表示联合起来唯一且非空

红 蓝

红 绿   单个可重复

红 黑

蓝 绿   组合在一起不重复就可

红 绿   重复了

绿 红   只有一个不同就可以

*/

--通过后期追加约束  ddl:alter

create table emp2(

id int not null,

name varchar(30) not null,

salary float

);

--给emp2表中的id 字段住家pk约束

--使用ddl:alter改变表结构

alter table emp2

add constraint emp2_id_pk primary key(id);

--一个数据库里的约束名是唯一的,不能重复使用

--删除约束(所有约束方式一样)

--根据表和约束名就可删除

alter table emp2

drop constraint emp2_id_pk;

use worker

--唯一约束  uk unique

--保证实体完整性

drop table stu

create table stu(

id    int not null unique,

name  varchar(30)

);

insert into stu values(1,'tom');

insert into stu values(1,'tom');

--追加约束uk name唯一

alter table stu

add constraint stu_name_uk unique(name);

insert into stu values(2,'tom');

insert into stu values(2,'tony');

--联合唯一约束

use worker

drop table stu1

create table stu1(

id    int primary key,

name1 varchar(30),

name2 varchar(30)

);

--给stu1追加一个联合唯一约束

--要求name1 和 name2  两个字段联合唯一

alter table stu1

add constraint stu1_name1_name2_uk unique(name1,name2);

insert into  stu1 values(1,'tom','cat');

insert into  stu1 values(2,'tom','cat');

insert into  stu1 values(2,'tom','candy');

insert into  stu1 values(3,'tom','cat');

select * from stu1

--删除约束

alter table stu1

drop constraint stu1_name1_name2_uk;

--删除记录为id=3

delete from stu1 where id=3;

--有重复数据想要添加约束时要先删除再添加

/*

3.外键约束  fk  foreign key

引用完整性、参照完整性

*/

--父表 dept 部门表

--子表 emp  员工表

--规则:父先与子存在,子先与父消失

drop table emp;

drop table dept;

--父表

create table dept(

  id   int constraint dept_id_pk primary key,

  name varchar(30) not null unique

);

--子表

create table emp(

  id       int constraint emp_id_pk primary key,

  name     varchar(30) not null,

  salary   float,

  dept_id  int,

  --外键约束

  --参照的表的值id必须是唯一的uk

  --dept 表中的id是pk一定是唯一的

  --references 关键字:参照于(引用)

  constraint emp_dept_depid_fk foreign key(dept_id) references dept(id)

);

--先插入dept表的数据

insert into dept values(1,'销售');

insert into dept values(2,'行政');

insert into dept values(3,'研发');

select * from dept

--插入emp表的数据

insert into emp values(101,'tom',5000.0,1);

insert into emp values(102,'james',6000.0,2);

insert into emp values(103,'mary',8000.0,3);

insert into emp values(104,'jobs',9000.0,2);

select * from emp

insert into emp values(105,'tony',7000,1);

--版本2.外键约束时可以后期追加的

--alter

drop table emp;

drop table dept;

--父表

create table dept(

  id   int constraint dept_id_pk primary key,

  name varchar(30) not null unique

);

--子表

create table emp(

  id       int constraint emp_id_pk primary key,

  name     varchar(30) not null,

  salary   float,

  dept_id  int,

);

--给员工表emp的部门dep_id追加一个fk约束

--emp表的demp_id(fk)参照于dept表的id(pk)

alter table emp

add constraint emp_dept_deptid_fk foreign key(dept_id) references dept(id) ;

--先插入dept表的数据

insert into dept values(1,'销售');

insert into dept values(2,'行政');

insert into dept values(3,'研发');

select * from dept

--插入emp表的数据

insert into emp values(101,'tom',5000.0,1);

insert into emp values(102,'james',6000.0,2);

insert into emp values(103,'mary',8000.0,3);

insert into emp values(104,'jobs',9000.0,2);

select * from emp

insert into emp values(105,'tony',7000,6);

delete from emp where id=105; 

--删除外键约束

alter table emp

drop constraint emp_dept_deptid_fk;

/*

在某些数据库中,有时即使两张表有关系,也不加外键约束,目的是:提高系统性能

数据库维护每个约束来增加系统的开销,可以通过其他层面技术来弥补

结论:一般选择加约束,但不绝对

具体问题具体分析

*/

/*

1.主键约束 pk primary key

2.外键约束 fk foreign key

3.唯一约束 uk unique key

4.唯一约束 nn not null

*/

/*

检查约束 ck check

针对某个字段进行数据的有效性检查

如果数据不符合要求,无法插入成功

*/

--针对customer表的email字段来添加约束

--保证email 字段有效性:必须要有@

use library

select * from customer

go

sp_help customer

alter table customer

add constraint customer_email_ck check(email like '%@%');

--以后插入数据就会检查email的格式

insert into customer (cid ,cname,email)values('30001','张无忌','zhangwuji@163.com')

--如何删除约束

alter table customer

drop constraint customer_email_ck 

insert into customer (cid ,cname,email)values('30002','令狐冲','linghuchong@163.com')

insert into customer (cid ,cname,email)values('30003','刘玉','ly')

--又想加约束了

alter table customer

add constraint customer_email_ck check(email like '%@%');

--必须修改对应email

update customer set email='ly@163.com' where cid ='30003'