关于Mysql服务的一点积累-Mysql基础

Mysql数据库大体上分为以下几个关键点
1.基础的语言部分
数据定义语言(DDL)用来定义数据库对象,对数据库,表等结构性对象的增删改操作。
数据操纵语言(DML)用来定义数据库记录,对表中记录的增删改操作。
数据查询语言(DQL)用来查询记录,对表中数据的查询。
数据控制语言(DCL)用来定义访问权限和安全等级,对用户创建和授权。
语言分类中,查询(DQL)是最常用,也是最需优化功底的。控制(DCL)是安全策略的最基础部分权限控制的实现手段。
操纵(DML)是数据治理中的常规使用手段,定义(DDL)是数据库服务设计的基础。
2.数据库的理解:
RDBMS=管理员(manager)+仓库(database)
database=N个table
table:
表结构:定义表的列名和列类型
表记录:一行一行的记录
3.安装MySQL数据库
1.MySQL安装成功后会在两个目录中存储文件:
C:\ProgramData\MySQL\MySQL Server 5.5\data:DBMS数据库文件(卸载MySQL时不会删除这个目录,需要自己手动删除);
D:\Program Files\MySQL\MySQL Server 5.5:DBMS管理程序
2.MySQL重要文件
D:\Program Files\MySQL\MySQL Server 5.5\bin\mysql.exe:客户端程序,用来操作服务器。但必须保证服务器已开启才能连接上;
D:\Program Files\MySQL\MySQL Server 5.5\bin\mysqld.exe:服务器程序,必须先启动它,客户端才能连接上服务器;
D:\Program Files\MySQL\MySQL Server 5.5\bin\my.ini:服务器配置文件;
3.C:\ProgramData\MySQL\MySQL Server 5.5\dat
该目录下的每个目录表示一个数据库,例如该目录下有一个mysql目录,那么说明你的DBMS中有一个名为mysql的database;
在某个数据库目录下回有0–n个扩展名为frm的文件,每个frm文件表示一个table,不要用文本编辑器打开它,它是有DBMS来读写的;
4.my.ini,MySQL最为重要的配置文件
配置MySQL的端口,默认为3306,没有必要时不要修改;
配置字符编码:
[client]下配置客户端编码:default-character-set=gbk
[mysqld]下配置服务器编码:character-set-server=utf8
配置二进制数据大小上限:
在[mysqld]下配置:max_allowed_packet=8M
5.服务器操作
开启服务器(必须保证mysql为windows服务):net start mysql
查看进程表中是否存在:mysqld.exe进程(存在)
关闭服务器(必须保证mysql为windows服务):net stop mysql
查看进程表中是否存在:mysqld.exe进程(不存在)
6.客户端操作
打开运行窗口输入“cmd”
1、登录服务器:mysql -uroot -proot -hlocalhost
-u:后面跟随用户名
-p:后面跟随密码
-h:后面跟随数据库服务器IP地址,localhost和127.0.0.1表示本机服务器
退出服务器:exit或quit
4、SQL操作
4.1、DDL语句
1.数据库
查看所有数据库:SHOW DATABASES
切换(选择要操作的)数据库:USE 数据库名
创建数据库:CREATE DATABASE [IF NOT EXISTS] mydb1 [CHARSET=utf8]
删除数据库:DROP DATABASE [IF EXISTS] mydb1
修改数据库编码:ALTER DATABASE mydb1 CHARACTER SET utf8
3、表
创建表:
CREATE TABLE [IF NOT EXISTS] 表名(
列名 列类型,
列名 列类型,
……
列名 列类型
);
查看当前数据库中所有表名称:SHOW TABLES;
查看指定表的创建语句:SHOW CREATE TABLE 表名;
查看表结构:DESC 表名;
删除表:DROP TABLE 表名;
修改表:前缀为 ALTER TABLE 表名
a)添加列:
ALTER TABLE 表名 ADD(
列名 列类型,
列名 列类型,
……
);
b)修改类类型(如果被修改的列已存在数据,那么新的类型可能会影响到已存在数据):ALTER TABLE 表名 MODIFY 列名 列类型;
c)修改列名:ALTER TABLE 表名 CHANGE 原列名 新列名 列类型;
d)删除列:ALTER TABLE 表名 DROP 列名;
e)修改表名称:ALTER TABLE 原表名 RENAME TO 新表名;
4.2、DML语句
1.插入数据
INSERT INTO 表名(列名1,列名2,…) VALUES(值1,值2,…);
在表名后给出要插入的列名,其他没有指定的列等同于插入null值。所以插入记录总是插入一行;
在VALUES后给出列值,值的顺序和个数必须与前面指定的列对应;
在数据库中所有的字符类型,必须使用单引号,不能使用双引号,日期类型也要使用单引号
INSERT INTO 表名 VALUES(列值1,值2);
没有给出要插入的列,那么表示插入的所有列;
值的个数必须是该表列的个数;
值的顺序,必须与表创建时给出的列的顺序相同。
2.修改数据
UPDATE 表名 SET 列名1=列值1,列名2=列值2,… [WHERE 条件]
条件(条件可选):
条件必须是一个boolean类型的值或表达式:UPDATE t_person SET gender=‘男’, age=age+1 WHERE sid=‘1’;
运算符:=,!=,<>,>,<,>=,<=,BETWEEN…AND,IN(…),IS NULL,NOT,OR,AND
3.删除数据
DELETE FROM 表名 [WHERE 条件];
TRUNCATE TABLE 表名:TRUNCATE是DDL语句,它是先删除drop该表,再create该表,而且无法回滚。
4.3、DCL语句
1.创建用户
CREATE USER 用户名@IP地址 IDENTIFIED BY ‘密码’;
用户只能在指定的IP地址上登录
CREATE USER 用户名@’%’ IDENTIFIED BY ‘密码’;
用户可以在任意IP地址上登录
2.给用户授权
GRANT 权限1,……,权限n ON 数据库.* TO 用户名@IP地址;
给用户分派在指定的数据库上的指定权限
例如:GRANT CREATE,ALTER,DROP,INSERT,UPDATE,DELETE,SELECT ON mydb1.* TO user1@localhost;
给user1用户分派在mydb1数据库上的CREATE、ALTER、DROP、INSERT、UPDATE、DELETE、SELECT权限
GRANT ALL ON 数据库.* TO 用户名@IP地址;
给用户分派指定数据库上的所有权限
3.撤销授权
REVOKE 权限1,……,权限n ON 数据库.* FROM 用户名@IP地址;
撤销指定用户在指定数据库上的指定权限
例如:REVOKE CREATE,ALTER,DROP ON mydb1.* FROM user1@localhost;
撤销user1用户在mydb1数据库上的CREATE、ALTER、DROP权限
4.查看权限
SHOW GRANTS FOR 用户名@IP地址;
查看指定用户的权限
5.删除用户
DROP USER 用户名@IP地址;
4.4、DQL语句(重点)
DQL语句只会对数据库查询,不会修改数据。
1.基本查询
字段(列)控制
查询所有列
SELECT * FROM 表名;
其中“”表示所有列
查询指定列
SELECT 列1[,列2,……列n] FROM 表名;
完全重复的记录只显示一次
当查询结果中的多行记录完全一样时,只显示一行,一般用于查询某个字段中一共有几种类型的值。
SELECT DISTINCT * | 列1[,列2,……,列n] FROM 表名;
例如:SELECT DISTINCT sal FROM emp;
查询员工表的工资,如果存在相同的工资只显示一次
列运算
数量类型的列可以做加、减、乘、除运算
SELECT ,sal1.5 FROM emp;
字符串做算术运算时,会被当做0来进行运算,在字符串中+号不代表拼接
字符串类型可以做连续运算
SELECT CONCAT(’$’,sal) FROM emp;
转换NULL值
有时需要把NULL转换成其他值,例如com+1000时,如果com列存在NULL值,那么NULL+1000还是NULL,而我们这是希望把NULL当做0来运算。
SELECT IFNULL(comm,0)+1000 FROM emp;
IFNULL(comm,0):如果comm中存在NULL值,那么当成0来运算;
给列起别名
当使用列运算后,查询出的结果集中的列名称不好看,这时我们需要给列名起个别名,这样在结果集中列名就显示别名了。
SELECT IFNULL(comm,0)+1000 AS 奖金 FROM emp;
其中AS可以省略
2.条件控制
条件查询
与前面介绍的UPDATE和DELETE语句一样,SELECT语句也可以使用WHERE子句来控制记录。
SELECT empno,ename,sal,comm FROM emp WHERE sal > 1000 AND comm IS NOT NULL;
SELECT empno,ename,sal FROM emp WHERE sal BETWEEN 20000 AND 30000;
SELECT empno,ename,job FROM emp WHERE job IN(‘经理’,‘董事长’);
模糊查询
当你想查询姓张,并且姓名一共两个字的员工时,就可以使用模糊查询
SELECT * FROM emp WHERE ename LIKE ‘张_’;
模糊查询需要使用运算符:LIKE,其中匹配一个任意字符,注意,只匹配一个字符而不是多个。
上面语句查询的是姓张,名字由两个字组成的员工。
下划线“_”可以匹配1个字符,如果要匹配0-n个字符,需要用“%”;
SELECT * FROM emp WHERE ename LIKE ‘%刚’;
查询名字结尾是带“刚”字的员工。
3.排序查询
升序
SELECT * FROM emp ORDER BY sal ASC;
按sal排序,ASC升序,DESC降序,其中ASC是可以省略的
降序
SELECT * FROM emp ORDER BY comm DESC;
按comm降序排序查询
使用多列作为排序条件
SELECT * FROM emp ORDER BY sal ASC, comm DESC;
使用sal升序排序,如果sal相等,再按照comm降序排序
4.聚合函数
聚合函数用来做某列的纵向运算
COUNT()函数
SELECT COUNT(
) FROM emp;
计算emp表中所有列都不为NULL的记录的行数
SELECT COUNT(comm) FROM emp;
计算emp表中comm列不为NULL的记录的行数
MAX()函数
SELECT MAX(sal) FROM emp;
查询最高工资
MIN()函数
SELECT MIN(sal) FROM emp;
查询最低工资
SUM()函数
SELECT SUM(sal) FROM emp;
查询所有员工工资的总和
AVG()函数
SELECT AVG(sal) FROM emp;
查询平均工资
5.分组查询
分组查询是把记录使用某一列进行分组,然后查询组信息。
例如:查看所有部门的记录数。
SELECT deptno,COUNT() FROM emp GROUP BY deptno;
使用deptno分组,查询部门编号和每个部门的记录数
SELECT job,MAX(sal) FROM emp GROUP BY job;
使用job分组,查询每种工作的最高工资
组条件
以部门分组,查询每组记录数,条件为记录数大于3
SELECT deptno,COUNT(
) FROM emp GROUP BY deptno HAVING COUNT() > 3;
6.LIMIT子句(方言)
LIMIT用来限定查询结果的起始行,以及总行数。
例如:查询起始行为第5行,一共查询3行记录
SELECT * FROM emp LIMIT 4,3;
其中4表示从第5行开始,其中3表示一共查询3行。即第5/6/7行记录。
分页查询中计算起始页的公式:(当前页-1)每页记录数;
例如:每页显示10条记录,查询第3页
SELECT * FROM emp LIMIT 20,10;
4.5、DQL语句样例
查询出部门编号为30的所有员工
select * from emp where deptno=30;
查询所有销售员的姓名、编号和部门编号
select ename,empno,deptno from emp where job=‘销售员’;
查询奖金高于工资的员工
select ename from emp where comm > sal;
查询奖金高于工资60%的员工
select ename from emp where comm > sal
0.6;
查询部门编号为10中所有经理,和部门编号为20中所有销售员的详细资料
select * from emp where (deptno = 10 and job=‘经理’) or (deptno=20 and job=‘销售员’);
查询部门编号为10中所有经理,部门编号为20中所有销售员,还有既不是经理又不是销售员但其工资大于或等于20000的所有员工资料
select * from emp where (deptno = 10 and job=‘经理’) or (deptno=20 and job=‘销售员’) or (job not in (‘经理’,‘销售员’) and sal>20000);
查询无奖金或奖金低于1000的员工
select * from emp where comm is null or comm<1000;
查询名字由三个字组成的员工
select * from emp where ename like ‘___’;
查询2000年入职的员工
select * from emp where hiredate like ‘2000-%’;
查询所有员工详细信息,用编号升序排序
select * from emp order by empno asc;
查询所有员工详细信息,用工资降序排序,如果工资相同使用入职日期升序排序
select * from emp order by sal desc,hiredate asc;
查询每个部门的平均工资
select deptno,avg(
) 平均工资 from emp group by deptno;
查询每个部门的雇员数量
select deptno,count() 数量 from emp group by deptno;
查询每种工作的最高工资、最低工资、人数
select job,max(
) 最高工资,min() 最低工资,count() 人数 from emp group by job;
4、MySQL编码问题(了解)
4.1、查看MySQL数据库编码
SHOW VARIABLES LIKE ‘char%’;
4.2、编码解释
character_set_client:MySQL使用该编码来解读客户端发送过来的数据,例如该编码为utf8,那么如果客户端发送过来的数据不是utf8,就会出现乱码;
character_set_results:MySQL会把数据转换成该编码后,在发送给客户端,例如该编码为utf8,那么如果客户端不使用utf8来解读,就会出现乱码;
4.3、控制台乱码问题
插入或修改时出现乱码:
这是因为cmd下默认使用GBK,而character_set_client不是GBK的原因,我们只需让这两个编码相同即可;
因为修改cmd的编码不方便,所以我们去设置character_set_client为GBK即可。
查询出的数据为乱码:
这是因为character_set_results不是GBK,而cmd默认使用GBK的原因,我们只需让这两个编码相同即可;
因为修改cmd的编码不方便,所以我们去设置character_set_results为GBK即可。
设置变量的语句:
set character_set_client=gbk
set character_set_results=gbk
这里需要注意的是,设置变量只对当前连接有效,当退出窗口后,再次登录mysql,还需要再次设置变量。为了一劳永逸,可以在my.ini中设置: default-character-set=gbk
指定默认编码
我们在安装MySQL时已经指定了默认编码为utf8,所以我们在创建数据库、创建表时,都无需再次指定编码。为了一劳永逸,可以在my.ini中设置:character-set-server=utf8
5、MySQL备份与恢复
5.1、数据库导出SQL脚本(备份数据库内容)
mysqldump -u用户名 -p密码 数据库名>生成的脚本文件路径
例如:mysqldump -uroot -proot mydb1>D:\mydb1.sql
注意,不要分号,不要登录mysql,直接在cmd下运行,生成的脚本文件中不包含create database语句
5.2、执行SQL脚本(恢复数据)
第一种方式
mysql -u用户名 -p密码 数据库<脚本文件路径
先删除mydb1库,再重新创建mydb1库,然后执行语句:
mysql -uroot -proot mydb1<D:\mydb1.sql
注意,不要使用分号,不要登录数据库,直接在cmd下运行
第二种方式
登录mysql
source SQL脚本路径
先删除mydb1库,再重新创建mydb1库,切换到mydb1库,然后执行语句:source c:\mydb1.sql
6、MySQL约束
约束是添加在列上的,用来约束列的。
6.1、主键约束
主键约束的特点有:非空、唯一、被引用
当表的某一列被指定为主键后,该列就不能为空,不能有重复值出现。
1.创建表时指定主键的两种方式:
方法一:
CREATE TABLE stu(
sid CHAR(6) PRIMARY KEY,
snam VARCHAR(20),
age INT,
gender VARCHAR(10)
);
方法二:
指定sid列为主键列,即为sid列添加主键约束
CREATE TABLE stu(
sid CHAR(6),
sname VARCHAR(20),
gender VARCHAR(10),
PRIMARY KEY(sid)
);
指定sid列为主键列,即为sid列添加主键约束
修改表时指定主键:ALTER TABLE stu ADD PRIMARY KEY(sid);
删除主键:ALTER TABLE stu DROP PRIMARY KEY;
2.主键自增长
因为主键列的特点是:必须唯一,不能为空,所以我们通常会指定主键类为整型,然后设置其自动增长,这样可以保证在插入数据时主键列的唯一和非空特性。
创建表时指定主键自增长
CREATE TABLE stu(
sid INT PRIMARY KEY ATUO_INCREMENT,
sname VARCHAR(20),
age INT,
gender VARCHAR(10)
);
修改表时设置主键自增长:ALTER TABLE stu CHANGE sid sid INT AUTO_INCREMENT;
修改表时删除主键自增长:ALTER TABLE stu CHANGE sid sid INT;
测试主键自增长:
INSERT INTO stu VALUES(NULL,‘zhangsan’,23,‘male’);
INSERT INTO stu(sname,age,gender) VALUES(‘zhangsan’,23,‘male’);
6.2、非空约束
因为某些列不能设置为NULL值,所以可以对列添加非空约束。
例如:
CREATE TABLE stu(
sid INT PRIMARY KEY AUTO_INCREMENT,
sname VARCHAR(20) NOT NULL,
age INT,
gender VARCHAR(10)
);
对sname列设置非空约束
6.3、唯一约束
车库某些列不能设置重复的值,所以可以对列添加唯一约束。
例如:
CREATE TABLE stu(
sid INT PRIMARY KEY AUTO_INCREMENT,
sname VARCHAR(20) NOT NULL UNIQUE,
age INT,
gender VARCHAR(10)
);
对sname列设置了非空约束
6.4、概念模型
当我们要完成一个软件系统时,需要把系统中的实体抽取出来,形成概念模型。
例如部门、员工都是系统中的实体。概念模型中的实体最终会成为Java中的类、数据库中的表。
对象模型就是java中的class,关系(数据)模型就是指数据库中的表。
在java中的三种关系是:is a、has a、use a
实体之间还存在着关系,关系有三种:
一对多:例如每个员工都从属于一个部门,而一个部门可以有多个员工,其中员工是多方,部门是一方;
一对一:列如夫妻关系,只能是一夫一妻;
多对多:例如老师与学生的关系,一个老师可以有多个学生,一个学生可以有多个老师。
概念模型在Java中成为实体类(JavaBean)
类就使用成员变量来完成关系,一般都是双向关联,在多对一双向中关联,即部门中关联员工,员工中也关联部门。
Java的一对多
class Employee{//多方关联一方

private Department department;
}
class Deparment{//一方关联多方

private List empList;
}
Java的一对一
class Husband{

private Wife wife;
}
class Wife{

private Husband husband;
}
Java多对多
class Student{

private List teaList;
}
class Teacher{

private List stuList;
}
对象模型:可以双向关联,而且引用的是对象,而不是一个主键;
关系模型:只能多方引用一方,而且引用的只是主键,而不是一整行记录。
6.5、外键约束
外键必须是另一张表(或本表)的主键的值,外键要引用主键;
外键可以重复;
外键可以为空;
一张表中可以有多个外键;
数据库多对一关系
从表中的外键关联主表的主键
创建主表
CREATE TABLE dept(
deptno INT PRIMARY KEY AUTO_INCREMENT,
dname VARCHAR(50)
);
创建从表
CREATE TABLE emp(
empno INT PRIMARY KEY AUTO_INCREMENT,
ename VARCHAR(50),
dno INT,
CONSTRAINT fk_emp_dept FOREIGN KEY(dno) REFERENCES dept(deptno)
);
数据库一对一关系
在表中建立一对一关系比较特殊,需要让从表的主键,即是主键又是外键。
创建主表
CREATE TABLE hasband(
hid INT PRIMARY KEY AUTO_INCREMENT,
hname VARCHAR(50)
);
创建从表
CREATE TABLE wife(
wid INT PRIMARY KEY AUTO_INCREMENT,
wname VARCHAR(50),
CONSTRAINT fk_wife_hasband FOREIGN KEY(wid) REFERENCES hasband(hid)
);
数据库多对多关系
在表中建立多对多关系需要使用中间表,即需要三张表,在中间表中使用两个外键,分别引用其他两个表的主键。
学生表
CREATE TABLE student(
sid INT PRIMARY KEY AUTO_INCREMENT,

);
老师表
CREATE TABLE teacher(
tid INT PRIMARY KEY AUTO_INCREMENT,

);
中间表
CREATE TABLE stu_tea(
sid INT,
tid INT,
CONSTRAINT fk_stu_tea_sid FOREIGN KEY(sid) REFERENCES student(sid),
CONSTRAINT fk_stu_tea_tid FOREIGN KEY(tid) REFERENCES teacher(tid)
);
7、多表查询
7.1、多表查询的分类
合并结果集
连接查询
子查询
7.2、合并结果集
要合并的表的结果集,列类型和列数相同
UNION:去除重复行
UNION ALL:不去除重复行
例如:
SELECT * FROM ab
UNION ALL
SELECT * FROM cd;
7.3、连接查询
1.分类
内连接
外连接
左外连接
右外连接
全外连接(MySQL不支持)
自然连接
2.内连接
直接查询两张表会得到笛卡尔集表
方言:SELECT * FROM 表1 别名1,表2 别名2 WHERE 别名1.xx=别名2.xx
标准:SELECT * FROM 表1 别名1 INNER JOIN 表2 别名2 ON 别名1.xx=别名2.xx
自然:SELECT * FROM 表1 别名1 NATURAL JOIN 表2 别名2
内连接查询出的所有记录都满足条件
3.外连接
左外:SELECT * FROM 表1 别名1 LEFT OUTER JOIN 表2 别名2 ON 别名1.xx=别名2.xx
左外即左表为主,左表记录无论是否满足条件都会查询出来,而右表只有满足条件才能出来。左表不满足条件的记录,右表部分都为NULL
左外自然:SELECT * FROM 表1 别名1 NATURAL LEFT OUTER JOIN 表2 别名2 ON 别名1.xx=别名2.xx
右外:SELECT * FROM 表1 别名1 RIGHT OUTER JOIN 表2 别名2 ON 别名1.xx=别名2.xx
右表记录无论是否满足条件都会查询出来,而左表只有满足条件才能查询出来。右表不满足条件的记录,其左表部分都为NULL
右外自然:SELECT * FROM 表1 别名1 NATURAL RIGHT OUTER JOIN 表2 别名2 ON 别名1.xx=别名2.xx
全连接:
在其他数据库中使用FULL OUTER JOIN实现全连接,但是MySQL不支持,我们可以使用UNION来完成全连接;
在左外查询语句和右外查询语句之间加上UNION,得到左外和右外的结果集,可以间接实现全连接。
7.4、子查询
子查询即查询中包含了查询
1.出现的位置
WHERE后作为条件存在
例如:查询工资最高的员工的详细信息
SELECT * FROM emp WHERE sal=(SELECT MAX(sal) FROM emp);
FROM后作为表存在(多行多列)
查询30号部门员工的编号和姓名
SELECT e.empno,e.ename FROM (SELECT * FROM emp WHERE deptno=30) e;
2.条件
单行单列:SELECT * FROM 表1 别名1 WHERE 列1 [=、>、<、>=、<=、!=] (SELECT 列 FROM 表2 别名2 WHERE 条件);
例如:查询大于平均工资的所有员工信息
SELECT * FROM emp WHERE sal > (SELECT AVG(sal) FROM emp);
多行单列:SELECT * FROM 表1 别名1 WHERE 列1 [IN、ALL、ANY] (SELECT 列 FROM 表2 别名2 WHERE 条件);
例如:查询大于30部门所有人工资的员工信息
SELECT * FROM emp WHERE sal > ALL (SELECT sal FROM emp WHERE deptno=30);
单行多列:SELECT * FROM 表1 别名1 WHERE (列1,列2) IN (SELECT 列1,列2 FROM 表2 别名2 WHERE 条件);
例如:查询公司里和某员工在用一个部门并且岗位和工资都相同的员工信息
SELECT * FROM emp WHERE (job,deptno,sal) IN (SELECT job,deptno,sal FROM emp WHERE ename=‘张三’);
多行多列:SELECT * FROM 表1 别名1,(SELECT …) 别名2 WHERE 条件;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章