1.常见的数据库
2.MySQL语法
(1)SQL分类
《1》DDL(Data Definition Language)数据定义语言:用来定义数据库对象,如数据库、表、列等,有关键字create、drop、alter等。
《2》DML(Data Manipulation Language)数据操作语言:用来对数据库中表的增、删、改,有关键字update、delete、insert等。
《3》DQL(Data Query Language)数据查询语言:用来查询数据库中表的记录,有关键字select、where等。
《4》DCL(Data Control Language)数据控制语言:用来定义数据库的访问权限和安全级别,及创建用户,有关键字grant、revoke等。
3.DDL(操作数据库、表)
(1)数据库
《1》查询所有的数据库名称:show databases ;
查询某一个数据库对应的字符集:show create database xxx;
《2》创建数据库
create database xxx ;但是如果这个数据库已经存在再次创建就会报错,所以使用create database if not exists xxx; # 不存在则创建,存在不会产生报错。设立创建数据库的字符集:create database xxx character set utf8;当然上面两个可以合成一个语句(创建数据库判断是否存在,不存在创建并设立其字符集):create database if not exists xxx character set utf8;
《3》修改数据库
alter database xxx character set 字符集;
《4》删除数据库
drop database xxx;先判断是否存在,存在再删除:drop database if exists xxx;
《5》使用数据库
使用数据库:use xxx;
查询当前正在使用的数据库是哪一个:select database();
(2)数据表
《1》查询某一数据库下的所有数据表名称:show tables;
查询表结构:desc 表名;
查询表的字符集:show create table xxx;
《2》创建表
careate table 表名(
字段1 数据类型,
字段2 数据类型,
...........
字段n 数据类型
); 注意最后一列不需要加“,”。
复制一个一样的表:create table 新表名 like 被表名;
《3》删除表
drop table xxx;
先判断存在然后删除:drop table if exists xxx;
《4》修改表
修改表名:alter table 旧表名 rename to 新表名;
修改表的字符集: alter table 表名 character set utf8;
添加一列:alter table 表名 add 字段名 数据类型;
修改字段名和数据类型: alter table 表名 change 原字段 新字段 新数据类型;
ALTER TABLE route CHANGE r_name r_name VARCHAR(30) CHARACTER SET utf8; # 修改表中字段的编码格式
只修改字段数据类型: alter table 表名 modify 旧字段 新数据类型;
删除某个字段:alter table 表名 drop 字段名;
4.DML(增删表中的数据)
《1》添加数据
插入一条数据:insert into 表名 (字段1,字段2.....字段n)values(值1,值2...值n);
插入多条数据:insert into 表名 (字段1,字段2.....字段n)values(值1,值2...值n),(值1,值2...值n),(值1,值2...值n).........
当然对于自增类型的id也是可以直接去掉的
insert into `user` (name,age,emil) VALUES
('malong',21,'3518806826@qq.com'),
('malong1',22,'3618806826@qq.com'),
('malong2',23,'3718806826@qq.com'),
('malong3',24,'3818806826@qq.com');
如果要对全部的字段进行插值,则可以直接省略字段,但是后面的values中包括id对应的value都不能省略
insert into `user` VALUES
(9,'malong',21,'3518806826@qq.com'),
(10,'malong1',22,'3618806826@qq.com'),
(11,'malong2',23,'3718806826@qq.com'),
(12,'malong3',24,'3818806826@qq.com');
如果给其中的几个字段添加也可以,如果给全部的字段添加值,可以省略表名后面的字段直接将表中所有的值与字段相对应写好就行,它是默认给所有的字段赋值
replace的使用
replace into tablaname values(id,xx,xx,....)
上面的replace into 同时具有insert into和update 的功能。replace是替换 已经存在的行。如果replace 中的id在之前已经存在,那么它的作用相当于update,用于更新数据库中数据的信息。但是如果id在之前没有存在。那么它的作用相当于是insert into,也就是像数据表中插入一条数据。
《2》删除数据
按条件删除:delete from 表名 where 条件;
删除所有的数据:delete from 表名;删除之后自增字段从删除之后的id开始,不从1开始,而且有多少条数据就会执行多少次删除,效率值比较低;
但是 truncate table 表名;删除后整张表依然能够从1自增开始;相当于drop table xxx,然后再创建一个一模一样的表
也可以直接是 truncate 表名;
《3》修改数据
update 表名 set 字段1=值1,字段2=值2....... where 条件;
在实际开发中如果不添加条件就会默认将该字段下的所有值都修改
5.DQL(查询表中的的记录)
新的添加
查询需求:查询表中女员工的姓名和性别,要求sex为1的时候显示为男,sex为0的时候显示为女(实际上是把sex列的值由0和1分别修改为女和男,同sex列的命也被显示为性别)
(1)基础查询
《1》查询一张表中的所有信息 select * from 表名;
查询一张表中的某几个字段下的信息 select 字段1,字段2,字段3.... from 表名;
查询其中的某一个字段,然后对相同的去重,比如说学生的地址有可能是重复的,所以就需要去掉重复的:select distinct adress from 表名;
《2》计算一张表中所有math和english的成绩之和:
select name,math,english,math+english from 表名;
但是如果其中某一条数据中的所要查找的某一个字段或者多个字段为空,则需要这样处理(如上面的math成绩和english成绩):
select name,math,english,ifnull(math成绩,0)+ifnull(english成绩,0) from 表名;
上面的含义是如果math成绩为null,就将赋值为0,不为空按照参数数字计算即可
《3》起别名(表和字段都可以起别名)可以在别名之前加关键字as也可以不加as
select name 姓名,math 数学,english 英语,ifnull(math成绩,0)+ifnull(english成绩,0) 总成绩 from 表名 别名;
(2)条件查询和模糊查询
《1》基本运算符,在where之后使用(where 字段 运算符 数字 如 where age > 20)
、=、<、<=、>=、<>在sql中表示不等于,mysql中不等于也可以表示为!=
between…and 如between 20 and 50,查询20到50之间的,既包括20又包括50
in(集合)集合表示多个值,使用逗号分隔
like "%张”模糊查询
is null 查询某一列为null的值,不能写为=null
and 或 &&(不推荐使用)
or 或 ||(不推荐使用)
not 或 !
《2》使用例子
查询年龄不等于30岁:select * from 表名 where age!=30;
select * from 表名 where age <>30;
查询年龄在20到30之间:select * from 表名 where age between 20 and 30;
select * from 表名 where age >=20 and age <=30;
当然也可以使用java中的&&,但是不推荐使用
查询20、19或者25岁的人:select * from 表 where age=19 or age = 20 or age =25; 表示选择,也可以使用java中的||,但是不推荐
select * from 表 where age in(19,20,25);
查询考了英语的学生: select * from 表 where english is not null;
而不是 select * from 表 where english=null,这样的查询没有任何的结果
《3》模糊查询
站位符:
_ : 表示任意的一位字符
% :表示0个或者多个任意字符
select * from 表 where name=“%马%” # 查询名字中包含马的名字
select * from 表 where name=“马%” # 查询名字中以马开头的
select * from 表 where name=“__” # 查询含三个字的名字
select * from 表 where name=“_马%” # 查询名字中第二个是马的名字
(3)排序查询
select * from 表 order by math asc ,english asc; # 首先对math升序排,如果math中存在两个同学的成绩相同,那么就对相同的这两个同学英语成绩升序排,desc是降序排,如果不写排序条件,那么就以默认升序排序
(4)聚合函数
select count(字段)from 表;# 统计该字段有多少条
(排除了字段为null的值)的解决方法:
select count(*) from 表; # 不推荐使用
select count(id) from 表; # id 一定不为空
和前面一样,如果一条数据对应的该字段下有一个空值。可以采用这种方式,因为它将一条数据对应的该字段下的空值当做无效的,也就是不做统计,但是除了这一条数据的这一个字段中的没有值,这一条数据的其他字段还是有值得,所以使用 select count(ifnull (enliglish,0))from 表,意思和前面的计算数学和英语的成绩之和的用法是一样的
select avg(math) from 表; # 统计数学平均值
select max( math) from 表;统计数学中的最大值
select min(math) from 表; # 统计数学最小值
(5)分组查询
where和having的区别:where使用在group by 之前限定,如果不满足条件则不参与分组;having使用在group之后,如果不满足条件限定则不会被查询显示到页面;
where之后不可以跟聚合函数,having后可以跟聚合函数判断
(6)分页操作
select * from 表 limit 0,3; # 第一页
select * from 表 limit 3,3; # 第二页,第一个参数表示开始的索引,第二个表示每页展示的数据条数
公式:开始的索引=(当前页码-1)*每页展示的数据条数
(7)学习补充
“SELECT distinct 字段 FROM 表”这句,如果不加distinct就会查出重复的数据
分组查询
having必须与group by配合使用,并且跟在group by的后面
每一组的数量使用聚合函数 count 得到各个出版社的图书数量
连接查询
嵌套查询
下面的示例是不相关子查询
当内查询的结果是一个值时,可以用 = 代替 in
all代表所有的值,用all来修饰子查询,则指定的表达式要与子查询结果集中的每一个值都要进行比较。当表达式与每个值都满足比较关系的时候才返回真值,否则返回假值。any代表某些或者某个值,查询表达式只要与子查询中的某一个值满足比较关系的时候,就返回真值。
相关子查询如下
需求:在学生表student和学生成绩表grade找出参加了“计算机基础”课程并且分数在80分以上的所有学生信息。
select t.sno,t.sname,t.sage,t.sgentle,t.sbirth,sdept from student t where 80<=(select f.score from grade f where f.sno=t.sno and f.cname='计算机基础')
该子查询的执行流程:
1、 先从父查询的student表中取出第一条记录的sno值,进入子查询中,比较其where子句的条件“where f.sno=t.sno and f.cname=’计算机基础’”,符合则返回score成绩。
2、 返回父查询,判断父查询的where子句条件80<=返回的score,如果条件为true,则返回第1条记录。
3、 从父查询的student表中取出第2条数据,重复上述操作,直到所有父查询中的表中记录取完为止。
————————————————
版权声明:本文为CSDN博主「奋斗的小青年_」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/mascf/article/details/50288199
数据操作
6.约束
(1)非空约束:值不能为空
创建非空约束的两种方式:
《1》在创建表的时候直接添加 not null;
《2》在创建表之后使用alter添加,如:
删除非空约束的方式:`alter table 表名 modify 字段名 字段类型 ; `
(2)唯一约束:该字段名下的所有值不能重复,但是可以有两个值为null
创建唯一约束的两种方式:
《1》在创建表的时候添加unique;
《2》在创建表之后使用alter,如:
删除唯一约束的方式(这里要使用索引,因为不能重复,是有规律的,所以使用索引):
而不是:
能够运行成功,但是在添加的时候还是不能添加重复相同的值
(3)主键约束:非空且唯一
创建主键的两种方式
《1》在创建表的时候添加primary key
《2》创建完表之后,使用alter,如:
删除主键的方式(因为主键在一张表中是唯一的,所以不需要添加字段名就可以):
而不是下面这种方式:
(4)主键约束-自动增长
创建主键自动增长的两种方式
《1》在创建主键的时候在主键后面添加auto_increment
《2》在创建表之后使用alter,如:
删除自动增长类型的方式
(5)外键约束
《1》在创建主表的时候添加外键
《2》创建主表之后使用alter来添加外键
《3》删除外键
(6)外键约束-级联操作(级联更新和级联删除操作可以同时设置,也可以分开设置)
级联删除和级联更新需要谨慎,尤其在实际开发的时候要想清楚是否要设置级联删除
7.多表关系
** 对于一对一,没有必要,直接添加到一个表中就好**
设计实例:
8.数据库设计范式
(1)第一范式:每一列都是不可分割的数据原子项
上面的就是违背第一范式的,所以这么建表是有问题的,应该这样做
上面的遵从第一范式,但是这样建表也存在下面的问题
(2)要解决上面的问题就要使用第一范式,第一范式使用的前提是要建立在第一范式,第二范式的概念如下:
第二范式中的几个概念:
第三范式:
建表的原则:
是原子项-消除部分函数依赖-消除传递依赖
9.多表查询
(1)查询语句
(2)内连接查询(只有当两边的条件同时成立相等的时候才会显示所查询的所有信息)
《1》隐式内连接:使用where条件消除无用数据(下面的所用的表都是自己提前已经建好的)
《2》显式内连接(和上面的查询结果是一样的)
内连接查询注意事项:
(3)外连接
《1》左外连接(查询的是左表中的全部数据而不管右表中的数据是否完整,即使右边表数据不完整也不影响左边表查询展示)
如:
《2》右外连接(查询的是右表中的全部数据而不管左表中的数据是否完整,右表中的数据全部展示,左表中的数据有就展示,没有就空着)
(4)子查询(查询中嵌套查询,将嵌套的查询称为字查询)
《1》子查询是单行单列的
《2》子查询是多行单列的
《3》子查询是多行多列的
10.(1)事务:如果一个包含多个步骤的业务操作,被事务同时管理,那么这些操作要么同时成功,要么同时失败,也即是为了防止异常:
(2)事务的四大特征:
(3)数据的隔离级别
11.DCL
(1)管理用户
在上中如果忘了mysql密码中额各个操作,凡事涉及到新打开的cmd窗口,最好是以管理员的身份打开
(2)查询用户
(3)权限管理
12.视图
1.视图的定义
视图是为了保护原有的数据库表中信息的安全性专门从数据表中选出一些特有的想要给外界展示的数据,而不是把整个数据库信息展示给外界。所以说视图只是给一般层级比较低的开发人员使用来操作数据表完整整个项目的。这是为了把防止数据库中重要信息的外露。
2.视图的创建
create or replace view viewname as select * from tablename;
上面的程序代码就是将tablabname中的所有字段和字段中的信息记录选择作为视图表,也就是所谓的虚表。
3.查询数据库中的虚表有哪些
show table status where commment='view';
4.对于视图的查、改、删、增以及视图表的删除都是和数据库中实表的操作是一样的。
这里是对视图、实表以及查询表的详细描述