知识内容:

1.了解SQL

2.库、表操作及索引

3.select语句及insert语句

4.update语句与delete语句

5.SQL常用函数

6.多表连接及组合查询

7.视图操作及数据控制

参考资料:SQL必知必会及www.w3school.com.cn/sql

关于SQL常用条件操作符:http://www.cnblogs.com/wyb666/p/9051677.html

一、了解SQL

1.数据库基础

数据库:保存有组织的数据的容器

表:某种特定类型数据的结构化清单

模式:关于数据库和表的布局及特性的信息

列:表中的一个字段,所有表都是由一个或多个列组成的

数据类型:所允许的数据的类型,每个表的列都有相应的数据类型,它限制(或允许)该列中存储什么样的数据

行:表中的一个记录

主键:一列(或一组列),其值可以唯一标识表中每一行

关于主键:

  • 任意两行都不具有相同的主键值
  • 每一行都必须具有一个主键值(主键值不允许为空)
  • 主键列中的值不允许修改或更新
  • 主键值不能重用(如果某行从表中删除,它的主键不能赋给以后的新行)

2.什么是SQL

SQL:结构化查询语言(Structured Query Language)简称SQL是一种的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统;同时也是数据库脚本文件的扩展名。说简单点SQL就是专门用来和数据库沟通的语言

注:

  • SQL中不区分大小写,但是一般提倡使用大写
  • SQL中注释使用--

3.SQL四大功能

  • 查询:select
  • 操纵:insert delete update
  • 定义:create drop alter
  • 控制:grant revoke

4.本篇博客中的SQL命令相关环境

使用的数据库:SqlServer2012

使用到的库为学生信息管理,库在这里:https://pan.baidu.com/s/1rdEWSbix5ZwEDHZHYy9QZw

学生信息管理数据库中的表如下图所示:

二、库、表相关操作及索引

1.create语句

 CREATE DATABASE database_name  -- 创建数据库

 CREATE TABLE 表名称                       -- 创建表
(
列名称1 数据类型,
列名称2 数据类型,
列名称3 数据类型,
....
) [in 数据库名]

实例:

 创建学生表。
CREATE TABLE 学生(
学号 CHAR(18)not null,
姓名 CHAR(8),
年龄 SMALLINT,
性别 CHAR(2),
籍贯 CHAR(20),
专业号 CHAR(10)
);

2.alter语句

ALTER TABLE 语句用于在已有的表中添加、删除或修改列

 在表中添加列:
ALTER TABLE table_name
ADD column_name datatype
 删除表中列:
ALTER TABLE table_name
DROP COLUMN column_name
 改变表中列的数据类型:
ALTER TABLE table_name
ALTER COLUMN column_name datatype

实例:

 ALTER TABLE 学生 ADD 电话 CHAR(20) NULL

 ALTER TABLE 学生 ALTER 学号 CHAR (5) primary key

 ALTER TABLE 学生;
ALTER 年龄 SET CHECK 年龄 >=0; ALTER TABLE 学生 DROP column 电话

3.drop语句

通过使用 DROP 语句,可以轻松地删除表和数据库

 DROP TABLE 语句用于删除表(表的结构、属性以及索引也会被删除):
DROP TABLE 表名称 DROP DATABASE 语句用于删除数据库:
DROP DATABASE 数据库名称 仅除去表内的数据,但不删除表本身就使用 TRUNCATE TABLE 命令(仅仅删除表格中的数据):
TRUNCATE TABLE 表名称

实例:

 删除学生表:
DROP TABLE 学生

4.索引相关语句

(1)建立索引

索引被创建于已有的表中,它可使对行的定位更快速更有效。可以在表格的一个或者多个列上创建索引,每个索引都会被起个名字。用户无法看到索引,它们只能被用来加速查询

 CREATE [UNIQUE] INDEX 索引名 ON 基表名
(列名1[ASC/DESC][,列2[ASC/DESC]]…)
[PCTFREE={10/整数}];

建立索引

 唯一的索引 (Unique Index):
在表格上面创建某个一个唯一的索引。唯一的索引意味着两个行不能拥有相同的索引值。 CREATE UNIQUE INDEX 索引名称
ON 表名称 (列名称) 注:"列名称" 规定你需要索引的列。
 简单的索引:
