mysql-06 SQL

mysql-06 SQL

基础概念

  SQL(Structured Query Languege)结构化查询语言,是关系数据库的标准语言,功能强大,是一种通用的关系数据库语言。

关于大小写

  SQL Server和mysql对英文字母大小写不敏感,如下图,无论是关键字select、where等,还是被查找的内容字符串,亦或者是表名,一律对大小写不敏感。

SQL语句执行顺序

1)from

2)join

3)on

4)where

5)group by(按照后续条件分组)

6)聚集函数(avg,sum等)

7)having(按照后续条件筛选分组)

8)计算所有表达式

9)select

10)distinct(删除重复行)

11)order by(对结果排序)

举例

1
2
3
4
5
6
7
select sname from student where student.sno='31606';

1)from studen 确定要查的是学生表
2)where student.sno='31606' 确定要查的是该表中学号为31606那一行的数据
3)select sname 确定要查的数该行的sname属性值

总结:哪个表--->哪一行--->哪个属性值

SQL数据定义语句

对象\操作 增 删 改
模式 create schema drop schema 先删,再增加
表 create table drop table alter table
视图 create view drop view 先删,再增加
索引 create index drop index alter index

举例

1、定义模式
  定义模式实际上定义了一个命名空间,在这个空间中可以进一步创建基本表、视图和定义授权。

1
2
3
4
5
6
7
#为用户zhang 创建一个模式test,并且在其中定义一个表tab1
create schema test authorization zhang
create table tab1(name char(20),age (int));

#先为用户zhang 创建一个模式test,然后在其中定义一个表tab1
create schema test authorization zhang;
create table test.tab1;

2、删除模式

1)cascade(级联):删除模式的同时,删除其中所有数据库对象(表、视图等);

2)restrict(限制):删除模式时,若其中有数据库对象(表、视图等),则拒绝执行此删除操作,直接报错;而当其中没有任何下属对象时才可以成功执行drop schema语句。

1
2
1)drop schema zhang cascade;
2)drop table tab1; drop schema zhang restrict;

3、定义基本表(基表)

1)建表的同时,通常会加入完整性约束条件,通常有以下几种

  • primary key(主码)

  • unique(唯一值)

  • not null(不能取空值)

  • foreign key(外码)

    PS:参照表和被参照表可以是一个表

2)建表时还要考虑数据类型,以下是常用的几种(不同关系数据库管理系统支持的数据类型不完全相同)

数据类型 含义
char(n) 定长字符串,长度为n
varchar(n) 变长字符串,最大长度为n
int 长整数,4B(字节)
smallint 短整数,2B
bigint 大整数,8B
float 可选精度的浮点数,精度至少n位数字
boolean 逻辑布尔量
date 日期,格式YYYY-MM-DD
time 时间,格式HH:MM:SS

3)定长变长的区别

  char(n)是定长格式,格式为char(n)的字段固定占用n个字符宽度,如果实际存放的数据长度超过n将被截取多出部分,如果长度小于n就用空字符填充。

  varchar(n)是变长格式,这种格式的字段根据实际数据长度分配空间,不浪费对应的空间,但是搜索数据的速度会慢一点。

实例:学生数据库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#学生表
#学号 姓名 性别 年龄 系别
create table student(
sno char(9) primary key,
sname char(20) unique,
ssex char(2),
sage smallint,
sdept char(20));

#课程表
#课程号 课程名 先修课 学分值
create table course(
cno char(4) primary key,
cname char(40) not null,
cpno char(4),
ccredit smallint,
foreign key(cpno) reference course(cno));

#选课表
#学号 课程号 成绩
create table sc(
sno char(9),
cno char(4),
grade smallint,
primary key(sno,cno),
foreign key(sno) reference student(sno),
foreign key(cno) reference course(cno));

4、修改基本表

1)注意drop某一列的时候也有cascade(级联)和restrict(限制)的区别

  • cascade(级联):删除列的同时,级联删除引用了该列的其他对象(例如视图);
  • restrict(限制):删除列时,如果该列被其他对象引用,则RDBMS拒绝此删除操作,直接报错;如果此时该列未被任何其他对象引用,则可以成功drop。

格式

1
2
3
4
5
6
alter table 表名
add column 列名 数据类型 约束
add 表级约束
drop column 列名 cascade|restrict
drop constraint 约束名 cascade|restrict
alter column 列名 数据类型

举例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#向student表增加一列“资产”,要求不能取空值
alter table student
add smoney char(20) not null;

#将资产改为int型
alter table student
alter column smoney int;

#去掉“资产”那一列不能取空值的约束
alter table student
alter smoney char(20);

#删除“资产”列
alter table student
drop column smoney cascade;

#增加课程名必须取唯一值的约束(表级)
alter table course
add unique(cname);

#删除课程名必须取唯一值的约束(表级)
drop constraint unique(cname) cascade;

5、删除基本表

1
drop table 表名 restrict|cascade

1)cascade(级联):删除表的同时,相关的依赖对象(例如视图)也会被一起删除;不仅数据和表的定义被删除,而且此表上建立的索引、触发器等对象也都将被删除;如果该表被其他表引用,则会牵连其他表一起被删除。(例如SC表外码sno引用student,删除student后,SC也会被级联删除)。

2)restrict(限制):删除表时,若该表被其他表约束所引用,例如(check、foreign key等),删除会失败;若该表有视图、触发器、存储过程或者函数等依赖该表的对象,则删除会失败。

6、建立索引

  当表的数据量比较大时,查询操作会比较耗时,建立索引可以加快查询速度。

1
create [unique][cluster] index 索引名 on 表名(列名 次序,列名,次序,~)

参数解析

1)unique:此索引每一个索引值只对应唯一的数据记录

2)cluster:此索引为聚簇索引

3)次序:默认为ASC(升序),另一个DESC(降序)

举例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#SC表按学号升序、课程号降序建立唯一索引
create unique index scno on sc(sc asc,cno desc);

PS:先将学生按学号升序排列,这样出现多组,每一组是一个学生所选多个课程,对组内课程降序排列





#修改索引名
alter index scno rename to scsno;



#删除索引
drop index scsno;

注意

  索引可以减少查询操作的时间,但是若数据增删改频繁,则系统要话费许多时间来维护索引吗,得不偿失反而降低查询效率,这时就需要删除一些不必要的索引了。

欢迎打赏,谢谢
------ 本文结束------
0%