MySQL环境检测及装置
1、检测本机上的mysql环境是否OK
关上cmd,输出:mysql -uroot -proot1)如果回车后显示:Welcome to the MariaDB/mysql...示意本机上曾经装置了mysql 并且也配置了环境变量。(不必再装置以及任何配置)2)如果回车后显示:mysql不是外部或外部命令,也不是可执行程序...,起因可能是: a)可能是电脑上装置了mysql,只是没有配制环境变量 (仅需配置环境变量!) b)也能够是电脑上既没有装置mysql,也没有配置环境变量 (需先装置,再配置环境变量)3)如何判断,本机是否装置了mysql? 因为mysql默认装置地位是: C:/Program Files/MariaDB 10.3 C:/Program Files/mysql C:/Program Files/mysql5.5 C:/Program Files/mysql5.7 ... 如果有,点进去查看目录构造是否残缺4)如果曾经装置,只须要配置环境变量即可5)如果没有装置,先装置mysql,再配置环境变量
2、装置mysql软件
mariadb10.37版本
3、配置mysql环境变量
将mysql的装置目录下的bin目录配置到path环境变量中
一、数据库概述
1、什么是数据库
数据库: 存储和治理数据的仓库晚期:档次式数据库、网络型数据库当初市场上风行的是关系型数据库和非关系型数据库
2、什么是关系型数据库
底层以二维表的模式来保留数据的库叫做关系型数据库常见的关系型数据库有哪些(理解):Sql Server:微软,免费,实用于一些中型、大型的我的项目,在Java中的市场占比并不高。Oracle:甲骨文公司,免费,实用于一些大型、超大型的我的项目(功能强大、性能优异),50%MySQL:瑞典MySQLAB公司,收费开源,玲珑灵便,学习成本低,20% MySQL被甲骨文公司收买 开发成员:mariadb,永远开源收费,和mysql用法完全相同DB2:IBM,在银行、金融行业应用的较多,在Java中的市场占比不高。Sqlite:体积小,迷你数据库,用于智能家居,手机,pad等...
3、数据库相干概念
数据库服务器: 比方咱们装置的mysql软件,装置在电脑上之后,能够对外提供存取数据的服务/能力 在一个数据库服务器中能够创立多个数据库. 数据库:每一个数据库都是存取数据的仓库. 通常一个网站中的所有数据会寄存在一个数据库中 比方: www.jd.com db_jd www.baidu.com db_baidu ...表:每一个数据库中能够创立多张表,每张表用于寄存一类数据,例如: 用户信息 tb_user 商品信息 tb_product 订单信息 tb_order 。。。表记录:每张表中又能够插入若干表记录,每一条表记录用于保留一个具体的事物
4、SQL语言
SQL: 是用于操作关系型数据库的通用的语言(学会了SQL语句,所有的关系型数据库都能够操作)应用SQL能够实现(数据库/表/表记录的)如下操作: 创立库、查看库、删除库、批改库 创立表、查看表、删除表、批改表 增加表记录、删除表记录、批改表记录、查问表记录 创立存储过程、视图、索引等SQL语言是通用的,但每一个数据库厂商为了加强本人数据库的能力,都提供了方言。
5、如何连贯mysql服务器(cmd)
关上cmd窗口,输出: mysql -uroot -proot关上cmd窗口,输出: mysql -uroot -p 换行之后再输出明码关上cmd窗口,输出: mysql -uroot -p -h主机名/ip地址 -P端口 换行之后再输出明码退出连贯mysql服务器: quit、exit、\q正文符号: #正文内容 -- 正文内容 /* 正文内容 */勾销以后SQL语句的执行:\c
二、操作数据库、操作表(SQL)
书写标准: SQL语句中的关键字在书写时应该大写;自定义的库名、表(别)名、列(别)名 应该小写。SELECT * FROM stu WHERE id>2; -- 标准写法select * from stu where id>2; -- 不标准写法,但也能够执行!简直所有的SQL语句在书写实现后,都须要在前面增加分号,示意语句到此结束!--------------------------------------------创立数据库: create database 库名 charset utf8; create database if not exists 库名 charset utf8;查看所有数据库: show databases;删除数据库: drop database 库名; drop database if exists 库名;进入/抉择数据库: use 库名;--------------------------------------------创立stu表: use mydb1; create table stu( id int, name varchar(50), gender varchar(10), birthday date, score double );删除表: drop table if exists 表名;查看表: show tables;查看表构造: desc 表名;--------------------------------------------
三、新增、批改、删除表记录
1、新增记录: insert into stu(id,name,gender,birthday,score) value(1,'张三','男','1985-9-1',86); -- 插入时,给所有列赋值,列名能够省略 insert into stu value(1,'张三','男','1985-9-1',86); 插入记录时须要留神: 1) 插入值的个数和程序必须要和列的个数和程序保持一致! 2) SQL语句中的字符串和日期类型的值用单引号引起来(即便有些数据库版本反对双引号,也倡议应用单引号) 3) 如果是要给所有的列都赋值,而且值的程序和个数,和申明时列的程序和个数完全一致,列名能够省略! 常见问题1: 在往stu表中插入中文数据呈现乱码解决办法 1)首先查看以后表(stu)所在的库(mydb1)创立时有没有指定编码 create database mydb1 charset utf8; 如果没有指定,将库删除再重建,创立时依照下面的语法指定编码 2)如果建库时指定了编码,那么在插入数据之前,有没有设置 set names gbk; 如果没有设置,先设置编码,再插入数据。 3)如果后面确认了没有问题,能够尝试设置 set names utf8;再插入数据。 4)如果下面都确认了没有问题,最初能够尝试,在cmd窗口顶部,右键"属性",在弹出的窗口中点击"选项",在底部,勾选"应用旧版控制台",确定 常见问题2: 对于查问stu表中的数据没有对齐的解决办法 1)敞开之前的cmd窗口,新开一个cmd窗口,连贯上mysql服务器 2)设置set names GBK;编码之后再查问,如果还是没有对齐看一步 3)再新开一个cmd窗口,应用 mysql --default-character-set=gbk -uroot -proot 连贯mysql服务器,连贯后不必再 set names gbk; 间接查问数据, 看数据是否对齐。 2、批改记录: update stu set score=score+10; -- 如果要批改id大于1的所有学生的问题 update stu set score=score+10,name='张三丰' where id=1; 3、删除记录: delete from stu; -- 删除stu表中的所有记录 delete from stu where id>1; -- 删除id大于1的所有学生信息 drop database 库名; -- 删除指定的库 drop table 表名; -- 删除指定的表
四、查问表记录(单表查问)
1、根底查问 select * | 列名列表 from 表名2、where子句查问 select * | 列名列表 from 表名 where 列 运算符 值 [or|and 条件2]...3、含糊查问 select * | 列名列表 from 表名 where 列 like 值 含糊查问能够通过like关键字依照指定的模式进行匹配 须要配合 % 和 _(下划线)应用 %: 匹配0或多个任意字符 _: 匹配1个任意字符4、多行函数查问 count( * | 列名 ): 用于统计查问后果有多少行 max( 列名 ): 求以后这一列中的最大值 min( 列名 ): 求以后这一列中的最小值 sum( 列名 ): 对以后这一列中的所有值求和 avg( 列名 ): 对以后这一列中的所有值求平均值 5、分组查问 select * | 列名列表 from 表名 [where子句] group by 列6、排序查问 select * | 列名列表 from 表名 [where子句] [group by 列] order by 列 ASC|DESC ASC: 升序(默认值,能够省略) DESC: 降序 7、分页查问 select * | 列名列表 from 表名 [where子句] [group by 列] [order by 列 ASC|DESC] limit (页码-1)*每页显示的记录数,每页显示的记录数8、其它函数查问 curdate() -- 获取日期:年月日 curtime() -- 获取工夫:时分秒 sysdate()/now() -- 获取日期+工夫, 年月日 时分秒 year()/month()/day()/hour()/minute()/second() -- 从日期/工夫中别离获取年、月、日、时、分、秒 concat(s1,s2,...sn) -- 用于拼接字符串,s1~sn都是字符串 concat_ws(opt,s1,s2,...sn) -- 用于拼接字符串,第一个参数是一个分隔符,在前面的s1~sn在拼接时,都须要在两头拼上这个分隔符
五、mysql的数据类型
1、数值类型
tinyint --> java中的bytesmallint --> java中的shortint --> java中的intbigint --> java中的longfloat --> java中的floatdouble --> java中的double
2、字符串类型
2.1.char类型: 定长字符串
char类型的存储范畴是: 0~255个字符name char(10): 申明一个name列,是字符串类型,长度不能超过10个字符如果理论存储的数据长度小于10,残余的空间会用空格补全,因而会造成空间节约!char类型在存储数据的效率略高于varchar类型因而,char类型适宜存储长度固定的数据(比方:学生证号,身份证号,员工编号等)这样既不会节约空间,存储数据的效率还较高!
2.2.varchar类型: 不定长字符串
varchar类型的存储范畴是: 0~65535个字节 iso8859-1编码: 1个字符对应1个字节 GBK编码: 1个字符对应2个字节 UTF-8编码: 1个字符对应3个字节name varchar(10): 申明一个name列,是字符串类型,长度不能超过10个字符如果理论存储的数据长度小于10,残余的空间还能够留给别的数据应用,不会造成空间节约!varchar类型适宜存储长度不固定的数据,不会节约空间!
3、日期类型:
date:年月日time:时分秒datetime:年月日 时分秒 2020-10-1 11:10:09 timestamp: 工夫戳,格局和datetime雷同,但理论存储的是从1970-1-1到指定日期的毫秒值
六、mysql的字段束缚:
1、主键束缚:
如果一个列能够惟一的示意一行表记录(或能够作为一行表记录的惟一标识),通常会给这样的列增加主键束缚,通常状况下,每张表都会有一个主键。主键特点:惟一且不为空。(但不是每个惟一且不为空的列都是主键!)**如何增加主键束缚**: create table stu( id int primary key auto_increment, .. );**主键自增策略**: 如果主键是数值类型,能够为主键增加自增策略(目标是为了更不便插入主键的值) 增加了自增策略后,当前再插入数据时,能够不为主键赋值,数据库会本人保护一个变量(AUTO_INCREMENT),该变量的值从1开始,每次用完后会主动加1,当插入数据时,如果没有给主键赋值,数据库就会从AUTO_INCREMENT变量上获取一个值,作为主键值插入到表中。
2、非空束缚:
如果某一列的值要求不能为空(某些零碎要求用户性别 或 明码不能为空),能够为这个列增加非空束缚,这个列的值就不能为空(但能够反复)**如何增加非空束缚**: create table stu( gender varchar(10) not null, );
3、惟一束缚:
如果某一列的值要求不能反复,能够为这个列增加惟一束缚,这个值就不能反复(但能够为空)**如何增加惟一束缚**: create table stu( username varchar(50) unique not null, email varchar(20) unique, );
4、外键束缚(foreign key)
问题1: 如何保留两张表数据之间的对应关系? 在其中的一张表中增加列,用于保留另外一张表的主键,以此来保留两张表数据之间的对应关系。 例如:在emp表中增加一个dept_id列,用于保留dept表中的id列,示意员工所属的部门编号 问题2: 如何防止在删除部门后,员工表中呈现冗余数据? 形式一: 在删除每一个部门之前,先查看部门下还有没有对应的员工,如果有,先将员工删除或者移到别的部门,再删除部门即可 形式二: 告诉数据库员工表和部门表之间存在对应关系,员工表中的dept_id列是要严格参考部门表中的id列。即设置dept_id这个列为外键。告诉完后,数据库会始终帮咱们盯着,如果再删除部门,部门下有员工,数据库就会阻止咱们删除!问题3: 什么是外键? 外键就是用于告诉数据库两张表(比方部门和员工表)数据之间存在对应关系的这么一个列。 问题4: 如何增加外键? create table dept( id int primary key auto_increment, name varchar(50) ); create table emp( id int primary key auto_increment, name varchar(50), dept_id int, foreign key(dept_id) references dept(id) ); 1)在没有将dept_id设置为外键的状况上来删除一个部门,查看是否能删除? 能够删除,数据库不晓得两张表存在对应关系,所以不会阻止咱们删除! 2)如果将dept_id设置为外键的状况上来删除一个部门,查看是否能删除? 如果部门下有员工,删除会失败,此时数据库晓得两张表存在对应关系 并且会帮咱们保护这个关系,所以会阻止咱们删除有员工的部门! 3)如果加了级联删除,则在删除某一个部门的同时,先删除该部门下的所有员工,再删除部门自身!
七、表关系
1、一对多(多对一)
例如: 部门 对 员工 班级 对 学生在保留一对多或者多对一的表关系时,是在多的一方增加列,来保留一的一方的主键,从而来保留两张表数据之间的对应关系
2、一对一
例如:班级 对 教室在保留一对一的表关系时,能够在任意一方增加列,来保留另一方的主键,从而来保留两张表数据之间的对应关系
3、多对多
例如:学生 对 老师在保留多对多的表关系时,在任何一方增加列都不适合,此时能够再创立一张表专门用于保留两张表(学生表和老师表)的对应关系,再创立的这个表中,至多有两个列,别离用于保留两张表(学生表和老师表)的主键,并且将这两个列设置为联结主键。
八、多表查问
1、连贯查问
查问部门和部门对应的员工信息 select * from dept,emp;笛卡尔积查问: 指同时查问两张表,其中一张表的记录有m条,另一张表的记录有n条,笛卡尔积查问的后果就是 m*n条。因为笛卡尔积查问的后果中存在大量谬误的数据,因而咱们不会间接应用这种查问!能够在笛卡尔积查问的后果上,增加where子句,通过where子句将后果中的谬误数据剔除,保留下的就是正确数据! -- 连贯查问 select * from dept,emp where emp.dept_id=dept.id; -- 内连贯查问 select * from dept inner join emp on emp.dept_id=dept.id;
2、左外连贯查问和右外连贯查问
左外连贯查问:能够将右边表中的所有记录都查问进去,左边表只显示和右边绝对应的数据,如果右边表中某些记录在左边没有对应的数据,左边显示为null即可。例如:-- 查问部门表中的所有部门,以及部门对应的员工select * from dept left join empon emp.dept_id=dept.id;右外连贯查问:能够将左边表中的所有记录都查问进去,右边表只显示和左边绝对应的数据,如果左边表中某些记录在右边没有对应的数据,能够显示为null。-- 查问所有员工及员工对应的部门select * from dept right join empon emp.dept_id=dept.id;