在表上创建一个简单的索引。当我们省略关键词 UNIQUE 时,就可以使用重复的值。 CREATE INDEX 索引名称
ON 表名称 (列名称) 注: "列名称" 规定你需要索引的列。

(2)删除索引

 可以使用 DROP INDEX 命令删除表格中的索引
用于 MS SQL Server 的语法:
DROP INDEX table_name.index_name 或 DROP INDEX 索引名 ON 基表名; 用于 IBM DB2 和 Oracle 语法:
DROP INDEX index_name 用于 MySQL 的语法:
ALTER TABLE table_name DROP INDEX index_name

(3)索引实例

 在学生表中按学号降序建立索引:
CREATE UNIQUE INDEX 学号 ON 学生(学号 DESC); 在学生表中删除索引:
DROP INDEX 学号 ON 学生

三、select语句及insert语句

1.select语句

select语句:

 SELECT [all|distinct|top] 列名1,列名2...
FROM 表名/视图名
[WHERE 条件表达式]
[
GROUP BY 分组列
[HAVING 分组筛选条件表达式]
]
[ORDER BY 列名1 [ASC|DESC], 列名2 [ASC|DESC]... ]
以上[]中的内容为可选,语法中的第一行用于指定查询结果需要返回的列: 可以逐个列出所有列名
也可以用*表示返回所有列
  • group by用于对数据进行分组以便于汇总计算; having是group by的可选项,用于对汇总结果进行筛选。汇总计算是指统统计记录的个数、计算某列的平均值等
  • ORDER BY用于指定返回结果的记录按某个或某几列的大小排序,ASC->从小到大排序(默认) DESC->从大到小排序

(1)检索语句

 select * from 学生                      -- 检索学生表中所有列
select 籍贯 from 学生 -- 检索单个列
select 学号,专业号, 籍贯 from 学生 -- 检索多个列
select distinct 专业号 from 学生; -- 检索不同的值
select top 5 专业号 from 学生; -- 检索学生表中前五行

(2)排序检索数据

 select 年龄 from 学生 order by 年龄; -- 排序数据(默认升序排列)
select 学号, 年龄, 专业号 from 学生 order by 学号, 年龄; -- 按多个列排序(首先按学号排序然后按年龄排序)
select 学号, 年龄, 专业号 from 学生 order by 年龄 desc; -- 指定降序排序数据

(3)条件查询-过滤数据

 select 学号, 年龄, 专业号 from 学生 where 年龄 >= 18;
select 学号, 年龄, 专业号 from 学生 where 年龄 != 18;
select 学号, 年龄, 专业号 from 学生 where 年龄 between 18 and 19;
select 学号, 年龄, 专业号, 民族 from 学生 where 年龄 != 18 and 民族 != '汉';
select 学号, 年龄, 专业号, 民族, 性别 from 学生 where 年龄 > 18 and 性别 = '男';
select 学号, 年龄, 专业号, 民族 from 学生 where 专业号 = 0501 or 民族 != '汉';
select 学号,年龄, 专业号, 民族 from 学生 where 专业号 in (0501, 0502) order by 专业号;
select 学号,年龄, 专业号, 民族 from 学生 where 民族 in ('内蒙', '回', '藏') order by 年龄;
select 学号,年龄, 专业号, 民族 from 学生 where 专业号 not in (0501, 0502) order by 专业号;

(4)条件查询-用通配符进行过滤 -> %匹配任意字符任意次, _匹配单个字符, []指定字符集从中选一个匹配指定位置的一个字符

 select 学号,年龄, 专业号, 民族 from 学生 where 学号 like '0305%'  order by 学号;        -- like操作符与%操作符
select 学号,年龄, 专业号, 民族 from 学生 where 专业号 like '04%' order by 学号; -- like操作符与%操作符
select 学号,年龄, 专业号, 民族 from 学生 where 学号 like '030531__' order by 学号; -- like操作符与_操作符
select 学号,年龄, 专业号, 民族 from 学生 where 学号 like '0304[1, 5]%' order by 学号; -- like操作符与[]操作符

