赞
踩
数据库DB:是按照数据结构来组织、存储和管理数据的容器,具有较小的冗余度、较高的数据独立性和易扩展性。基本特点:永久存储、有组织、可共享
数据库管理系统DBMS:数据库软件,是一种操纵和管理数据库的大型软件,是用于建立、使用和维护数据库
数据库系统DBS:是由数据库及其管理软件组成的系统
数据库管理员DBA:负责全面管理和控制数据库系
表:一种结构化的文件,用来存储某种特定类型的数据,存储在表中的数据是同一种类型的数据或清单。使表名成为唯一的,实际上是数据库和表名的组合。在相同数据库中不能两次使用相同的表名,但是在同一个数据库中完全可以使用相同的表名
数据类型:定义了列可以存储的所允许的数据类型。每个表列都有相应的数据类型,它限制(或允许)该列中存储的数据。数据类型及其名称是SQL不兼容的一个主要原因
主键:一列(或者一组列),其值能够唯一标识表中每一行,就好像一个人的身份证一样,唯一性地代表那样东西。主键具有唯一性,且自动生成主键索引,数据库中通过主键进行查询是最快的,主键还有一个最大的用处是用作其他表的外键,在进行关联查询时提高查询速度。数据库的每张表只能有一个主键,不可能有多个主键。所谓的一张表多个主键,我们称之为联合主键,就是用多个字段一起作为一张表的主键。
数据库结构的基础是数据模型。数据模型是一个描述数据、数据联系、数据语义以及一致性约束的概念工具的集合。数据模 型提供了一种描述物理层、逻辑层和视图层数据库设计的方式。
事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消。也就是事务具有原子性,一个事务中的一系列的操作要么全部成功,要么一个都不做。
一系列相关的操作,要么全部成功,要么全部不执行。
定义:是指采用了关系模型来组织数据的数据库,其以行和列的形式存储数据,以便于用户理解,关系型数据库这一系列的行和列被称为表,一组表组成了数据库。关系模型可以简单理解为二维表格模型,而一个关系型数据库就是由二维表及其之间的关系组成的一个数据组织。
优点:
缺点:
定义:非关系型数据库严格上不是一种数据库,应该是一种数据结构化存储方法的集合,可以是文档或者键值对等。非关系型数据库以键值对存储,且结构不固定,每一个元组可以有不一样的字段,每个元组可以根据需要增加一些自己的键值对,不局限于固定的结构,可以减少一些时间和空间的开销。
优点:
缺点:
内模式、模式和外模式之间的关系:
1)简单查询
- 单列查询: select 列名 from 数据表名;
- 多列查询: select 列名1,列名2,列名3 from 数据表名;
- 查询所有列: select * from 数据表名;
- 查询不同值: select distinct 列名 from 数据表名;
- --在select列表中只能使用一次distinct关键字,而且distinct关键字必须放在第一位
- 随机查询: select * from 数据表名 order by rand() limit m;
- 限制结果: select 列名 from 数据表名 limit m; --返回不多于m行
- select 列名 from 数据表名 limit m,n; --返回从行m开始的n行,注意第一行称为行0
- select 列名 from 数据表名 limit y offset x; --返回从行x开始的y行,注意第一行称为行0
- 限定查询: select 数据表名.列名 from 数据库名.数据表名;
- 计算列查询: select 列名1,列名2,列名1*列名2 as 列名3 from 数据表名; --(MySQL算数操作符:+-*/)
- 添加单位: select 列名1,列名2,concat (列名3,'个') from 数据表名;
- 添加新列: select 列名1,列名2,1+1,'汉字1'+'汉字2' as 列名3 from 数据表名;
- 创建别名: select 列名 "新列名" from 数据表名;
- select 列名 '新列名' from 数据表名;
- select 列名 新列名 from 数据表名;
- select 列名 as "新列名" from 数据表名;
2)条件查询
- where子句: select 列名1,列名2,列名3 from 数据表名 where 列名='';
- --比较运算符:等于= 不等于!=,<> 小于< 小于等于<= 大于> 大于等于>=
- 空值检查: select 列名1,列名2,列名3 from 数据表名 where 列名 is null;
- select 列名1,列名2,isnull(列名3) as 新列名 from 数据表名;
- --判断列名3中的数据是否为null,如果为null则返回1,否则返回0
- select 列名1,列名2,nullif(列名3,'abc') as 新列名 from 数据表名;
- --将列名3中值为abc的有效值转化为空值
- and操作符: select 列名1,列名2,列名3 from 数据表名 where 列名2='' and 列名3<'';
- or操作符: select 列名1,列名2,列名3 from 数据表名 where 列名2='' or 列名3<'';
- in操作符: select 列名1,列名2,列名3 from 数据表名 where 列名3 in (a,b);
- select 列名1,列名2,列名3 from 数据表名 where m in (列名1,列名2);
- not操作符: select 列名1,列名2,列名3 from 数据表名 where 列名3 not in (a,b);
- select 列名1,列名2,列名3 from 数据表名 where not 列名3='';
注意点:
AND运算符真值表:
OR运算符真值表:
3)范围查询
- 查询两个值之间的数据: select 列名1,列名2,列名3 from 数据表名 where 列名3 between m and n;
- 查询不在两个值之间的数据:select 列名1,列名2,列名3 from 数据表名 where 列名3 not between m and n;
- 查询两个日期之间的数据: select 列名1,列名2,列名3 from 数据表名 where 列名3 between '2019-10-01' and '2019-10-07';
- 指定日期查询数据: select 列名1,列名2,列名3 from 数据表名 where day(列名3)=20;
- --查询日期为20号的数据
- select 列名1,列名2,列名3 from 数据表名 where month(列名3)=11;
- --查询11月份的数据
- select 列名1,列名2,列名3 from 数据表名 where year(列名3)=2019;
- --查询2019年的数据
4)模糊查询
- 百分号%通配符: select 列名1,列名2,列名3 from 数据表名 where 列名2 like '**%'
- --检索以**开头的字符,%表示任意字符出现零次或任意多次
- select 列名1,列名2,列名3 from 数据表名 where 列名2 like '%**%'
- --检索任何位置包含**的字符
- select 列名1,列名2,列名3 from 数据表名 where 列名2 like '*%*'
- --检索以*开头,以*结尾的字符
- 下划线_通配符: select 列名1,列名2,列名3 from 数据表名 where 列名2 like '_**'
- -- 下划线_的作用和%的作用类似,但是下划线只表示任意单个字符
- 定义转义字符: select 列名1,列名2,列名3 from 数据表名 where 列名2 like '%/_%' escape '/';
- --查询列名2中含有字符_的数据
- --第一个%为通配符,/是定义的转义字符,/后面的_被解释为普通字符,最后的%为通配符
- select 列名1,列名2,列名3 from 数据表名 where 列名2 like '%10#%' escape '#';
- --查询列名2中含有字符10%的数据
- --第一个%为通配符,#是定义的转义字符,#后面的%被解释为普通字符
5)REGEXP模糊查询
- 基本字符匹配: select 列名1,列名2,列名3 from 数据表名 where 列名2 REGEXP '***'
- --检索列名2中包含***的所有行,REGEXP后所跟的东西作为正则表达式处理
- select 列名1,列名2,列名3 from 数据表名 where 列名2 REGEXP '.**'
- --.是正则表达式语言中一个特殊的字符,它表示匹配任意一个字符
- 进行OR匹配: select 列名1,列名2,列名3 from 数据表名 where 列名2 REGEXP 'a|b'
- --|是正则表达式的OR操作
- 匹配字符之一: select 列名1,列名2,列名3 from 数据表名 where 列名2 REGEXP '[abc]'
- --匹配a或者b或者c
- select 列名1,列名2,列名3 from 数据表名 where 列名2 REGEXP '[a|b|c]'
- 匹配范围: select 列名1,列名2,列名3 from 数据表名 where 列名2 REGEXP '[a-b]***'
- --a-b只匹配一个字符
- 匹配特殊字符: select 列名1,列名2,列名3 from 数据表名 where 列名2 REGEXP '\\*'
- --为了匹配特殊字符,必须用\\为前导,用于查找特殊字符*
6)数据排序
-
- 排序数据: select 列名 from 数据表名 order by 列名;
- select 列名 from 数据表名 order by 'a b';
- --如果列名中由空格,就需要加上单引号或者双引号
- 按照多个列排序: select 列名1,列名2,列名3 from 数据表名 order by 列名2,列名3;
- --优先按照列名2排序,在列名2相同的行内部会按照列名3排序
- 升序排序: select 列名 from 数据表名 order by 列名 asc;
- --默认升序
- 降序排序: select 列名 from 数据表名 order by 列名 desc;
- --在字典排序中,A和a被视为相同
- 汉字拼音排序: select 列名 from 数据表名 order by convert (列名 using gbk) desc;
7)数据统计分析
- 返回某列的平均值: select avg(列名) from 数据表名;
- 返回某列的行数: select count(列名) from 数据表名;
- select count(*) from 数据表名;
- --count(*)用于处理结果集中的行,它是最准确返回表中行的总计函数
- --count(列名)则是对表达式的返回值进行处理,返回的值可描述为传递次函数的列中非零值的计数
- 返回某列的最大值: select max(列名) from 数据表名;
- 返回某列的最小值: select min(列名) from 数据表名;
- --max和min函数忽略值为null的值
- 返回某列值之和: select sum(列名) from 数据表名;
- --sum函数忽略值为null的值
- 聚集不同的值: select avg(distinct 列名) as 新列名 from 数据表名;
- --MySQL中聚合函数不可以直接嵌套使用,但是可以嵌套子查询使用
8)分组统计
- 分组group by语句: select sclass,count(*) as member from student group by sclass;
- 过滤having语句: select sclass,count(*) as member from student group by sclass having count(*) >2;
- select sclass,count(*) as member from student
- where sclass=3 and 4
- group by sclass having count(*) >2
- order by sclass;
- rollup关键字: select sclass,count(*) as member from student group by sclass,sno with rollup;
- --在分组统计数据的基础上在进行统计汇总
- cube关键字: select sclass,count(*) as member from student group by sclass,sno with cube;
Select子句的顺序:
9)子查询
- 简单子查询: select 列名1,列名2 from 数据表名 where 列名3 in(select 列名4 from 数据表名 where 列名5='');
- select 列名1,列名2(select 列名4 from 数据表名 where 列名5='') from 数据表名;
- exists子查询: select 列名1,列名2 from 数据表名 where exists (select * from from 数据表名 where 列名5='')
- select 列名1,列名2 from 数据表名 where not exists (select * from from 数据表名 where 列名5='')
- 量词子查询: select 列名1,列名2 from 数据表名 where 列名3 < all(select 列名4 from 数据表名 where 列名5='');
- --<all表示小于最小的;>all表示大于最大的;=all则没有返回值
- select 列名1,列名2 from 数据表名 where 列名3 < any(select 列名4 from 数据表名 where 列名5='');
- --<any表示小于最大的;>any表示大于最小的;=any等同于in
- select 列名1,列名2 from 数据表名 where 列名3 < some(select 列名4 from 数据表名 where 列名5='');
- --量词some和any是同义的
10)多表连接
- 等值连接: select cno,sname,degree from score,student where score.sno=student.sno;
- select student.cno,score.sname,score.degree from score inner join student on score.sno=student.sno;
- 不等值连接: select cno,sname,degree from score,student where score.sno<>student.sno;
- 自然连接: SELECT a.user_id,b.address,CONVERT(VARCHAR(10),last_login,120) AS last_login FROM users a,user_address b WHERE a.user_id=b.user_id;
- --自然连接是等值连接的一种特殊形式。即按照两个表中的相同属性进行等值连接,且目标中去除重复的列,保留所有不重复的列
- 连接多个表: select sname,cname,degree from student,score,class where score.sno=student.sno and score.cno=class.cno;
- 左连接: SELECT goods_id,goods_name,name FROM goods LEFT JOIN goods_type ON goods.goods_type=goods_type.id ORDER BY goods_id DESC;
- 右连接: SELECT goods_id,goods_name,name FROM goods RIGHT JOIN goods_type ON goods.goods_type=goods_type.id;
- 全连接: SELECT goods_id,goods_name,name FROM goods FULL JOIN goods_type ON goods.goods_type=goods_type.id ORDER BY goods_id;
- --注意mysql不支持全连接
- 自然连接: SELECT b1.id,b1.name,b1.cat_name FROM brand b1,brand b2 WHERE b1.cat_name=b2.cat_name;
- --自连接是指一个表自身进行连接
- 交叉连接: SELECT a.name,a.cat_name,b.goods_name FROM brand a CROSS JOIN goods b;
- --两个表的笛卡尔乘积,会将第一个表的每一行和第二个表的每一行相匹配
-
- 组合查询: select 列名1,列名2 from 数据表名1 union select 列名1,列名2 from 数据表名2;
- --union默认取消重复的列; 使用union all可以包含所有的列,不取消重复的列
- 组合查询排序: select 列名1,列名2 from 数据表名1 union select 列名1,列名2 from 数据表名2 order by 列名1;
- --只能使用一个order by子句
- --该子局必须放在最后一个select语句之后,所使用的排列名必须是第一个select语句中的列名
11)其他语句
- 拼接字段: select concat (列名1,'(',列名2,')') from 数据表名;
- 使用别名: select concat (列名1,'(',列名2,')') as 列名3 from 数据表名;
- 全文本搜索: select 列名 from 数据表名 where match(列名) against('***');
- --match指定被搜索的列,against指定要使用的搜索表达式
-
- 文本处理函数: select 列名1,upper(列名2) as 列名3 from 数据表名;
- 常用的文本处理函数: upper 将文本转换为大写 lower 将文本转换为小写
- left 返回串左边的字符 right 返回串右边的字符
- length 返回串对的长度
- locate 找出串的一个子串
- ltrim 去掉串左边的空格 rtrim 去掉串右边的空格
- soundex 返回串的soundex值
- substring 返回串的子串
- 常用数值处理函数: abs 返回一个数的绝对值 cos 返回一个角度的余弦
- exp 返回一个数的指数值 mod 返回除操作的余数
- pi 返回圆周率 rand 返回一个随机数
- sin 返回一个角度的正弦 sqrt 返回一个数的平方根
- tan 返回一个角度的正切
- 插入完整的行: insert into 数据表名 values('***','***','***');
- insert into 数据表名(列名1,列名2,列名3) values('***','***','***');
- 插入多个行: insert into 数据表名(列名1,列名2,列名3) values('***','***','***'),('+++','+++','+++');
- 插入检索出的数据: insert into 数据表名(列名1,列名2,列名3) select 列名1,列名2,列名3 from 数据表名2;
- 复制表中的数据: create table 数据表名 as select * from 数据表名2 where 列名1=***;
- 更新表中单个列: update 数据表名 set 列名1='***' where 列名2='+++';
- 更新表中多个列: update 数据表名 set 列名1='***',列名2='+++' where 列名3='---';
- 更新表中所有列: update 数据表名 set 列名1='***';
- 依据外表值更新数据: update 数据表名 set 列名1=列名1+100 where 列名2='+++';
- 删除某个列的值: update 数据表名 set 列名1='NULL' where 列名2='+++';
- 删除单个行的值: delete from 数据表名 where 列名1='***';
- 删除多个行的值: delete from 数据表名 where 列名1 in ('***','+++','---');
- 删除所有行: delete from 数据表名;
- truncate table 数据表名;
1)创建和操纵数据库/数据表
- 默认值创建数据库: create database 数据库密码;
- 自定义选项创建数据库: create database 数据库名 on ( );
- 向数据库中添加文件: alter database 数据库名 add file ( );
- 向数据库中添加文件组: alter database 数据库名 addfilegroup 文件组名;
- 删除文件或文件组: alter database 数据库名 remove file 文件名;
- 修改数据库文件: alter database 数据库名 modify file ( );
- 删除数据库: drop database 数据库名;
-
- 创建表: create table 数据表名 (列名1 int,列名2 varchar(20),列名3 char(20));
- 使用NULL: create table 数据表名 (列名1 int not null,列名2 varchar(20),列名3 char(20));
- 指定主键: create table 数据表名 (列名1 int primary key,列名2 varchar(20),列名3 char(20));
- create table 数据表名 (列名1 int,列名2 varchar(20),列名3 char(20),primary key (列名1));
- 自动增量: create table 数据表名 (列名1 int primary key auto_increment,列名2 varchar(20),列名3 char(20));
- 指定默认值: create table 数据表名 (列名1 int default 1,列名2 varchar(20),列名3 char(20));
- 更新表: alter table 数据表名 add 列名 varchar(20);
- 增加主键: alter table 数据表名 add primary key (列名);
- 删除添加的列: alter table 数据表名 drop column 列名;
- 删除表: drop table 数据表名;
- 重命名数据表: rename table 原数据表名 to 现数据表名;
2)创建视图、存储过程、游标、触发器
- 创建视图: create view 视图名 as select cno,sname,degree from score,student where score.sno=student.sno;
- 使用视图过滤数据: create view 视图名 as select * from student where sbirth is not null;
-
-
- 创建存储过程: create procedure 存储体名() begin select * from 数据表名; end;
- 删除存储体: drop procedure 存储体名;
-
- 创建游标: create procedure 存储体名() begin declare 游标名 for select 列名 from 数据表名; edn;
- 打开游标: open 游标名;
- 关闭游标: close 游标名;
-
- 创建触发器: create trigger 触发器名 + insert / delete / update...;
- 删除触发器: drop trigger 触发器名;
- roolback语句: start transaction; ******; roolback; (使用roolback语句可以回退 start transaction之后的所有语句)
- commit语句: start transaction; ******; commit; (commit语句进行明确的提交)
- 使用保留点: savepoint delete1; roolback to delete1;
- 管理用户: use mysql; select user from user;
- 创建用户账户: create user 用户名 identified by '***';
- 重命名用户账号: rename user 原用户名 to 现用户名;
- 删除用户账号: drop user 用户名;
- 查看用户账号的权限: show grants for 用户名;
- 赋予用户账号的权限: grant 用户权限 on 数据库名.数据表名 to 用户名;
- 取消用户账号的权限: revoke 用户权限 on 数据库名.数据表名 from 用户名;
- 更改口令: set password for 用户名 = pasword ('***');
- 显示所有的数据库: show databases;
- 选择一个数据库: use 数据库名;
- 显示一个数据库内的所有表: show tables;
- 显示一个表的所有信息: show columns from 数据表名; / describe 数据表名; / desc 数据表名;
SELECT user_id,email,DATE_FORMAT(reg_time,'%Y/%m/%d') AS reg_time FROM shop.users LIMIT 6;
内连接:取两表的交集,只返回两张表匹配的记录
select * from a inner join b on a.book_id=b.book_id
左连接:以左表为准,查询出左表的所有数据,右表中有对应的则显示出来,没有对应的则显示为null
select * from a left join b on a.book_id=b.book_id
右连接:以右表为准,查询出右表的所有数据,左表中有对应的则显示出来,没有对应的则显示为null
select * from a right join b on a.book_id=b.book_id
全连接:是left和right的集合,某表中某一行在另一表中无匹配行,则相应列的内容为null
select * from a full join b on a.book_id=b.book_id
交叉连接:不带where条件子句,它将返回被连接的两个表的笛卡尔积,返回的行等于两个表行数的乘积
内连接、自然连接、外连接(左、右、全)、交叉连接
简单的说,范式是为了消除重复数据减少冗余数据,从而让数据库内的数据更好的组织,让磁盘空间得到更有效利用的一种标准,满足高等级的范式的先决条件是满足低等级范式。
举例说明:
在上面的表中,“家庭信息”和“学校信息”列均不满足原子性的要求,故不满足第一范式,调整如下:
举例说明:
在上图所示的情况中,同一个订单中可能包含不同的产品,因此主键必须是“订单号”和“产品号”联合组成,但可以发现,产品数量、产品折扣、产品价格与“订单号”和“产品号”都相关,但是订单金额和订单时间仅与“订单号”相关,与“产品号”无关,这样就不满足第二范式的要求,调整如下,需分成两个表:
举例说明:
上表中,所有属性都完全依赖于学号,所以满足第二范式,但是“班主任性别”和“班主任年龄”直接依赖的是“班主任姓名”,而不是主键“学号”,所以需做如下调整:
简单的说,范式是为了消除重复数据减少冗余数据,从而让数据库内的数据更好的组织,让磁盘空间得到更有效利用的一种标准,满足高等级的范式的先决条件是满足低等级范式。
举例说明:
在上面的表中,“家庭信息”和“学校信息”列均不满足原子性的要求,故不满足第一范式,调整如下:
举例说明:
在上图所示的情况中,同一个订单中可能包含不同的产品,因此主键必须是“订单号”和“产品号”联合组成,但可以发现,产品数量、产品折扣、产品价格与“订单号”和“产品号”都相关,但是订单金额和订单时间仅与“订单号”相关,与“产品号”无关,这样就不满足第二范式的要求,调整如下,需分成两个表:
举例说明:
上表中,所有属性都完全依赖于学号,所以满足第二范式,但是“班主任性别”和“班主任年龄”直接依赖的是“班主任姓名”,而不是主键“学号”,所以需做如下调整:
删除某一行:Delete from 数据表名称 where 列名称=值;
删除所有行:Delete * from 数据表名称
删除数据库:drop database 数据库名称
删除数据表:(表的结构、属性、索引也会被删除)
drop table 数据表1名称,数据表2名称
删除数据表字段(列):
alter table 数据表名称
drop column 字段名(列名称)
truncate table 数据表名称
“ TRUNCATE TABLE语句是一种快速、无日志记录的方法。TRUNCATE TABLE语句与不含有WHERE子句的DELETE语句在功能上相同。但是,TRUNCATE TABLE语句速度更快,并且使用更少的系统资源和事务日志资源。”
6. 子查询与其他select语句之间的区别
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。