Mysql数据库学习(一)
数据库的基本的概述
- 理解数据库:
RDBMS= 管理员(manager) +仓库( database )
database = N个table
table:
表结构:定义表的列名和列类型.
表记录: 一行一行的记录.
安装mysql的基本的路径对应的操作
- MySQL安装成功后会在两个目录中存储文件:
D:\Program Files\MySQL\MySQL Server 8.0.17: DBMS管理程序
C:\ProgramData\MySQL\MySQL Server 8.0.17\data: DBMS数据库文件(卸载MySQL时不会删除这个目录,需要自己手动删除) - MySQL重要文件
D:\Program Files\MySQL\MySQL server 8.0.17\bin\myaql.exe: 客户端程序,用来操作服务器。但必须保证服务器已开启才能连接上!
D:\Program Files\MySQL\MySQL Server 8.0.17\bin\mysqld.exe: 服务器程序,必须先启动它,客户端才能连接上服务器。
D:\Program Files\MySQL\MySQL Server 8.0.17\bin\my.ini: 服务器配置文件 - C:\ProgramData\MySQL\MySQL server 8.0.17\data
该目录下的每个目录表示一个数据库,例如该目录下有-个mysq1目录,那么说明你的DBMS中有一个名为mysql的database.
在某个数据库目录下会有0~n个扩展名为frm的文件,每个frm文件表示一个table. 你不要用文本编辑器打开它,它是由DBMS来读写的! - my.ini, MysQL最为重要的配置文件
配置MySQL的端口:默认为3306,没有必要去修改它:
配置字符编码:
[client]下配置客户端编码: default-character-set=gbk
[mysqld] 下配置服务器编码: character-set-server-utf8
配置二进制数据大小上限:
在[mysqld]下配置: max_ allowed. packet=8M
服务器基本操作
1.开启服务器(必须保证mysql为windows服务): net start mysql
查看进程表中是否存在: mysqld.exe进程 (存在)
2.关闭服务器(必须保证mysql为windows服务): net stop mysql
查看进程表中是否存在: mysqld.exe进程(不存在)
客户端的操作
cmd
1.登录服务器:mysql -u用户名 -p密码 -hlocalhost
u:用户名
p:密码
h:Ip地址
2退出服务器 exit或者quit
mysql的基本分类
- DDL (Data pefinition Language) :数据定义语言,用来定义数据库对象:库、表、列等,创建、删除、修改:库、表结构.
- DML (Data Manipulation Language) :数据操作语言,用来定义数据库记录(数据) ;增、删、改:表记录.
- DCL (Data Control Language) :数据控制语言,用来定义访问权限和安全级别;
- DQL(Data Query Language) :数据查询语言,用来查询记录(数据) .
DDL数据库操作(对表达结构的操作)
- 数据库
- 查看所有数据库: SHOW DATABASES
- 切换(选择要操作的)数据库: USE 数据库名
- 创建数据库: CREATE DATABASE [IF NOT EXISTS] mydb [CHARSET utf8]
- 删除数据库: DROP DATABASE [IF EXISTS] mydb
- 修改数据库编码: ALTER DATABASE mydb1 CHARACTER SET utf8
-
mysql数据类型
int:
整型
double: 浮点型,例如double(5,2)表示最多5位,其中必须有2位小数,即最大值为999.99;
decimal: 浮点型,在表单钱方面使用该类型,因为不会出现精度缺失问题:
char:
固定长度字符串类型: char(255), 数据的长度不足指定长度,补足到指定长度!
varchar:
可变长度字符串类型:
varchar (65535),zhangSan
text (clob): 字符串类型:
很小
小
中
大
blob: 字节类型;
很小
小
中
大
date: 日期类型,格式为: yyy-MM-dd;
time: 时间类型,格式为:hh :mm:33
timestamp: 时间戳类型; -
表操作
-
添加列的操作
ALTER TABLE 表名
ADD(
列名 列的类型
); -
修改列的类型
ALTER TABLE 表名
MODIFY 列名 新的列类型; -
修改列的名称
ALTER TABLE 表名
CHANGE 原列名 新列名 列的类型; -
删除列
ALTER TABLE 表名
DROP 列名; -
修改表的名称
ALTER TABLE 原表名
RENAME TO 新的表名;
DQL数据库(对记录的操作)
- 插入数据
- INTERT INTO 表名(列名1,列名2, … VALUES(列值1, 列值2, …);
在表名后给出要插入的列名,其他没有指定的列等间与播入null值。所以插入记录总是播入一行,不可能是半行。在VALUES后给出列值,值的顺序和个数必须与前面指定的列对应 - INTERT INTO表名VALUES(列值1, 列值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; -
删除数据
DELETE FROM 表名 [WHERE条件];
TRUNCATE TABLE表名: TRUNCATE是DDL语句, 它是先删除drop该表,再create该表。 而且无法回滚! ! !
注意点:
=,!=,<>,>,<,=>,<=,BETWEEN …AND,IS NULL,OR ,AND,NOT
其中需要注意几个预算符的操作是BETWEEN …AND是指的在什么的区间之间
IS NULl表示的是为空的意思,判断的语句,不能写成 =NULL ,这个表示的就是false的意思
NOT 就是否的意思
IN (,)这个里面表示就是指的是是一个条件的集合的操作
DCL数据库的操作
一个项目创建一个用户!一个项目对应的数据库只有一个
这个用户只能对这个数据库有权限,其他数据库你就操作不了
- 创建用户
- 用户只能在指定的IP地址上登录
由CREATE USER 用户名@IP地址 IDENTIFIED BY ‘密码’; - 用户可以在任意IP地址上登录
中CREATE USER 用户名 @’%’ IDENIIFIED BY ‘密码’:
- 给用户授权
- GRANT权限1, …,权限n ON数据库.* To 用户名@IP地址
权限、用户、数据库
给用户分派在指定的数据库上的指定的权隈 - 给user1用户分派在mydb数据库上的create. alter. drop. insert. update. delete. select权限
例如: GRANT CREATE, ALTER, DROP, INSERT, UPDATE, DELETE,SELECT ON mydb.* TO user1@localhost; - 给用户分派指定数据库上的所有权限
GRANT ALL ON 数据库. * TO 用户名@IP地址;
- 撒销授权
- REVOKE 权限1, …,权限n ON数据库.* FROM 用户名@IP地址:
撤消指定用户在指定数据库上的指定权限 - 撤消user1用户在mydb1数据库上的create. alter. drop权限
例如: REVOKE CREATE, ALTER, DROP ON mydb1.* FROM u3er101ocalhost;
- 查看权限
- 查看指定用户的权限
SHOW GRANTS FOR 用户名@IP地址
5.删除用户
- DROP USER 用户名@IP地址
基本操作:创建一个新的用户,并且对用户进行一系列的操作,授权和撤销权限,以及查看权限,删除用户之类的。
DQL数据库操作
- 字段(列)控制
1)查询所有列
SELECT * EROM 表名;
–>其中" * "表示查询所有列
2)查询指定列
SELECT 列1 [, 列2,… 列N] FROM 表名;
SELECI empno, ename, sal, comm FROM表名;
3)完全重复的记录只一次.
当查询结果中的多行记录-一模一样时,只显示一行。一般查询所有列时很少会有这种情况,但只查询一列(或几列)时,这总可能就大了!
SELECT DISTINCT .* 列1 [, 列2,…列N] FROM 表名;
SELECT DISTINCT sal EROM emp;
–>保查询员工表的工资,如果存在相同的工资只显示一次:
4)列运算
-
数量类型的列可以做加、减、乘、除运算
SELECT sal*1.5 FROM emp;
SELECT sal+corm FROM erp; -
字符串类型可以做连续运算
SELECT CONCAT(‘S’, sal) FROM emp; -
转换NULL值
有时需要把NULL转换成其它值,例如com+1000时, 如果com列存 在NULL值,那么NULL+1000还是NULL,而我们这时希望把NULL当前o来运算.
SELECT IENULL (comm, 0)+1000 FROM enp;
IFNULL(comm, 0): 如果comm中存 在NULL值,那么当成0来运算。 -
给列起别名
你也许已经注意到了,当使用列运算后,查询出的结果集中的列名称很不好看,这时我们需要给列名起个别名,这样在结果集中列名就显示别名了
SELECT IFNULL(comm, 0)+1000 AS 奖金 FROM enp;
注意:其中AS可以省略
注意:如果操作的字段值字符串的类型,做运算会出现问题 任何的的数据和NULL 相加的话都会出现为空的情况,所以这个时候有一个操作 IFNULL(字段,0)进行运算的操作
-
显示出无重复的操作
SELECT DISTINCT* FROM 表名 全部
SELECT DISTINCT age FROM 表名 指定的 -
模糊查询
SELECT *FROM 表名 WHERE 字段 LIKE ‘__’;
SELECT *FROM 表名 WHERE 字段 LIKE ‘%’;
需要注意的是_在这里是指的是查询的数据是存在比如:‘小_’第一个字为小,后面字为随意的 如果是2个下划线表示是指的是3个字小某某,百分号字指所做的为表示0-n未知的数字,%小%,表示的是模糊查询里面含有小字的数据 -
排序查询:
使用关键字: ORDER BY
ASC 升序排序
DESC降序排序
还可以使用多列作为查询条件 :SELECT *FROM 表名 ORDER BY 字段 ASC ,字段DESC
其中ASC升序是可以省略的 -
聚合函数
需要主要的在cunnt()这个表示一个行上面只要存在一个不是空的都算出来
可以去查询某一列得的数据操作
需要注意的是在count(1)表示第一行,无语法错误的,还有的就是大于总的列数,表示就是count()的
还可以进行联合的查询操作
1.COUNT( * ) 总的行数
[Count( * )表示取得所有记录,忽略null,为null值也会取得。]
COUNT(age) 获取age不为null的所有行数
采用count(字段名称),不会取得为null的纪录。
2.MAX(sal) 最大值
3.MIN(sal) 最小值
4.SUM(sal) 总和
5.AVG(sal) 平均值
-
分组查询操作:GROUP BY
查询的语句字段的类型,必须要和分组保持一致,并且这个后面的都跟的是聚合函数,因为其实聚合函数表示就组条件所计算出来的。
需要注意的是一分组前判断条件和分组后的条件
分组前的条件就是使用的WHERE 分组后的条件使用就是HAVING (组条件)
例1:组条件
以部门分组,查询每组记录数。条件为记录数大于3
SELECT deptno, COUNT( * ) FROM emp GROUP BY deptno HAVING COUNT( * ) > 3; . -
语句执行的顺序
select
from
where
group by
having
order by -
方言查询
主要分页查询的操作这个limt的操作,
而且在这里的话,limt的操作中(查询的开始位置,查询的数目)
*开始查询的位置=(当前页-1)每页的记录数
练习题
数据库
题目:
- SELECT *FROM tb_demo WHERE empno=30;
- SELECT enama,empno,deptno FROM tb_demo job=’销售员’;
- SELECT *FROM tb_demo WHERE comm>sal;
- SELECT FROM tb_demo WHERE comm>sal0.6;
- SELECT *FROM tb_demo WHERE (empno=10 AND job=’经理’) OR (empno=20 AND job=‘销售员’);
- SELECT *FROM tb_demo WHERE (empno=10 AND job=’经理’) OR (empno=20 AND job=’销售员’) OR ( job NOT IN(销售员,经理) AND sal=>20000)
- SELECT *FROM tb_demo WHERE comm is null AND comm<1000;
- SELECT *FROM tb_demo WHERE LIKE ‘___’;
- SELECT *FROM tb_demo WHERE LIKE ‘2000-%’;
- SELECT *FROM tb_demo ORDER BY empno ASC;
- SELECT *FROM tb_demo ORDER BY sal DESC ,hiredate ASC;
- SELECT deptno ,AVG(sal) FROM tb_demo GROUP BY deptno;
- SELECT deptno,count(*) FROM tb_demo GROUP BY deptno;
- SELECT job ,MAX(sal),MIN(sal),COUNT(*) FROM tb_demo GROUP BY job;
参考声明:黑马程序员学习资料