(5)使用子查询

 select 学号,姓名,年龄 from 学生 where 学号 in (select 学号 from 成绩单 where 成绩 >= 90);
select 学号,姓名,年龄 from 学生 where 学号 in ('', '');
-- 作为子查询的select语句只能查询单个列,企图检索多个列将返回错误!
select 学号, 姓名, (select COUNT(*) from 成绩单 where 成绩单.学号=学生.学号) as 科目数 from 学生 order by 学号

2.insert语句

INSERT INTO 表名[(列名1[,列名2] …)]
VALUES (常量1[,常量2] …);

INSERT INTO 表名[(列名1[,列名2] …)]

例:

 INSERT INTO 员工
VALUES ("1204","张三","男","12","业务员",1200) INSERT INTO employee (emp_no, fname, lname, officeno)
VALUES (3022, "John", "Smith", 2101)

四、update语句与delete语句

1.update语句

UPDATE 表名
SET 列名1=表达式1[,列名2=表达式2] …
[WHERE 条件表达式];

例:

 update 员工 set 薪金=薪金*1.5
where 职务 in("总经理","经理","副经理");
update 学生 set 年龄=年龄+1
where 性别="男" and 专业号="0403";

2.delete语句

DELETE FROM 表名
[WHERE 条件表达式];

例:

 DELETE FROM 员工 WHERE 姓名=“张三”;
DELETE FROM CUSTOMER WHERE COUNTRY = “USA”;
DELETE FROM 学生 WHERE LEFT(学号,4)=“2004” AND 年龄 BETWEEN 18 AND 22; 注意,删除数据可能会触发参照完整性的约束规则!

五、SQL常用函数

----统计函数----

  • AVG  --求平均值
  • COUNT  --统计数目
  • MAX  --求最大值
  • MIN  --求最小值
  • SUM  --求和

实例如下:

(1)简单使用

 select 学号,avg(成绩) as 平均成绩 from 成绩单 group by 学号;
select count(*) as 人数 from 教师;
select 学院编号,count(教师编号) as 人数 from 教师 group by 学院编号;

(2)汇总数据

 1 select avg(成绩) as avg from 成绩单 where 课程号 = 01054010; -- avg函数
2 select count(*) as num_cust from 成绩单; -- count函数
3 select count(课程号) as num_cust from 成绩单; -- count函数
4 select max(成绩) as max_grade from 成绩单; -- max函数
5 select min(成绩) as min_grade from 成绩单; -- min函数
6 select sum(基本工资) as sum_salary from 教师 where 职称='教授'; --sum函数
7 select sum(基本工资) as sum_salary from 教师 where 职称='副教授'; --sum函数
8 select sum(基本工资) as sum_salary from 教师 where 职称='讲师'; --sum函数
9 select avg(distinct 成绩) as avg from 成绩单 where 课程号 = 01054010; -- distinct
10 select avg(成绩) as avg, max(成绩) as max, min(成绩) as min from 成绩单 where 课程号 = 01054010; -- 组合聚集函数

(3)分组数据

1 select count(*) as num_prods from 学生 where 学号 like '0305%';     -- 数据分组
2 select 年龄, count(*) as num_prods from 学生 group by 年龄; -- 创建分组
3 select 年龄, count(*) as num_prods from 学生 group by 年龄 order by 年龄 desc; -- 创建分组并以年龄降序排列
4 select 年龄, count(*) as num_prods from 学生 group by 年龄 having count(*) >= 3; -- 过滤分组
5 select 年龄, count(*) as num_prods from 学生 where 民族 = '汉' group by 年龄 having count(*)>=3; -- having和where同时使用

group和having:

 GROUP BY〈组合列表〉[,〈组合列表〉…]:分组查询。
查询中的行组取决于一个或多个列的值。〈组合列表〉可以是普通数据库字段名,一个包含SQL字段函数的字段成一个指定查询结果中数据库的列位置的数值表达式,但不能是字段表达式。 HAVING 〈过滤条件〉与GROUP BY一起使用指定查询结果中的组必须满足的条件。
可以根据需要设置多个过滤条件,彼此间用AND或OR连接。还可用NOT求反。

注意下面图中的问题:

六、多表连接及组合查询

