2.1定义属性
2.1.1 使用 DDL 语句维护数据表结构
数据定义语言(Data Definition Language,DDL),用于定义和管理 SQL 数据库中所有对象,它最基本的功能是创建和维护数据库和数据表结构
创建数据库的 DDL 语法如下:
语法:CREATE DATABASE database_name
语法说明: database_name 为数据库名,如创建“lingju”数据库的 DDL 语句为:create database lingju 。
删除数据库的 DDL 语法如下:
语法:DROP DATABASE database_name
创建数据表的 DDL 语法如下:
CREATE TABLE table_name( column_name data_type [NOT NULL] [DEFAULT default_value] [identity] [], ... [PRIMARY KEY(pk_name),] [FOREIGN KEY(fk_name) REFERENCES referenced_table_name(ref_pk_name)])
语法说明 :
- “[]”中的内容为可选项。table_name:表名
- column_name:字段名
- data_type:字段数据类型。default_value:默认值
- identity :主键值自动增长。pk_name:当前表中的主键名
- fk_name:当前表中的外键名
- referenced_table_name:被引用表名(主表名)
- ref_pk_name:被引用表主键名
示例:
create table shop( shopID int identity(1,1) primary key, shopName varchar(50), shopAddress varchar(50), contact varchar(50), city varchar(50) defaul ' 武汉 ' )
Create table orders( ordersID int identity(1,1) primary key, ordersDate date, deliveryDate date, amount decimal(10,2),customerID int,foreign key(customerID) references customer(customerID) )
新增字段语法如下:
语法:alter table 表名 add 字段名 数据类型
示例:alter table customer add bankNo nvarchar(20)
删除字段语法如下:
语法:alter table 表名 drop column 字段名
示例:alter table customer drop column bankNo
修改字段名语法如下:
语法:alter table 表名 rename column 旧字段名 to 旧字段名
示例:alter table customer rename column tel to mobile
修改字段类型语法如下:
语法:alter table 表名 alter column 字段名 数据类型
示例:alter table goods alter column unitPrice decimal(18,4)
insert 语句用于向表中新增记录,其中新增一条新记录的语法
语法:Insert [into] table_name[( 字段列表 )] values( 值列表 )
示例:Insert into product(title,productDesc,originalPrice,currentPrice) values(' 资生堂菲婷 ',' 日本原装 ',369,289)
使用 update 语句可以对表中的记录进行修改。update 语句的语法格式
语法:update table_name set 字段名 1= 值 1, 字段名 2= 值 2 , … , 字段名 n= 值 n; [where 条件表达式 ]
示例:Update customer set city=concat(city,' 市 '), phone= concat('86',phone)
删除表记录的语法如下:
语法:Delete from table_name [where 条件表达式 ]
示例:Update customer set city=concat(city,' 市 '), phone= concat('86',phone)
2.2select 基本查询
2.2.1 select 基本结构语法
select 查询语句的语法如下:
语法:SELECT <COLUMN1, COLUMN2, COLUMN3...> FROM <table_name> [WHERE < 条件表达式 >] [GROUP BY COLUMN1, COLUMN2, COLUMN3... | HAVING < 条件表达式 >] [ORDER BY < COLUMN1, COLUMN2, COLUMN3...> [ASC 或 DESC]]
语法说明:
- 必须的子句只有 select 子句和 from 子句
- where 子句用于对查询结果进行过滤
- group by 子句根据指定列分组,having 子句对分组后的结果进行过滤
- order by 子句用于对查询结果进行排序
- asc 表示升序排序,desc 表示降序排序,默认按 asc 排序
查询商品标题、原价和团购价,要求采用别名显示查询结果
示例:
Select title as 标题 , originalPrice as 原价 , currentPrice as 团购价 from product
2.2.2 查询结果排序
查询商品标题、原价和团购价,按商品种类升序排列,如果种类相同,则按团购价降序排列
示例:Select title as 标题 , originalPrice as 原价 , currentPrice as 团购价 from product order by categoryID, currentPrice desc
2.2.3 distinct 关键字
查询订购过商品的全部客户编号,要求仅显示客户编号且编号不能重复
示例:Select distinct customerID from orders
2.2.4 使用 top n 返回指定行数
使用top n返回结果集的前n行数据
语法:Select top n column1,colmn2 … from table
示例:Select top 3 title 标题 , currentPrice 团购价 from product order by currentPrice
2.2.5 模糊查询
查询所有 KTV 的价格信息
示例:Select title as 标题 , originalPrice as 原价 , currentPrice as 团购价 from product Where title like '%KTV%'
2.3聚合函数和分组查询
2.3.1 聚合函数
聚合函数用于对一组值进行计算并返回一个汇总值,使用聚合函数可以统计记录行数、计算某个字段值的总和以及这些值的最大值、最小值和平均值等
常用聚合函数及其功能
- sum :返回选取的某列值的总和
- max:返回选取的某列的最大值
- min:返回选取的某列的最小值
- avg :返回选取的某列的平均值
- count:返回选取的某列或记录的行数
获取火锅类商品的最高团购价、最低团购价、平均团购价、数量以及销售数量合计
示例:select max(currentPrice) 最高团购价 , min(currentPrice) 最低团购价 , avg(currentPrice) 平均团购价 , count(*) 数量 , sum(salesCount) 销售数量合计 from product where categoryID=7
统计有商家信息的商品的数量
示例:Select count(areaID) 商品数量 from product
2.3.2 分组查询
使用 group by 子句可以将数据划分到不同的组中,实现对记录的分组查询。group by 从英文字面的意义上可以理解为“根据(by)一定的规则进行分组(group)”
该子句的作用是通过一定的规则将一个数据集划分成若干个小的区域,然后针对这若干个小区域进行统计汇总
语法:group by 字段列表 [having 条件表达式 ]
显示不同类型的商品数量和平均团购价,按照商品数量升序排列,如果商品数量相同,则按平均团购价降序排列
示例:select categoryID 商品类型编号 , count(*) 商品数量 , avg(currentPrice) 平均团购价 from product group by categoryID order by count(*), 平均团购价 desc
显示有商家信息的每一种类型的商品数量和平均团购价,按照商品数量升序排列,如果商品数量相同,则按照平均团购价降序排列
示例:select categoryID 商品类型编号 , count(*) 商品数量 , avg(currentPrice) 平均团购价 from product where shopID is not null group by categoryID order by count(*), 平均团购价 desc
显示有商家信息的每一种类型的商品数量和平均团购价,按照商品数量升序排列,如果商品数量相同,则按照平均团购价降序排列,但仅显示平均团购价大于 100 元的分组信息
示例:select categoryID 商品类型编号 , count(*) 商品数量 , avg(currentPrice) 平均团购价 from product where shopID is not null group by categoryID having avg(currentPrice)>100 order by count(*), 平均团购价 desc
2.4连接查询
2.4.1 内连接查询
内连接的语法
语法:
SELECT fieldlist FROM table1 [INNER] JOIN table2 ON table1.column1=table2.column2 [where condition]
语法说明:
- fieldlist:table1 表和 table2 表中的字段列。如果 fieldlist 取两张表所有列,则可用“*”代替,此时会出现连接依据列重复,即 table1 表的 column1 与 table2 表的 column2 为重复列。
- table1 [INNER] JOIN table2:将 table1 表与 table2 表进行内连接,INNER 可省略
- table1.column1=table2.column2:连接条件,其中 column1 和column2 为table1 表与table2 表的关联列,通常它们为外键列和主键列
- “inner”可省略
- “where condition”可省略,它为查询条件表达式
注意:连接依据的列可能包含 null 值,null 值不与任何值匹配(甚至和它本身)
2.4.2 简单多表查询
如果在 FROM 子句中,直接列出所有要连接的表,然后在 WHERE 子句中指定连接条件,此为简单多表查询, 它与内连接功能相同
使用两表连接查询语法
语法:SELECT fieldlist FROM table1, table2 WHERE table1.column1=table2.column2 [and 其他条件]
显示有商品订购信息的全部顾客姓名
示例:select distinct c.customerName 顾客姓名 from orders o inner join customer c on o.customerID=c.customerID
使用简单连接查询
示例:select distinct c.customerName 顾客姓名 from orders o, customer c where o.customerID=c.customerID
显示顾客“雷亚波”的所有订购明细,查询信息包括订单号、商品标题、团购价、团购商品数量以及下单时间,显示结果按照下单时间升序排列
示例:select o.ordersID 订单号 , title 商品标题 , currentPrice 团购价 , quantity 团购商品数量 , ordersDate 下单时间 from orders o, customer c, ordersDetail od, product p where o.customerID=c.customerID and o.ordersID=od.ordersID and od.productID=p.productID and c.customerName=' 雷亚波 ' order by ordersDate
显示全部商品类型信息
示例:select categoryID 订单号 , categoryName 类型名称 , p_categoryID 上级类型编号 from category
显示商品大类名为“购物”的商品小类信息
示例:select c2.categoryName 商品大类 , c1.categoryName 商品小类 from category c1, category c2 where c1.p_CategoryID=c2.categoryID and c2.categoryName=' 购物 '
查询商品大类名为“购物”的全部商品的基本信息,显示信息包括商品大类、商品小类、商品标题名和团购价
示例:select c2.categoryName 商品大类 , c1.categoryName 商品小类 , title 商品标题名 , currentPrice 团购价 from category c1, category c2, product p where c1.p_CategoryID= c2.categoryID and c2.categoryName=' 购物 ' and c1.categoryID=p.categoryID
总结 :
- 新增记录。insert [into] table_name[( 字段列表 )] values( 值列表 )
- 更新记录。update table_name set 字段名 1= 值 1,字段名 2= 值 2,…,字段名 n= 值 n[where 条件表达式 ]
- 删除记录。delete from table_name [where 条件表达式 ]
- group by 字段列表[having 条件表达式],其中“字段列表”表示进行分组所依据的一个或多个字段的名称。 “having条件表达式”是一个逻辑表达式,用于指定分组后的筛选条件
- 连接查询分为:内联查询和简单多表连接查询