一、SQL
SQL:Structure Query Language:结构化查询语言
专门用在操作关系型数据库的语言
任何关系型数据库都支持SQL,但是每门数据库都有细微的差别
SQL语句分类:
DDL(*)(Data Definition Language):数据定义语言,用来定义数据库对象:库、表、列等;
DML()(Data Manipulation Language):数据操作语言,用来定义数据库记录(数据);增删改
DCL(Data Control Language):数据控制语言,用来定义访问权限和安全级别;
DQL(*)(Data Query Language):数据查询语言,用来查询记录(数据)。查询(select)
注意:SQL语句必须以;结尾
** MySQL数据类型:
INT
数字类型(4个字节)
SMALLINT
数字(2个字节)
BIGINT
数字(4个字节)
DATE
日期
TIME
时间
DATETIME
日期时间
VARCHAR
(长度) 字符串
TEXT
文本
BLOB
二进制
FLOAT
浮点型
DOUBLE
双精度
二、SQL语句
sql语句不区分大小写
2.1DDL数据定义语句
包含的关键字:
2.1 CREATE
:新建
可以新建数据库、表
2.1.1创建数据库格式:
CREATE database [ if NOT EXISTS] 名称 [CHARACTER SET 编码格式] [COLLATE 比较方式];
创建一个编码格式为utf8的数据库
create database db_study01 ;//默认编码格式
create database db_study02 character set utf8 collate utf8_general_ci;//创建数据库编码格式utf8比
较方式对应的
2.1.2创建表的格式:
CREATE table [ if NOT EXISTS] 名称 (字段名称 数据类型,……) [CHARACTER SET 编码格式] [COLLATE 比较方式];
创建一张user表
create table user (id int,name varchar(20),age int);
2.2ALTER
:修改
可以修改数据库的编码和表的字段
7.2.1修改数据库格式:ALTER database 名称 [character set 编码][cllate 比较格式];
修改数据库mydb2的编码格式为gbk
alter database mydb2 character set utf-8;
2.2.2修改数据库表的格式:
ALTER table 名称 [ADD|CHANGE|DROP|MODIFY] 字段名称 [新名称] [数据类型]
为user表新增一个字段password 字符串32
alter table user add password varchar(32);
alter table user add test varchar(32);
为user表中的name字段重命名为username
alter table user change name username varchar(20);
删除user表中的test字段
alter table user drop test;
修改user表中username字段的长度为30
alter table user modify username varchar(30);
修改user的表名为user1
rename table user to user1;
2.3DROP
删除
可以删除数据库或表
2.3.1删除数据库格式:
DROP database [ if EXISTS] 名称;
2.3.2删除数据表格式:
DROP table 名称;
删除数据库mydb4
drop database if exists mydb4;
删除test3表
drop table if exists test3;
DML语句:主要是对表中的数据进行新增、修改、删除操作
2.4INSERT
新增语句
格式:INSERT INTO 表名[(字段名称)] values(值1,值2);
为user表新增数据
insert into user (id,username,password) values(2,'贾金山','8888');
insert into user (id,username,password,flag) values(5,'战旗','838',1);
insert into user (id,username,password,flag) values(6,'战旗','838',1);
insert into user (id,username,password,flag) values(7,'战旗','838',1);
insert into user (id,username,password,flag) values(8,'战旗','838',1);
//简写形式
insert into user values(4,'曹怡',"123456");
insert into user(username,id,password) values('王星',5,"123");
2.5UPDATE
修改语句
格式:UPDATE 表名 SET 字段名称=值[多个字段] [where 条件]
修改id为2的用户名字为金星
update user set username='金星' where id=2;
修改id为3的用户的名字和密码
update user set username='网警',password="654321" where id=3;
修改user中所有的密码为123456
update user set password='123456';
2.6DELETE
删除语句
删除表中的数据
格式:DELETE FROM 表名 [where 条件];
删除user中名称为王星的人
delete from user where username='王星';
开发中的删除:
1、真删除
直接使用delete语句删除指定的数据
2、假删除
使用update 修该指定字段
为user表新增一字段,flag标记是否有效,0有效1删除
alter table user add flag int;
update user set flag=0;
select * from user where flag=0;
update user set flag=1 where id=4;
DQL语句:数据查询语句,关键字:select
2.7SELECT
查询语句
主要用来查询数据
格式:SELECT *|字段名称|函数 from 表名 [where 条件] [order by 字段名称] [group by 字段名称][having 条件][limit 限制]
2.7.1
*在查询语句中表示当前表的所有字段(顺序为建表时字段顺序)
2.7.2where条件:
常用的条件符合:
1、=、<、>、!=、<>、<=、>=
2、and
:并且,同时满足
3、or
:或者,满足其一
4、in
(值,……):对应的字段的值再()里,一般不连续的多个值
5、between A and B
:在A和B之间,[A,B]
6、IS NULL
:为空
7、NOT
:不
8、子查询
查询user表中所有信息
select * from user;
等价于
select id,username,password,flag from user;
查询有效的名字
select username from user where flag=0;
查询id大于1小于6的人
select * from user where id<6 and id>1;
等价
select * from user where id between 2 and 5;
查询id为4或者id为8
select * from user where id=4 or id=8;
查询id不为6的人
select * from user where id!=6;
等价
select * from user where id<>6;
查询id为2或5或6的人
select * from user where id=2 or id=5 or id=6;
等价
select * from user where id in (2,5,6);
2.8 show语句
查看当前的所有数据库:
show databases;
查看指定数据库的创建语句
show create database 数据库名称;
查看数据库的编码格式
show variables like 'character%';
查看mySQL的支持的编码
show character set;
查看对应编码的比较集
show collation;
查看数据库的所有表名
show tables;
查看数据库中建表语句
show create table 表名;
三、where 条件:
=<><>!=>=
or:或者
and:并且
between A and B:在A和B之间
in (值):在……内部
is null:为null
not:不
select的标准格式:select *|字段列表|聚合函数 from 表名 [where 条件] [group by 字段] [having 字段][order by 字段 ASC|DESC][limit 起始索引,数量]]
四、模糊查询
like
:模糊查询的关键字
_:1个字符
%:任意个字符
1.1以XX开头
格式:select *|字段 from 表名 where 字段 like 'XX%';
查询商品表中名字以华为开头的
select * from goods where name like '华为%';
查询商品表中名字以华为开头的且后面就一个字符的商品
select * from goods where name like '华为_' ;
1.2以XX结尾
格式:select *|字段 from 表名 where 字段 like '%XX';
查询商品表中价格以9结尾的
select * from goods where price like '%9';
查询商品表中价格为三位数且以9结尾
select * from goods where price like '__9';
等价于
select * from goods where price like '%9' and price >99 and price <1000;
1.3包含XX
格式:select *|字段 from 表名 where 字段 like '%XX%';
查询商品表中名字包含o的商品
select * from goods where name like ‘%o%’;
五、字段控制查询
1查询结果去重
distinct
:对查询结果去重
//查询goods表中所有数据并去除重复的
select DISTINCT * from goods;
2对null值转换
ifnull
(字段名称 , 待转换的值):标记某个字段为null的话转换为指定的数据参与运算
查询goods表中id和price的和
select id+price from goods;
null值和任何类型的数据运算结果都是null
select id+ifnull(price,10000) from goods;
3别名
可以为运算的结果起别名: as
别名
也可以为表起别名,as
可以省略
查询goods表中id和价格的和,要求价格为null则作为10000处理
select id+ifnull(price,10000) as total from goods;
等价于
select id+ifnull(price,10000) total from goods;
查询goods表名价格小于100的商品
select * from goods where price <100;
等价于
select * from goods where goods.price <100;
等价于
select * from goods g where g.price <100;
六、排序
order by
字段 排序方式,……
排序方式:ASC
:升序(默认排序),DESC
:降序
查询goods表中按照价格升序排列
select * from goods order by price;
等价于
select * from goods order by price ASC;
查询goods表中按照价格降序排列
select * from goods order by price DESC;
查询goods表中按照价格降序排列,如果价格相同按照id进行升序排列
select * from goods order by price DESC, id asc;
七、聚合函数
COUNT
:计数,计算指定列不为null的数量
MAX
:计算指定列的最大值
MIN
:计算指定列的最小值
SUM
:计算指定列的总和
AVG
:计算指定列的平均值
查询goods表中的数据的数量
//查询goods表中price不为null的数据行
select count(price) from goods;
//查询goods表中id不为null的数据行
select count(id) from goods;
//查询goods表中的数据行
select count(1) from goods;
查询goods表中所有price的总和
select sum(price) from goods;
查询goods表中价格最高和和最低的商品
select MAX(price) maxp,min(price) minp from goods;
查询goods表中的评价价格
select avg(price) from goods;
八、分组
group by 字段名称 [having 条件]
查询学生表中男女的数量
select sex,count(no) from student group by sex;
查询学生表中男女的平均年龄
select sex,avg(age) from student group by sex;
查询每个年龄的学生的数量
select age,count(no) from student group by age;
查询学生表中每个年龄的人数并且,人数等于的1
select age,count(no) ct from student group by age having ct=1;
where和having的区别
where
:用在表名后,进行条件的筛选,主要用在分组前
having
:用在group by
之后,主要对分组的数据进行筛选
九、limit分页
格式:limit 行索引,数量:从指定的行索引开始查询,查询指定的数量
查询学生表中前三条数据
select * from student limit 0,3;
查询学生表中第三条到底五条的学生
select * from student order by no limit 2,3;
分页:每页显示2条数据,请查询第三页的数据
select * from student order by no limit 4,2;
//分页算法
int count=2;int page=3;
select * from student order by no limit (page-1)*count,count;
查询的顺序:from-->where--->group by --->having--->order by --->limit
十、数据完整性
约束条件:
主键、唯一约束、自增、不为null、默认值、外键等
10.1主键:唯一标记,不可为null,不能重复
任何表必须有主键
添加主键的方式:
1、create table (字段 primary key)
2、create table (字段,primary key(字段名称,字段名称))
3、alter table 表名 add primary key(字段名称);
//delete from student where no =(select no from student limit 5,1);
delete from student where no=17000506;
//添加主键为no
alter table student add primary key(no);
create table grade(id int,name varchar(20),primary key(id));
10.2unique
:唯一约束 ,不能重复,可以为null(多个)
create table test1(id int unique );
10.3auto_increment
:自动增长,每次递增1,一般主键使用
create table test2(id int primary key auto_increment,msg varchar(20) unique);
10.4not null
:不为null
create table test3(id int not null);
10.5default
:默认值
create table test4(id int primary key auto_increment,psw varchar(6) not null default '123456');
insert into test4(psw) values(default);
insert into test4(psw) values(null);
10.6FOREIGN KEY
:外键
外键:一个表中的某个字段的值必须为另张表中的主键的值,这时我们可以使用外键约束
作用:当新增数据时,如果当前的外键的值在另张表的主键的值不存在,就报错
CONSTRAINT
外键名称(外键表中的名称) foreign key(当前表中的外键) references 另张表名称(主键名称)
外键的添加方式:
1、create table 表名(字段,外键,CONSTRAINT 外键名称(外键表中的名称) foreign key(当前表中的外键) references 另张表名称(主键名称));
2、ALTER TABLE
表名ADD CONSTRAINT
外键名称FOREIGN KEY
(当前表中的外键) REFERENCES
另张表名称(主键名称));
create table student (sid int primary key auto_increment,name varchar(20),
十一、多表关系:
8.1一对一
2表数据一一对应
8.2一对多
2表数据,存在一对多
8.3多对多
2表数据,存在多对多的关系
九、三大范式
阐述如何创建表并定义之间联系
9.1第一大范式:
确定列的原子性
就是每列的内容各不相同,要划分为最小单元
9.2第二大范式
确保有主键
主要用于区分每条数据,并定位
9.3第三大范式
表与表之间通过主键关联
主键唯一
功能单一原则:表描述的或存储的数据单一
关联通过主键
十二、多表查询
主要用来查询多张表
1、合并结果集
UNION
:合并2个查询的结果,要求2个查询的列的个数和列的数据类型必须相同,会消除重复的数据
UNION ALL
:合并2个查询的结果,要求2个查询的列的个数和列的数据类型必须相同,不会消除重复的数据
2、内部连接查询
inner join on
:内部连接
格式:select * from 表1 inner join 表2 on 表1字段=表2字段
查询2个表的数据,内部连接的形式
select * from mytest1 inner join mytest2 on mytest1.id=mytest2.id2;
3、外部连接查询
左外联:left outer join on
格式:select * from 表1 left join 表2 on 表1字段=表2字段
左联就是表1为主表,表一数据都有,表2有就显示,没有就是显示为null
右外联:right outer join on
格式:select * from 表1 left join 表2 on 表1字段=表2字段
右联就是表2为主表,表二数据都有,表1有就显示,没有就显示为null
4、连接查询
查询2个表中所有数据的组合结果
select * from mytest1,mytest2;
产生的结果集:笛卡尔积
结果的数量:表1的数量*表2的数量
十三、杂谈
1、索引:
提高查询的效率
通过索引快速进行查询,速度会提高
1.1创建索引
CREATE INDEX indexName ON mytable(username(length));
如果是CHAR,VARCHAR类型,length可以小于字段实际长度;如果是BLOB和TEXT类型,必须指定 length。
1.2创建唯一索引
CREATE UNIQUE INDEX indexName ON mytable(username(length))
1.3修改索引(添加索引)
ALTER table tableName ADD INDEX indexName(columnName)
2、视图:
为比较复杂的结果集创建一个虚拟的表
格式:create view 名称 as select * from 表名;
CREATE VIEW 视图名(列1,列2...) AS SELECT (列1,列2...) FROM ...;
修改视图
CREATE OR REPLACE VIEW 视图名 AS SELECT [...] FROM [...];
查看已有视图
SHOW TABLES [like...];(可以使用模糊查找)
3、触发器:
一张表操作时,会对另外的表页进行操作
格式:delimiter $修改当前的结束符为$(默认的结束;)
创建触发器
create trigger 触发器名称
before|after insert|delete|update
on 表A for each row
begin
要执行的sql语句
insert into 表B(列1, 列2, ...) VALUES(NEW.列1, NEW.列2, ...);
end
删除指定的触发器:
DROP trigger T_TRIGGER_UPDATE
4、快速备份新表
create table 新表名称 select * from 旧表
其他数据库:
select * into 新表名 from 旧表;但是MySQL不支持
MySQL:
数据库重点内容:
一、七大SQL语句
1、CREATE
2、ALTER
3、DROP
4、INSERT
5、UPDATE
6、DELETE
7、SELECT
where\group by \having\order by \limit
二、约束条件
主键、唯一、非null、default、自增、外键
三、多表查询:
内联、外联、合并
四、聚合函数
AVG\MAX\MIN\SUM\COUNT
根据个人情况进行记忆:
1、内置函数
now\rand\floor\substring\ifnull
2、索引
索引提高操作数据库的效率
3、触发器
为某张表加自动操作
数据库的备份和恢复
3.1数据的备份
在cmd中,输入:mysqldump -u 用户名 -p 要备份的数据库 >路径/文件名称.sql
3.2数据的恢复
需要进入到Mysql
创建数据库
并使用数据库
source 要恢复的sql文件的路径;