MySQL数据库的使用和学习
一、数据库简介
1.数据库系统
1.1数据库
DataBase【DB】,指的是长期保存到计算机上的数据,按照一定顺序组织,可以被各种用户或者应用共享的数据集合
【用于存储数据的地方,可以视为存储数据的容器】
1.2数据库管理系统
DataBase Management System【DBMS】,能够管理和操作数据库的大型的软件
数据库是CS模式:Client/Server
用于建立、使用和维护数据库,对数据库进行统一的管理和控制,为了保证数据库的安全性和完整性,用户可以通过数据库管理系统访问数据库中的数据
1.3数据库的应用
涉及到大量的数据需要长期存储,就可以使用数据库
使用:增删改查的操作
持久化: 数据持久化, 一般存在硬盘, MySQL
缓存: 临时存储, 一般可以存在内存, Redis
2.常见数据库管理系统
1>Oracle(甲骨文): 目前比较成功的关系型数据库管理系统,运行稳定,功能齐全,性能超群,技术领先,主要应用在大型的企业数据库领域, 收费.
2>DB2: IBM(国际商业机器公司)的产品,伸缩性比较强
3>SQL Server: Microsoft的产品,软件界面友好,易学易用,在操作性和交互性方面独树一帜
4>MySQL: 免费的数据库系统,被广泛引用于中型应用系统,体积小,速度快,总体拥有成本低,开放源代码,2008年被SUN收购,2009年SUN被Oracle收购
二、数据库的安装
数据库的安装请自行百度,有很多人会安装出错,注意安装的路径,最好是自己另开一个,然后把环境变量添加到系统变量中。
三、SQL概述
1.SQL简介
Structure Query Language,结构化查询语言
2.数据库服务器、数据库和表之间的关系
表:为了保存应用实体中的数据,一般会给数据库中创建表,一个数据库可以同时管理多个表
3.数据在SQL中的存储形式
数据库 => 表
表: 表格
列:表示字段, id, name, age
行:代表一条数据, 一条记录 或 一个实体
4.SQL的分类
DDL【Data Definition Language】,数据定义语言,用户创建、修改、删除表结构
DML【Data Manipulation Language】,数据操作语言,用于对表数据进行增删改的操作
DQL【Data Query Language】,数据查询语言,用于负责表数据的查询工作
DCL【Data Control Language】:数据控制语言,用来定义访问权限和安全级别
四、数据库操作
1.登录数据库
管理员权限打开cmd,输入mysql -u root -p命令进行登录,并输入密码即可登录数据库
2.查看和创建数据库
在上面界面敲入命令show databases;回车可以查看当前所有的数据库
在上面界面敲入命令create database myuserdb;可以查看当前所有的数据库
注意:在MySQL数据库中,我们的命令行一般都需要加入英文 ‘;’
3.数据库的详细操作
DDL
进入我创建的数据库:
use myuserdb;
查看所有表
show tables;
创建表格(简单):
create table user(id int, name varchar(30),age int);
描述表格:
desc user;
删除表:
drop table user;
创建标准表:
mysql> create table user(
-> id int primary key auto_increment, # 自动增长
-> name varchar(20),
-> age int
-> );
表格的增删改查:
mysql> insert into user(name, age) values('马云',50);
Query OK, 1 row affected (0.01 sec)
mysql> select * from user;
+----+------+------+
| id | name | age |
+----+------+------+
| 1 | 马云 | 50 |
+----+------+------+
更新表格
mysql> update user set name=‘马超’ where id=10;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0
删除数据:
mysql> delete from user where id=10;
Query OK, 1 row affected (0.01 sec)
id不会重置(auto_increment字段)
truncate 快速清空表中得数据,能针对自动增值得数据重新置1
drop 删除整个表和表结构
DML
insert 插入数据
insert into table_name(items) values(item_value)
可以一次性插入一条或者多条数据
update 更新表/修改表格内容
update table_name set field1=new_value1, field2=new_value2 [where Clause]
注意:
a.完全可以更新一个字段或者多个字段
b.where相当于Python中的if语句
c.可以指定任何条件到where子句中
d.如果没有where子句,则默认所有的行都被同时更新为指定的操作[慎用!一般要结合where使用]
where子句
where子句其实就是一个操作符,类似于Python中的if语句,可以做数据的筛选
| = | 相等 |
| ---------------- | ------------------------- |
| <> / != | 不相等 |
| < | 小于 |
| <= | 小于等于 |
| 操作符 | 说明 |
| > | 大于 |
| >= | 大于等于 |
| IN(A,B) | A 和 B 之间 |
| between A and B | 位于两值之间 |
| AND | 连接多个表达式 并且的关系 |
delete 删除
delete from table_name where clause
注意:
a.如果where子句没有指定,则默认将表中的数据全部删除【慎用!】
b.可以指定任何条件在where子句中
删除表中的数据的方法有delete,truncate, 其中truncate table用于删除表中的所有行,而不记录单个行删除操作。TRUNCATE TABLE 与没有 WHERE 子句的 DELETE 语句类似;但是,TRUNCATE TABLE 速度更快,使用的系统资源和事务日志资源更少
Truncate是一个能够快速清空资料表内所有资料的SQL语法。并且能针对具有自动递增值的字段,做计数重置归零重新计算的作用。
DQL
数据库执行DQL语言不会对数据库中的数据发生任何改变,而是让数据库发送查询结果到客户端
查询返回的结果其实是一张虚拟表
语法:
SELECT 列名 FROM 表名【WHERE --> GROUP BY -->HAVING--> ORDER BY】
基本查询语句
#1.查询所有列
mysql> select * from student;
+------+----------+------+--------+
| id | name | age | gender |
+------+----------+------+--------+
| 1 | aaaa | 19 | female |
| 2 | bbbbbbbb | 20 | male |
| 3 | cc | 15 | male |
| 4 | ddd | 16 | female |
| 5 | eee | 20 | female |
+------+----------+------+--------+
5 rows in set (0.00 sec)
#2.查询指定列
mysql> select id,name,gender from student;
+------+----------+--------+
| id | name | gender |
+------+----------+--------+
| 1 | aaaa | female |
| 2 | bbbbbbbb | male |
| 3 | cc | male |
| 4 | ddd | female |
| 5 | eee | female |
+------+----------+--------+
5 rows in set (0.00 sec)
条件查询
主要结合where的使用
between…and: 介于…和…之间
and:逻辑与
or:逻辑或
in / not in:类似于Python中的成员运算符
is / is not: 类似于Python中的身份运算符 , 常用语判断null值, 如:name is null
演示:
#1.查询性别为女,并且年龄为20的记录
mysql> select * from student where gender='female' and age=20;
+------+------+------+--------+
| id | name | age | gender |
+------+------+------+--------+
| 5 | eee | 20 | female |
+------+------+------+--------+
1 row in set (0.00 sec)
#2.查询编号为1或者姓名为ddd的记录
mysql> select * from student where id='1' or name='ddd';
+------+------+------+--------+
| id | name | age | gender |
+------+------+------+--------+
| 1 | aaaa | 19 | female |
| 4 | ddd | 16 | female |
+------+------+------+--------+
2 rows in set (0.00 sec)
#3.查询编号分别为1,2,3的记录
mysql> select * from student where id='1' or id='2' or id='3';
+------+----------+------+--------+
| id | name | age | gender |
+------+----------+------+--------+
| 1 | aaaa | 19 | female |
| 2 | bbbbbbbb | 20 | male |
| 3 | cc | 15 | male |
+------+----------+------+--------+
3 rows in set (0.00 sec)
#简写形式
mysql> select * from student where id in('1','2','3');
+------+----------+------+--------+
| id | name | age | gender |
+------+----------+------+--------+
| 1 | aaaa | 19 | female |
| 2 | bbbbbbbb | 20 | male |
| 3 | cc | 15 | male |
+------+----------+------+--------+
3 rows in set (0.00 sec)
#4.查询编号不为1,2,3的记录
mysql> select * from student where id not in('1','2','3');
+------+------+------+--------+
| id | name | age | gender |
+------+------+------+--------+
| 4 | ddd | 16 | female |
| 5 | eee | 20 | female |
+------+------+------+--------+
2 rows in set (0.00 sec)
模糊查询
where 子句中=表示精准查询
like:一般情况下结合where子句使用
通配符:
_: 匹配任意一个字符
%:匹配0~n个字符【n大于等于1】
演示:
#1.查询姓名由4个字符组成的记录
mysql> select * from student where name like '____';
+------+------+------+--------+
| id | name | age | gender |
+------+------+------+--------+
| 1 | aaaa | 19 | female |
+------+------+------+--------+
1 row in set (0.00 sec)
#2.查询姓名由3个字符组成的记录,并且最后一个字母为c的记录
mysql> select * from student where name like '__c';
Empty set (0.00 sec)
#3.查询以a开头的记录
mysql> select * from student where name like 'a%';
+------+------+------+--------+
| id | name | age | gender |
+------+------+------+--------+
| 1 | aaaa | 19 | female |
+------+------+------+--------+
1 row in set (0.01 sec)
#4.查询姓名中包含b的记录
mysql> select * from student where name like '%b%';
+------+----------+------+--------+
| id | name | age | gender |
+------+----------+------+--------+
| 2 | bbbbbbbb | 20 | male |
+------+----------+------+--------+
1 row in set (0.00 sec)
#5.查询姓名中第2个字母为c的记录
mysql> select * from student where name like '_c%';
+------+------+------+--------+
| id | name | age | gender |
+------+------+------+--------+
| 3 | cc | 15 | male |
+------+------+------+--------+
1 row in set (0.00 sec)
字段控制查询
as: 起别名,用法 :select 字段 as 别名
distinct: 去除重复记录
#1.去除重复记录
mysql> select distinct id from student;
#2.给列名起别名
mysql> select name as 姓名,gender as 性别 from student;
排序
order by:指定数据返回的顺序
asc:ascending,升序
desc: descending,降序
用法:select from 表 order by xxx
演示:
#1.查询所有的记录,按照年龄升序排序
mysql> select * from student order by age asc;
#2.查询所有学生记录,按照年龄降序排序,如果年龄相等,则按照编号进行升序排序
mysql> select * from student order by age desc,id asc;
聚合函数
聚合函数主要用来做纵向运算
1、count():统计指定列不为null的记录行数
#1.查询年龄大于20的人数
mysql> select count(*) from student where age>20;
2、sum():计算指定列的数值和
#1.查询所有学生的年龄和
mysql> select sum(age) from student;
3、求指定列中的最大值和最小值
max():
min():
#求最大年龄和最小年龄
mysql> select max(age),min(age) from student;
4、avg()
average:平均数
#查询所有学生的平均年龄
mysql> select avg(age) from student;
总结:
查询关键字的书写顺序:select 聚合函数 from where order by
分组查询
group by:分组查询
having:有…,表示条件,类似于where的用法
演示:
#在当前数据库下创建新的表
mysql> create table emp(
-> empno int primary key,
-> enname varchar(20),
-> job varchar(20),
-> mgr int,
-> hiredate date,
-> sal double,
-> comm double,
-> deptno int
-> );
#1.查询各个部门的人数
mysql> select count(*) from emp group by deptno; # 先分组 后count
#2.查询每个部门的部门编号和每个部门的工资和
mysql> select deptno,sum(sal) from emp group by deptno;
#3.查询每个部门的部门编号和每个部门工资大于1500的人数
mysql> select deptno,count(*) from emp where sal>1500 group by deptno;
#4.查询工资总和大于7000的部门编号以及工资和
mysql> select deptno,sum(sal) from emp group by deptno having sum(sal)>7000;
总结:
having和where的区别
a.二者都表示对数据执行条件
b.having是在分组之后对数据进行过滤
where是在分组之前对数据进行过滤
c.having后面可以使用聚合函数
where后面不可以使用聚合函数
分页查询
limit:用来限定查询的起始行,以及总行数
演示:
#1.查询4行记录,起始行从0开始
mysql> select * from emp limit 0,4;
#2.查询3行记录,起始行从2开始
mysql> select * from emp limit 2,3;
总结:
mysql> select deptno,sum(sal) from emp where sal>1500 group by deptno having sum(sal)>5000 order by sum(sal) asc limit 4;
查询语句书写顺序:select----》from—》where—》group by-----》having-----》order by----->limit
查询语句执行顺序:from----》where-----》group by----》having----》order by ----》select-----》limit