1.多表连接

SQL中使用inner join进行多表连接

实例:

 查询学生管理数据库中有成绩的学生的姓名、性别、籍贯、课程编号以及成绩。
Select 学生.学号,姓名,籍贯,课程号,成绩
From 成绩单 inner join 学生 On 学生.学号=成绩单.学号 查询选择课程”高等数学”的学生姓名、所在专业以及成绩.
Select 课程名,姓名,专业,成绩
From ((课程 inner join 成绩单 on 课程.课程号=成绩单.课程号) inner join 学生 on 学生.学号=成绩单.学号) inner join 专业 on 专业.专业号=学生.专业号 where 课程名=‘高等数学’

2.组合查询

UNION 操作符用于合并两个或多个 SELECT 语句的结果集。

注意UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。

 UNION 语法
SELECT column_name(s) FROM table_name1
UNION
SELECT column_name(s) FROM table_name2 注:默认UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL UNION ALL 语法
SELECT column_name(s) FROM table_name1
UNION ALL
SELECT column_name(s) FROM table_name2 另外UNION 结果集中的列名总是等于 UNION 中第一个 SELECT 语句中的列名

七、视图操作及数据控制

1.视图的定义

视图(View)是从一个或几个基表(或视图)导出的表。一个用户可以定义若干个视图,因此,对于某一用户而言,它的外模式是由若干基表和若干视图组成的

2.视图操作

(1)建立视图

 CREATE VIEW 视图名 [(字段名[,字段名…])
AS 查询语句
[WITH CHECK OPTION];

(2)删除视图

 DROP VIEW 视图名;

(3)视图实例

 建立性别为男的写生信息视图。
CREATE VIEW 男生
AS SELECT *
FROM 学生
WHERE 性别=‘男’ 视图查询:
select *
from 男生
where 专业号=‘0403’ 视图的更新:
update 男生
set 年龄=年龄+1
数据库将其转换为对基表的更新
update 学生
set 年龄=年龄+1
where 性别=‘男’

注:视图是一个虚表,在视图上不能建立索引;视图的更新最终要转换成对基表的更新

3.视图的优点

  • 视图对于数据库的重构造提供了一定程度的逻辑独立性
  • 简化用户操作
  • 使用户以不同的方式看待同一数据
  • 对机密数据提供了自动的安全保护功能

4.数据控制功能

SQL语言的数据控制功能是指控制数据库用户对数据的存取权力。实际上数据库中的数据控制包括数据的安全性、完整性、并发控制和数据恢复。
在这里仅讨论数据的安全性控制功能,DBMS须具有以下功能:

  • 把授权的决定告知系统,这是由SQL的GRANT和REVOKE语句完成的
  • 把授权的结果存入数据字典
  • 当用户提出操作请求时,根据授权情况进行检查,以决定是执行操作请求还是拒绝它

GRANT语句:授权

REVOKE语句:回收授权

 授权语句
GRANT 权力1[,权力2…][ON 对象类型 对象名]TO 用户1[,用户2…][WITH GRANT OPTION]; 回收授权语句
REVOKE 权力1[,权力2…] [ON 对象类型 对象名] FROM 用户1[,用户2…];

视图(View)是从一个或几个基表(或视图)导出的表。一个用户可以定义若干个视图,因此,对于某一用户而言,它的外模式是由若干基表和若干视图组成的

事务控制语句:

  • BEGIN TRANSACTION: 启动一个新事务
  • ROLLBACK: 回滚事务,结束当前事务
  • COMMIT: 提交事务,当前事务正式完成

数据库入门4 结构化查询语言SQL的更多相关文章

  1. 结构化查询语言-SQL

    结构化查询语言(Structured Query Language)简称SQL(发音:/ˈes kjuː ˈel/ "S-Q-L"),是一种特殊目的的编程语言,是一种数据库查询和程 ...

  2. (三) 结构化查询语言SQL——1

    1. SQL概述 SQL,结构化查询语言,重要性不必在赘述了,基本上开发软件没有不用到的,此外在一些大数据也有广泛的应用.SQL主要包含数据定义语言(DDL).数据操纵语言(DML)以及数据控制语言( ...

  3. 结构化查询语言(SQL)数据类型

    简要描述一下结构化查询语言中的五种数据类型:字符型,文本型,数值型,逻辑型和日期型. 字符型 VARCHARVS CHAR VARCHAR型和CHAR型数据的这个差别是细微的,但是非常重要.他们都是用 ...

  4. Oracle数据库语言——结构化查询语言SQL

    一.数据定义语言DDL 1.创建表空间:CREAT TABLESPACE lyy DATAFILE 'C:/app/lyy.dbf' SIZE 10M;(创建一个10M的表空间,存放在C盘app文件夹 ...

  5. (五) 结构化查询语言SQL——3

    4. 数据更新 1)增 对应INSERT语句.格式为INSERT INTO T[(A1,…,Ak)]  VALUES (C1,…,Ck),其中A代表表T的属性,C代表常量,A可以缺省,此时C必须严格按 ...

  6. (四) 结构化查询语言SQL——2

    3)ORDER BY排序语句 通常,查询的结果是以无序的方式显示的,有时需要将查询结果按照一定次序来进行排序.ORDER BY就可以用上了,例如查询课程号为202的课程成绩的所有信息,并按照成绩降序排 ...

  7. SQL 数据库结构化查询语言

    1.数据库 常见数据库 MySQL:开源免费的数据库,小型的数据库. Oracle:收费的大型数据库,Oracle 公司的产品 DB2:IBM 公司收费的数据库,常应用在银行系统中 SQLServer ...

  8. SQL Structured Query Language(结构化查询语言) 数据库

    SQL是Structured Query Language(结构化查询语言)的缩写. SQL是专为数据库而建立的操作命令集,是一种功能齐全的数据库语言. 在使用它时,只需要发出“做什么”的命令,“怎么 ...

  9. SQL 结构化查询语言

    SQL 结构化查询语言 一.数据库的必要性: >>作用:存储数据.检索数据.生成新的数据 1)可以有效结构化存储大量的数据信息,方便用户进行有效的检索和访问. 2)可以有效地保持数据信息的 ...

