数据类型 含义
char(n) 长度为n的定长字符串
varchar(n) 最大长度为n的变长字符串
CLOB 字符串大对象
BLOB 二进制大对象
int 长整数
smallint 短整数
bigint 大整数
numeric(p,d) 定点数,p位数字,d位小数
real 单浮点数
double 双精度浮点数
float(n) n精度浮点数
date 日期,包含年、月、日,格式为YYYY-MM—DD
time 时间,包含时、分、秒 格式为HH-MM-DD
timestamp 时间戳类型,date+timeinterval 时间间隔类型
索引INDEX
#1.建立索引CREATE[UNIQUE][CLUSTER]INDEX<索引名>ON<表名>(<列名>【<次序>】.....)
# UNIQUE 表示每一个索引值都只对应唯一的数据记录# CLUSTER 表示要建立的索引是聚簇索引CREATEUNIQUEINDEX Stusno ON student(Sno ASC);#为表student的Sno列按照升序创建一个名为Stusno的索引#2.为表添加索引ALTERTABLE tableName ADDINDEX indexName(columnName)ALTERTABLEuserADDINDEX indexNam(id,dept_name);#为表user添加列id,dept_name的索引#3.删除索引#SQLDROPINDEX indexName ON tableName;#MySQLALTERTABLE tableName DROPINDEX indexName
ALTERTABLEuserDROPINDEX ind;#为表user删除索引ind#4.在创建表的时候直接定义索引CREATETABLEuser(
id intprimarykey,
name varchar(100)notnull,
gender char(10)notnull,INDEX indexName name
)#5.查看缩影SHOWINDEXFROM tableName;SHOWINDEXFROMuser;#查看user表中的索引
数据查询
#1、句式SELECT[ALL|DISTINCT]<目标列>,...FROM<tableName/viewName>,...【 WHERE<条件表达式>】【 GROUPBY<列名1> 【HAVING<条件表达式>】【ORDERBY<列名>【ASC|DESC】】
#2、单表查询SELECT*/<列名>FROM tableName WHERE<条件>SELECT*FROMuser;#查询user表中的所有元组SELECT*FROMuserWHERE id =1;#查询user表中所有id=1的元组#3、消除表中的若干元组#消除重复行——使用DISTINCTSELECTDISTINCT*FROMuser;#4.##1.确定连续范围BETWEEN...AND...##2.确定集合SELECT*FROMuserWHERE id BETWEEN1AND3;## 查询user表中所有id在1到3的元组SELECT*FROMuserWHERE id in(1,3);## 查询user表中所有id为1或3的元组#5、字符串匹配SELECT*FROMuserWHERE name ='%liu%';#查找所有 name包括‘liu’的元组,%表示任意字符,任意个数SELECT*FROMuserWHERE name ='_liu';#查找所有 ?liu的元组,_表示一个任意字符#6、聚集函数##COUNT(*) 统计元组个数SELECTCOUNT(*)FROMuser;#user中所有元组的个数##COUNT(DISTINCT|ALL 列名) 某一列中值的个数SELECTCOUNT(DISTINCT|ALL id)FROMuser;#user中所有非重复id|所有id的个数##SUM(DISTINCT|ALL 列名) 某一列中值的总和(数值类型)SELECTSUM(ALL id)FROMuser;# user中所有id的和##AVG(DISTINCT|ALL 列名) 某一列中值得平均值(数值类型)SELECTAVG(ALL id)FROMuser;##MAX(DISTINCT|ALL 列名) 某一列中的最大值 (任意类型)SELECTMAX(ALL name)FROMuser;##MIN(DISTINCT|ALL) FROM user 某一列中的最小值SELECTMIN(ALL name)FROMuser;#7、GROUP BY 字句(分组)SELECT*FROM tableName GROUPBY 列名; 根据列名分组,列名相同为一组
SELECT*FROMuserGROUPBY name;#更具name给user中的元组分组 (没什么意义)#用途:统计数据 SELECT name,COUNT(name)FROMuser;#可以找到不同分组的数据特点 #对分组进行筛选 HAVING,把每一个分组放入HAVING条件中,如果符合条件则筛选出SELECT Sno FROM SC GROUPBY Sno HAVINGCOUNT(*)>3;#以Sno分组,筛选出出现3次以上的Sno#8、连接查询SELECT*FROMuser,person WHEREuser.id = person.id ;#查询user,person两表中所有id
相等的部分(适合索引)
##表的自身连接 : 表与表的笛卡尔积SELECT*FROMuser a,user b WHERE a.id1 = b.id2 ;#在同一个表联合查询(重要)#9、外连接JOINSELECT*FROM tableName1 a [LEFT|RIGHT|FULL]OUTERJOIN person b on a.id = b.id
#LEFT : 左外连接,左侧表全部都有,缺值补NULL#RIGHT: 右外连接,右侧表全部都有,缺值补NULL#FULL :全连接,两侧表都有,缺值补NULL
MySQL不支持全连接
#自然连接SELECT*FROM tableName1 a NATURALJOIN tableName2 # 自然连接会去掉重复列,重复列是自动找到的,natural join 不需要USING与ON
嵌套查询
#1.IN : 结果是否在集合中(常用)SELECT*FROMuserWHERE id IN(SELECT id FROM person)# 查询user表中的信息,外查询所查到的每一个元组的id应该在person的id集合当中#2.普通嵌套查询SELECT*FROMuserWHERE(SELECTAVG(salary)FROM person =user.salary)#3.带有ANY、SOME、ALL 谓词的嵌套查询# ANY、SOME某个# ALL 全部(全称量词)SELECT*FROMuserWHERE salary >SOME|ALL(SELECT salary FROM person)#查询user表中 salary > 大于perosn中的salary,SOME指大于
任意一个 salary就行, ALL指大于所有的salary
#4.带有EXISTS谓词的嵌套查询,只产生逻辑的真假 EXISTS|NOT EXISTSSELECT*FROMuserWHEREEXISTS(SELECT*FROMuserWHERE id =1)
把外层查询查出来的每一个元组 放到 内存查询中进行条件的判断,如果条件符合,则外层查询出的元组有效。
## 集合查询
//1.参加集合查询的 表之间 列必须相同,每一列都要做相应的操作//2.集合查询的关键词 连接的是 不同的SELECT字句#1.UNION 并集操作,所有结果全部输出SELECT id,dept_name FROM person
UNIONSELECT id,dept_name FROMuser#查询person表中所有的id,dept_name和user中所有的id,dept_name#2.INTERSECT 交集操作SELECT id,dept_name FROM person
INTERSECTSELECT id,dept_name FROMuser#查询两个表中相同的id与dept_name#3.EXCEPT 差集操作SELECT id,dept_name FROM person
EXCEPTSELECT id,dept_name FROMuser#查询 person中所有的id,dept_name 减去 与user表中的交集之后的元组//MySQL中不支持 INTERSECT、EXCEPT 操作
派生表查询
//派生表的 作用是建立一个临时的新表,用作查询(方便快捷)#SQL语法SELECT*FROM person,(SELECT dept_name FROMuser)AS tem_table(dept_name)WHERE person.dept_name = tem_table.dept_name
#查询 person与由user中dept_name组成的新派生表tem_table的联合查询中,二者dept_name相等的部分# MySQL派生表语法不同:SELECT*FROM person,(SELECT id newID FROMuser)AS tem_table WHERE person.id = tem_table.newID
//该句语义同上,但派生表新列的重命名在 SELECT 语句旧列名之后 ,派生表之后不能定义新的列//在SQL中AS可以省略,但MySQL不可以#with as 语句(在MySQL中不可用)WITH temportable AS(SELECT name,dept_name FROM person);//取person的name,dept_name构造一个临时表
插入数据
#1.插入元组INSERTINTOuser(id,dept_name)VALUES(3,'dept_name')#为指定的列添加相应的值INSERTINTOuserVALUES (3,'dept_name') #不指定列就必须 添加所有列的值#2.插入子查询结果INSERTINTOuser(SELECT id,dept_name FROM person)//不可以使用VALUE//自己赋值需要使用VALUE,使用子查询结果赋值不能使用VALUE
修改数据
UPDATEuserSET dept_name ='new_name'WHERE id =1#将id=1 的元组记录中的 dept_name 修改为 'new_name'#带子查询的修改语句UPDATEuserSET dept_name ='name'WHEREin(SELECT id IN person)//将user表中所有id存在于person集合中的元组 dept_name赋值为'name'
删除数据
#1、删除某一记录DELETEFROMuserWHERE id =1 ;
#删除user表中 id = 1 的记录#2、删除表中全部的记录DELETEFROMuser ;
//使得user表成为空白,删除所有的记录#3、带有子查询的删除DELETEFROMuserWHERE id IN(SELECT id FROM person);#删除user中所有id在person的id集合中的元组
空值
#1、空值判断ISNULLISNOTNULLSELECT*FROM person WHERE dept_name ISNOTNULL;#查询person表中所有dept_name不为NULL的元组SELECT*FROM person WHERE dept_name ISNULL;#查询person表中所有dept_name 为 NULL的元组#2、空值的算术运算1、 空值与另一个值的 算术运算 还为空值
2、 空值与空值的 比较运算结果为UNKNOWN
视图
#1、建立视图CREATEVIEW new_view ASSELECT a.id,a.name,b.dept_name FROM person a,user b;//创建视图 new_view ,该视图的列 分别为 person 中的id,name 和 user中的dept_nameCREATEVIEW new_view(id,na,dept)ASSELECT a.id,a.name,b.dept_name FROM person a ,user b;//创建视图 new_view ,该视图的列 分别为 person 中的id,name 和 user中的dept_name,并为这些属性
重新命名为id、na、dept
#WITH CHECK OPTIONCREATEVIEW new_view ASSELECT a.id,a.name,b.dept_name FROM person a,user b where a.id = b.id WITB CHECKOPTION;//创建视图 new_view ,该视图的列 分别为 person 中的id,name 和 user中的dept_name,条件是 person 与 user 中id相等。 WITH CHECK OPTION 使得之后任何对该视图的操作,都会自动检查WHERE条件(即两表id是否相等)//视图不仅可以建立在表上面,还可以建立在其他的视图上面#2.删除视图DROPVIEW new_view CASCADE;
级联删除视图new_view,可选CASCADE同时删除由该视图定义的一系列视图,可空也可选RESTRICT#3.查询视图
同表
#4.视图更新
操作同表,但某些视图不可更新,视图的更新必须要能够对应到对应表的更新
//视图不可更新情况:DB21、视图由 两个以上基本表导出
2、视图的字段来自于字段表达式或常数,则不允许UPDATE与INSERT3、视图的字段来自聚集函数
4、视图定义中含有GROUPBY子句
5、视图定义中含有DISTINCT 短语
6、视图定义中含有嵌套查询,并且内层查询的FROM字句中涉及的表也是导出该视图的基本表