MySQL数据库学习总结
——1、数据库概述
1、MySQL数据库属于一种开源的关系型数据库,属于Oracle公司;
2、MySQL数据库的登录与退出
(1)MySQL可以在命令行工具shell的方式登录(MySQL自带命令行工具和cmd(mysql -h 127.0.0.1 -u root -p 然后输入密码)均可登录)
(2)MySQL的退出:exit;quit;q;三种推出的方式
3、MySQL修改提示符:MySQL默认的提示符为mysql>,可以通过prompt 所修改提示符来进行修改
4、MySQL数据库语句语法:
(1)关键字和函数大写;
(2)其他一般小写;
(3)语句以分号结尾
5、常见的数据库语句:
(1)创建数据库:create database test;(全语句:CREATE DATABASE IF NOT EXISTS t2 CHARACTER SET gbk;)
(2)查看当前的数据库:show databases;
(3)修改数据库:ALTER DATABASE T2 CHARACTER SET utf8;(数据库修改编码方式)
(4)删除数据库:DROP DATABASE IF EXISTS T1;
(5)超级用户:root;默认的端口号:3306
——2、数据库的数据类型和数据表操作
1、MySQL的数据类型主要有:整型int、浮点型float、字符串型和时间日期型
2、MySQL字符串类型的数据中ENUM("value1","value2"...)用来选择其中一个,而SET("value1","value2"...)用来选择其中数字的排列组合,更多,并非一个
3、数据表的行称为记录,而列称之为字段
4、USE是用来打开数据库的操作方法:USE DATABASE名称,之后可以使用SELECT DATABASE();来进行查看我们打开的数据库是否为我们需打开的数据库
5、创建一个数据表,里面的细节列名称和数据类型(unsigned是指无符号位,从0开始):
mysql> CREATE TABLE tb1(
-> username varchar(20),
-> age tinyint unsigned,
-> salary float(8,2) unsigned
-> );
Query OK, 0 rows affected (0.04 sec)
6、查看数据表格:show tables;(查看当前数据库里面包含的数据表);show tables from database-1;(查看database-1数据库里面包含的数据表)
7、查看当前所处的数据库:select database();
8、查看数据表的结构,即展示数据表格的列属性组成:show columns from tablename;
9、数据表格记录的插入与查找:
(1)插入:两种方式:全部插入与部分插入
insert tb1 values("TOM","25","257863.25",...);
insert tb1(username,salary) values("JONE","2304050.21")
(2)查找:
select * from tablename #展示整个表格的内容
10、数据表字段特征的属性定义:NULL 字段值可以为空,NOT NULL 字符段禁止为空
create table tb2(username varchar(20) not null,age tinyint null);
11、为了防止记录的重复性,主键约束primary key和auto_increment自动编码方式,主键可以保证不可以出现重复的值,并且一个数据表只能拥有一个主键,属性为not null
12、自动编号auto_increment必须和逐主键约束primary key一起使用,但是主键约束不一定和自动编号使用
(1)CREATE TABLE tb3(id smallint unsigned auto_increment primary key,username varchar(20) not null);
(2)CREATE TABLE tb4(id smallint unsigned primary key,username varchar(20) not null);
13、唯一约束unique key :可以保证记录的唯一性,和主键约束类似,不过二者也有区别:
(1)一个数据表可以包含多个唯一约束,但是只能拥有一个主键约束;
(2)唯一约束可以为空null,主键约束不可以为空为not null;
(3)二者创建索引的方式也不一样
14、默认约束default:在写入记录时,如果没有明确的字段,系统赋值默认值
create table tb6(
-> id smallint unsigned auto_increment primary key,
-> username varchar(20) not null unique key,
-> sex ENUM("boy","girl","no") default "no");
15、对于无符号数的字段,在属性规定时需要加上unsigned
——3、数据库的约束和相关操作(列操作)
1、show create table province;可以用来展示新创建表格的引擎类型和基本信息内容
2、外键约束主要是为了建立起来父表和子表之间的关系,必须为innoDB的存储引擎,主要有唯一约束,主键约束,外键约束,not null等
3、另外对于父表和子表之间的参照列必须具有相似的属性(数字则相同,字符串则相似),具有外键约束的是字表,参照的父表
4、外键列和参照列必须创建索引,如果不创建,MySQL将要自动创建
5、显示数据表的索引语句:show indexes from tablenameG(表格形式展示)
6、外键约束的参照操作:CASCADE、SET NULL、RESTRIC、NO ACTION等
create table users1(
-> id smallint unsigned primary key auto_increment,
-> username varchar(10) not null,
-> pid smallint unsigned,
-> foreign key(pid) references province(id) on delete cascade);
7、外键约束在操作数目的多少角度上可以划分为列级约束(1个列)和表级约束(多个列)
8、not null 和default约束不存在表级约束,唯一,主键和外键约束既有表及约束,也有列级约束
9、数据表添加列操作语句
alter table users1 add age tinyint unsigned not null default 10;(默认往最后添加)
alter table users1 add password varchar(30) not null after username;(after在某一列之后添加)
alter table users1 add truename varchar(10) not null first;(first在数据表第一列添加)
10、添加多列不能指定添加的位置,只可以添加子最后面
11、数据表删除列语句:
alter table users1 drop truename;(单列删除)
alter table users1 drop id,drop age;(多列删除)
12、添加约束:
alter table users2 add constraint pk_users2_id primary key (id);添加主键约束
alter table users2 add unique(username);添加唯一约束
alter table users2 add foreign key(pid) references province(id);添加外键约束
alter table users2 alter age set default 15;添加默认约束
alter table users2 alter age drop default;删除默认约束
13、删除约束:
alter table users2 drop primary key;删除主键约束
alter table users2 drop index username;删除唯一约束
alter table users2 drop foreign key users2_ibfk_1;删除外键约束使用约束名称即可
alter table users2 drop index pid;删除外键约束需要注意还要删除索引
14、修改列定义(change和modify均可,change更加全面)
(1)修改列的位置前后-modify
alter table users2 modify id smallint unsigned not null first;把某一列放在前面
alter table users2 modify id smallint unsigned not null after username;把某一列放在username列之后
(2)修改列的属性定义,数据类型等-modify
alter table users2 modify id tinyint unsigned not null first;修改列属性定义,数据类型等,从大类型到小类型注意一定要防止数据丢失
(3)修改列名称-change
alter table users2 change pid p_id tinyint unsigned not null;
15.修改数据表的名称:
(1)alter table users2 rename users3;
(2)rename table users3 to users2;
——4、数据表的记录操作(行操作)
1、insert插入操作
(1)第一种方法 insert values方法
insert user values(NULL,"john","456",45,"0");插入时,需要注意对于默认的字段或者自动编码的字段可以输入null或者default均可
insert user values(default,"mary","4yjy6",15,1);
insert user values(default,"my","4y6",default,1);对于默认值的字段,可以直接输入default设置为默认值
insert user values(default,"my","4y6",default,1),(null,"yanjd",md5("123"),default,1);插入多个纪录语句,md5是指输出某一个字段的哈希
insert tb1(username,salary) values("JONE","2304050.21");部分值插入
(2)第二种方式 insert set 方法
insert user set username="ben",passward="456",age=12,sex=1;
(3)第三种方法 insert select语句
通过查询的结果写入数据表
2、updata数据表的更新-单表操作
update user set age=age+5;直接更新某一列的值
update user set age=age-id,sex=0;直接更新多列的值
update user set age=age+10 where id%2=0;条件更新语句
3、delete删除操作-单表操作
delete from user where id=6;删除id=6这个记录,即整行删除
4、查询表达式select语句
select id,username from user;查找数据表中的某几列数据
select * from user;查找所有的列数据
select user.id,user.username from user;区别多个数据表中相同的字段列数据
select id as userid,username as uname from user;可以修改输出字段名称
5、where语句进行条件的判断
delete from user where password="22";
6、groupby函数主要对查询结果进行分组(默认进行升序)
select sex from user group by sex(列名);
select age from user group by age desc;(降序排列)
7、having语句哟关于条件的指定
select sex from user group by sex having count(id)>2;聚合函数不需要在前面select
select sex,age from user group by age having age>30;普通情况需要在前面指定查找
8、order by函数用于对于查询结果进行排序操作(asc/desc升降序,默认asc升序)
select * from user order by id;默认按照id升序排列
select * from user order by id desc;按照id降序排列
select * from user order by age,id desc;按照age升排列age相同时按照id降序排列
9、limit语句限制返回结果(抽取某一些行操作)
select * from user limit 2; 取前两行数据
select * from user limit 2,2 取第三行开始的后两行数据
select * from user order by id desc limit 2,2; 按照id降序排列之后进行取第三行之后的2行数据
10、字表插入语句insert select语句
insert test(username) select username from user where age>=10;
在test表格的username中插入从user表中查到的age>=10的记录的username
——5、MySQL子查询与连接
1、set names gbk: 设置客户端的显示形式为gbk(如果之前设置是utf-8编码则显示出来文字不能识别)
2、子查询指嵌套在查询内部,必须在圆括号里使用,返回值是一个标量、一行也开始是一个数据表
3、子查询是指在另一个查询里面的select子句
4、在进行数据表的写入时,默认是不允许写入汉字的,因此需要修改一下编码格式:
show full columns from phplamp; 检查数据表所有字段的状态
alter table phplamp change address address varchar(100) character set utf8 collate utf8_unicode_ci not null; 修改为utf8编码格式
set names gbk;将客户端修改为gbk来显示数据字段
5、子查询语句:
select avg(goods_price)from tdb_goods;求取某一列的平均值
select round(avg(goods_price),2) from tdb_goods;求取某一列的平均值,保留两位小数
select goods_id,goods_name,goods_price from tdb_goods where goods_price>=5636.36;查找价格大于平均值的商品的id,name和price
select goods_id,goods_name,goods_price from tdb_goods where goods_price>=(select round(avg(goods_price),2) from tdb_goods);子查询方式
select goods_price from tdb_goods where goods_cate="超级本"; 选择输出超极本笔记本的价格
select * from tdb_goods where goods_cate="超级本"G;列显示超极本笔记本的基本信息
6、一些子查询关键字any/some/all/not in/in/
select goods_id,goods_name,goods_price from tdb_goods where goods_price>=any(select goods_price from tdb_goods where goods_cate="超级本");如果子查询返回并非一列多个值时需要添加any,all,some
select goods_id,goods_name,goods_price from tdb_goods where goods_price=any/some(select goods_price from tdb_goods where goods_cate="超级本");大于等于,小于等于可以使用any和all,但是等于只可以用some/any
select goods_id,goods_name,goods_price from tdb_goods where goods_price not in(select goods_price from tdb_goods where goods_cate="超级本")G;not in和!=all是等效的
select goods_cate from tdb_goods group by goods_cate;使用group by函数进行结果的分类统计
insert tdb_goods_cate(cate_name) select goods_cate from tdb_goods group by goods_cate; insert-select语句查询
7、多表更新函数
多步更新:
update tdb_goods inner join tdb_goods_cate on goods_cate=cate_name set goods_cate =cate_id; 内连接更新方式,多步更新—创键表-通过insert-select写入记录-表的更新
一步更新方式:crested select函数:
create table tdb_goods_band(
-> band_id smallint unsigned primary key auto_increment,
-> brand_name varchar(50)character set utf8 collate utf8_unicode_ci not null) 编码方式为utf8汉字可输入型
-> select brand_name from tdb_goods group by brand_name;
更新结束之后我们需要将数据列的名称和属性一起修改:
alter table tdb_goods
-> change goods_cate cate_id smallint unsigned not null,
-> change brand_name brand_id smallint unsigned not null;
将字符型修改为数字型,缩小占用空间
8、多表连接
内连接:只显示两个表符合连接条件的记录
select goods_id,goods_name,cate_name from tdb_goods inner join tdb_goods_cate on tdb_goods.cate_id=tdb_goods_cate.cate_id;
左外连接:显示左边全部记录以及右边符合条件的记录
select goods_id,goods_name,cate_name from tdb_goods left join tdb_goods_cate on tdb_goods.cate_id=tdb_goods_cate.cate_id;
右外连接:连接右表的全部记录以及左表符合条件的记录
select goods_id,goods_name,cate_name from tdb_goods right join tdb_goods_cate on tdb_goods.cate_id=tdb_goods_cate.cate_id;
多个表之间的连接(和两个表连接是相似的)
select goods_id,goods_name,cate_name,brand_name,goods_price from tdb_goods as g inner join tdb_goods_cate as c on g.cate_id=c.cate_id inner join tdb_goods_band as b on g.brand_id=b.band_id;
9、无线级分类表的设计(子结构连接)
CREATE TABLE tdb_goods_types(
type_id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
type_name VARCHAR(20) character set utf8 collate utf8_unicode_ci not null,
parent_id SMALLINT UNSIGNED NOT NULL DEFAULT 0
);
自身连接方式-相互嵌套
select s.type_id,s.type_name,count(p.type_name) from tdb_goods_types as s left join tdb_goods_types as p on s.parent_id=p.type_id;左表为子表
select p.type_id,p.type_name,count(s.type_name) from tdb_goods_types as p left join tdb_goods_types as s on s.parent_id=p.type_id group by p.type_name order by p.type_id;右表为父表
10、多表删除
(1)记录重复合并操作:
select goods_id,goods_name from tdb_goods group by goods_name; 以goods_name作为重复合并的字段
(2)多表删除-对照删除
delete t1 from tdb_goods as t1 left join (select goods_id,goods_name from tdb_goods group by goods_name having count(goods_name)>=2) as t2 on t1.goods_name=t2.goods_name where t1.goods_id>t2.goods_id;
——6、数据库运算符和函数
1、字符函数:
(1)concat:字符连接
select concat("mysql","imooc");
+-------------------------+
| concat("mysql","imooc") |
+-------------------------+
| mysqlimooc |
+-------------------------+
(2)concat_ws()函数
select concat_ws("|","mysql","imooc");
+--------------------------------+
| concat_ws("|","mysql","imooc") |
+--------------------------------+
| mysql|imooc |
+--------------------------------+
(3)format函数:数字格式化函数
select format(1256.452,2);
+--------------------+
| format(1256.452,2) |
+--------------------+
| 1,256.45 |
+--------------------+
(4)lower(字母)函数:字母小写化;upper(字母):字母大写
(5)left("mysql",2)和right()函数:获取左侧2位字符和和右侧字符
(6)length()函数:获取字符串的长度
(7)select ltrim/rtrim/trim(" mysql "):删除字符串前面/右面/前后都删的空格
+--------------------+
| ltrim(" mysql ") |
+--------------------+
| mysql |
+--------------------+
(8)trim()函数其他功能:
select trim(leading "?" from "??mysql??");删除前面的问号)
select trim(trailing "?" from "??mysql??");删除后面的问号
select trim(both "?" from "??mysql??");删除前后的所有的问号
+-------------------------------------+
| trim(trailing "?" from "??mysql??") |
+-------------------------------------+
| ??mysql |
+-------------------------------------+
(9)select replace("??mys??ql??","?","");替换函数
+-------------------------------+
| replace("??mys??ql??","?","") |
+-------------------------------+
| mysql |
+-------------------------------+
(10)select substring("mysql",2,1);字符截取函数:从第2位截取,截取1位
+------------------------+
| substring("mysql",2,1) |
+------------------------+
| y |
+------------------------+
(11)not like/like 函数:模式匹配函数:%代表任意一个字符,_代表任意一个字符
如果要匹配一个字符中是否含有某一个字母可用:
select * from test where first_name like "%o%":找到含有o字母的记录
如果是找含有%时需要注意,比较特殊:
select * from test where first_name like "%1%%" escape "1";
2、数值运算符函数
(1)+-x/等四则运算函数
(2)ceil(23.2):进1取整
(3)floor(23.2):舍一取整
(4)3 div 4:整数除法
(5)5 mod 3取余数
(6) select power(2,10)幂运算
(7)round(3.25)四舍五入函数
(8)select truncate(125.89,2);数字截取函数,截取到小数点后2位
3、比较运算符和函数
(1) select 15 between 1 and 20;数字15在1和20之间吗?
(2) select 10 in(5,10,15,20);查看10是否在这个括号里面
(3) select 0 is null;查看0是否为空
4、日期时间函数:
(1)select now();展示当前时间
(2)select curdate 展示当前日期
(3)select curtime 展示当前时间
(4)select dataadd 展示时间的增加和减少
select date_add("2014-3-12",interval 365 day);在2014年3月12日增加365天
select date_add("2014-3-12",interval 5 month)在2014年3月12日增加5个月
(5)select datediff("2013-3-12","2017-2-23");查询两个日期相差几天()
(6)select date_format("2014-3-12","%m/%d/%Y");进行日期格式的转换
+-------------------------------------+
| date_format("2014-3-12","%m/%d/%Y") |
+-------------------------------------+
| 03/12/2014 |
+-------------------------------------+
5、信息函数:
(1)select connection_id();返回连接ID
(2)select database();返回当前数据库;
(3)select user();返回当前用户
+----------------+
| user() |
+----------------+
| root@localhost |
+----------------+
(4) select version();返回当前的版本
+------------+
| version() |
+------------+
| 5.6.47-log |
+------------+
(5)select last_insert_id()返回最后写入的记录号,多条写入时只输出第一个写入记录时的id
6、聚合函数
(1)select AVG(id)from test 求其id平均值
(2)select count(id)form test 求取id的数目
(3)max()最大值
(4)min()最小值
(5)sum()求和函数
7、加密函数
MD5:加密函数-为web页面做准备
select md5("admin");
+----------------------------------+
| md5("admin") |
+----------------------------------+
| 21232f297a57a5a743894a0e4a801fc3 |
+----------------------------------+
password:密码计算函数:修改密码set password=password("yjy2020")
select password("admin");
+-------------------------------------------+
| password("admin") |
+-------------------------------------------+
| *4ACFE3202A5FF5CF467898FC58AAB1D615029441 |
+-------------------------------------------+
——7、自定义函数
1、自定义函数不一定含有参数,但是一定含有返回值
2、MySQL函数的参数不能超过1024个参数
3、调整时间格式:select date_format(now(),"%Y年%m月%d日 %H点%i分%s秒");
+-------------------------------------------------+
| date_format(now(),"%Y年%m月%d日 %H点%i分%s秒") |
+-------------------------------------------------+
| 2020年04月03日 11点31分54秒 |
+-------------------------------------------------+
4、创建时间格式转换函数,不含有参数:
create function f1() returns varchar(30) character set utf8 collate utf8_unicode_ci
-> return date_format(now(),"%Y年%m月%d日 %H点%i分%s秒");
调用这个函数:
select f2();
+------------------------------+
| f2() |
+------------------------------+
| 2020年04月03日 11点36分39秒 |
+------------------------------+
5、创建带有参数的自定义函数
create function f3(num1 smallint unsigned,num2 smallint unsigned)
-> returns float(10,2) unsigned
-> return (num1+num2)/2;
调用这个函数
select f3(21,21)
6、创建具有复合结构函数体的自定义函数
结尾标志修改:delimiter//将结尾标志符号改为//
创建复合型带参数的自定义函数
delimiter//
create function adduser(username varchar(20))
-> returns int unsigned
-> begin
-> insert test(username)values (username);
-> return last_insert_id();
-> end
-> //
——8、MySQL存储过程
1、MySQL执行语句过程:SQL语句—>MySQL引擎—>语法分析—>编译为可识别命令—>执行命令—>输出返回值—>客户端
2、存储过程是一种预编译,将结果存储在内存中,只有在第一次时会分析和执行,在之后直接调用相应的结果即可,效率更快,并且可以返回多个值
3、存储过程的优点:
(1)增强了SQL语句的功能和灵活性
(2)实现较快的执行速度
(3)减少网络流量
4、创建不带参数的存储过程:
create procedure sp1() select version();
call sp1;调用存储过程(不带参数)
call sp1();调用存储过程(不带参数)
+------------+
| version() |
+------------+
| 5.6.47-log |
+------------+
5、创建带有in类型参数的存储过程,不没有返回过程:
create procedure removeuserbyid(in id int unsigned)
-> begin
-> delete from user where id=id;注意id传入参数和表中字段不能相同,不然将删除所有记录,而非本来id记录
-> end
-> //
以上方式不正确,下面是正确方式
delimiter //
create procedure remove(in id1 int unsigned)
-> begin
-> delete from test1 where id=id1;
-> end
-> //
call remove(2) 删除id为2的记录
6、创建带有in和out的存储过程,带返回变量,其中返回变量可以使用用@num可以表示
delimiter //
create procedure remove1(in pid int unsigned,out usernum int unsigned)
-> begin
-> delete from test1 where id =pid;
-> select count(id) from test1 into usernum;
-> end
-> //
删除id记录之后,返回剩余数据表记录总数
call remove1(2,@nums)//
select @nums
7、begin end 之间的变量属于局部变量,而set @i=7称之为用户变量
8、select row_count();是指输出影响的记录数
9、创建多个out参数的存储过程
delimi//
create procedure remove2(in age1 smallint unsigned ,out deletenum smallint unsigned ,out usercounts smallint unsigned)
-> begin
-> delete from test1 where age=age1;
-> select row_count() into deletenum;
-> select count(id) from test1 into usercounts;
-> end
-> //
call remove2(22,@i,@j)// 调用存储过程
select @i,@j// 输出多个out返回值
10、存储过程和自定义函数的区别
(1)存储过程功能更加复杂一些,而函数针对性更强
(2)存储过程可以返回多个值,而函数只可以有一个返回值
(3)存储过程一般独立来执行,而函数可以作为其他SQL语句组成部分来出现
11、存储过程修改不了过程体,如要修改,则先删除再重新创建
——9、存储引擎简介
1、查看一个数据表的存储引擎一般使用show create table test来进行查看,里面显示出来ENGINE=InnoDB,表明其存储引擎是InnoDB
2、MySQL将数据以不同的技术将数据存储在文件或者内存中,这种技术称之为存储引擎
3、MySQL支持的存储引擎主要有以下五种:MyISAM/InnoDB/Memory/CSV/Archive
4、处理方式1:并发控制处理:共享锁(读操作)和排他锁(写操作)
5、锁颗粒:表锁(开销最小锁策略)和行锁(开销最大锁策略)
6、处理方式2:事务:事务用于保证数据库的完整性
事务的特性:原子性、一致性、隔离性和持久性
7、索引和外键均可保证数据的相关性、一致性和特性性
8、不同存储引擎的特点是不一样的
9、InnoDB存储引擎存储限制为64TB,支持事务安全和索引,支持行锁和外键,不支持数据压缩
10、CSV不支持索引,是一种文本形式的存储方式,黑洞引擎一般写入的数据会消逝,一般用于数据复制过程中的中继
11、一般使用最多的是InnoDB(适用于事务处理较多和使用外键的情况)和MyISAM引擎(适用于事务处理不多的情况)
12、设置存储引擎的方法:
(1) 创建数据表的时候设置引擎方式:
create table t1(
-> sa varchar(20))
-> ENGINE=MyISAM;
(2)在MySQ配置文件里面修改
(3)修改存储引擎方法:
alter table t1 engine=innodb;
——10、MySQL图形化管理方式
1、MySQL的图像化管理方式主要有以下几种:MySQL workbench CE、Navicat以及PHPMyadmin
2、最常见的最常用的还是Navicat for MySQL的图形管理方式