随机推荐

  1. js窗口拖动 模版

    <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>& ...

  2. Visual Studio 2017 以前的旧格式的 csproj Import 进来的 targets 文件有时不能正确计算属性(PropertyGroup)和集合(ItemGroup)

    我在之前的博客中有教大家如何编写 NuGet 工具包,其中就有编写 .targets 文件. 我在实际的使用中,发现 Visual Studio 2017 带来的含 Sdk 的新 csproj 格式基 ...

  3. ppt罗列项排版

    关于罗列项的排版(1,....2,......3,......4,........)

  4. 【java规则引擎】《Drools7.0.0.Final规则引擎教程》第4章 4.1 规则文件

    转载至:https://blog.csdn.net/wo541075754/article/details/75150267 一个标准的规则文件的格式为已“.drl”结尾的文本文件,因此可以通过记事本 ...

  5. JVM 加载class文件的原理

    PS:类的装载过程是ClassLoader,只有把类 加载 到 JVM后才能运行: PS:两种加载类的方式: 显示:new 隐式:class.forname() PS:动态的执行,用到谁,加载谁:

  6. nexus && minio s3 存储私有镜像

    对于新版本的nexus 已经支持s3 存储了(3.12),但是企业内部可能还是需要使用私有部署的 还好我们有minio,具体的介绍就不说了 minio 项目运行 参考项目: https://githu ...

  7. Java使用Unsafe接口操作数组Demo

    public class unSafeArrayDemo { private static final sun.misc.Unsafe UNSAFE; private static final lon ...

  8. mibox open ports

    root@dredd:/data/data/berserker.android.apps.sshdroid/home # netstat -lnpActive Internet connections ...

  9. js ==与===区别(非严格相等与严格相等)

    基本数据类型:number.string.boolean.undefined.null 高级数据类型:object 表格形式比较: 比较的类型 == === 基础类型 不同基础类型间比较," ...

  10. spring答题

    ioc 依赖注入:通过注入的方式实例化对象,不再直接new对象了,交给spring容器进行管理和维护 控制反转:实例化对象的控制权交给了spring容器,而不再是某个单独的类,控制权发生了变更 作用: ...