首页 > 数据库 >MySQL基础

MySQL基础

时间:2023-02-02 18:36:27浏览次数:72  
标签:-- 数据库 表名 基础 查询 emp MySQL SELECT

vs

MySQL数据库

1.数据库相关概念

数据库:存储数据的仓库,数据是有组织的进行存储, 英文:DataBase,进程DB

  • 存储和管理数据的仓库
  • 其本质是一个文件系统,还是以文件的方式 将数据保存在电脑上

数据库管理系统:管理数据库的大型软件英文:DataBase Management System 简称DBMS, 指一种操作和管理维护数据库的大型软件

MySQL就是一个数据库管理系统软件,安装了MySQL的电脑,我们叫它为数据库服务器

数据库管理系统的作用

用于建立,使用和维护数据库,对数据库进行统一的管理

SQL: Structured Query Language,简称 SQL,结构化查询语言

是一种特殊目的的编程语言,是一种数据库 查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。

常见的关系型数据库管理系统:

  • Oracle:收费的大型数据库,Oracle 公司的产品 ---->甲骨文 银行Oracle

  • MySQL: 开源免费的中小型数据库。后来 Sun 公司收购了 MySQL,而 Sun 公司又被 Oracle 收购 java

  • SQL Server:MicroSoft 公司收费的中型的数据库。C#、.net 等语言常使用

  • PostgreSQL:开源免费中小型的数据库 定位

  • DB2:IBM 公司的大型收费数据库产品

  • SQLite:嵌入式的微型数据库。如:作为 Android 内置数据库

  • MariaDB:开源免费中小型的数据库--mysql 的一个分支

2.MySQL数据库

2.1安装

https://dev.mysql.com/downloads/windows/installer/5.7.html

找到安装目录 ,默认在C 盘 配置环境变量

C:\Program Files (x86)\MySQL\MySQL Server 5.7\bin

登录

打开cmd 命令行

win+R 输入cmd回车

在黑框中输入,mysql -uroot -p123456,回车,出现下图且左下角为mysql>,则登录成功。

-u user 的缩写

-p password

mysql -uroot -p123456

远程链接:

mysql -u用户名 -p密码 -h要连接的mysql服务器的ip地址(默认127.0.0.1) -P端口号(默认3306)

win + R

cmd

退出

exit
quit

安装目录

2.2 MySQL 数据模型

关系型数据库:

关系型数据库是建立在关系模型基础上的数据库,简单说,关系型数据库是由多张能互相连接的 二维表 组成的数据库

如下 学生表和教师表 都是有行有列二维表我们将这样的称为关系型数据库

关系型数据库的优点

  • 都是使用表结构,格式一致,易于维护。

  • 使用通用的 SQL 语言操作,使用方便,可用于复杂查询。

    • 关系型数据库都可以通过SQL进行操作,所以使用方便。
  • 数据存储在磁盘中,安全。

数据模型:

如上图,我们通过客户端可以通过数据库管理系统创建数据库,在数据库中创建表,在表中添加数据。

创建一个数据库,会在本地文件夹生成.frm 表文件 和 .MYD 数据文件,在安装目录下的 data文件下

mysql> create database db1;
  • MySQL中可以创建多个数据库,每个数据库对应到磁盘上的一个文件夹

  • 在每个数据库中可以创建多个表,每张都对应到磁盘上一个 frm 文件

  • 每张表可以存储多条数据,数据会被存储到磁盘中 MYD 文件中

2.3 SQL概述

2.3.1 SQL简介

  • 英文:Structured Query Language,简称 SQL

  • 结构化查询语言,一门操作关系型数据库的编程语言

  • 定义操作所有关系型数据库的统一标准

  • 对于同一个需求,每一种数据库操作的方式可能会存在一些不一样的地方,我们称为“方言”

    通用语法

    1) SQL语句可以单行 或者 多行书写,以分号 结尾 ;

    2) 可以使用空格和缩进来增加语句的可读性。

    3) MySql中使用SQL不区分大小写,一般关键字大写,数据库名 表名列名 小写。

    4) 注释方式

    注释语法 说明
    -- 空格 单行注释
    /* */ 多行注释
    # MySQL特有的单行注释
    # show databases;单行注释 
    -- show databases; 单行注释
    /* 多行注释
    show databases; */
    

2.3.2 SQL分类

分类 说明
数据定义语言 简称DDL(Data Definition Language), 用来定义数据库对象:数据库,表,列等
数据操作语言 简称DML(Data Manipullation Language), 用来对数据库中表的记录进行更新。
数据查询语言 简称DQL(Data Query Language), 用来查询数据库中表的记录
数据控制语言 简称DCL(Data Control Language) 用来定义数据库的访问权限和安全级别,及创建用户。

1.DDL:操作数据库

命令 说明
create database 数据库名 创建指定名称的数据库
create database 数据库名 character set字符集 创建指定名称的数据库,并且指定字符集(一般都指定utf-8)
/* 方式1 直接指定数据库名进行创建 默认数据库字符集为:latin1 */ CREATE DATABASE db1; 
/* 方式2 指定数据库名称,指定数据库的字符集 一般都指定为 utf8,与Java中的编码保持一致 */ 
CREATE DATABASE db1_1 CHARACTER SET utf8;

为了避免错误

CREATE DATABASE IF NOT EXISTS 数据库名称;

查看/选择数据库

数据库创建好了,要在数据库中创建表,得先明确在哪儿个数据库中操作,此时就需要使用数据库。

命令 说明
use 数据库 切换数据库
select database(); 查看当前正在使用的数据库
show database; 查看MySQL中都有哪些数据库
show create database 数据库名 查看一个数据库的定义信息

代码示例

-- 切换数据库 从db1 切换到 db1_1
USE db1_1;
-- 查看当前正在使用的数据库
SELECT DATABASE();
-- 查看Mysql中有哪些数据库 
SHOW DATABASES;
-- 查看一个数据库的定义信息
SHOW CREATE DATABASE db1_1; 

修改数据库

修改数据库字符集

命令 说明
alter database 数据库名 character set 字符集 数据库的字符集修改操作
-- 将数据库db1 的字符集 修改为 utf8
ALTER DATABASE db1 CHARACTER SET utf8;
-- 查看当前数据库的基本信息,发现编码已更改
SHOW CREATE DATABASE db1; 

修改数据库

命令 说明
drop database 数据库名 从MySQL中永久的删除某个数据库
-- 删除某个数据库
DROP DATABASE db1_1;
DROP DATABASE IF EXISTS 数据库名称;
  1. DDL:操作表

    操作表也就是对表进行增(Create)删(Retrieve)改(Update)查(Delete)。

    查询表

查询当前数据库下所有表名称

show tables

查询表结构

DESC 表名称

数据类型

常见数据类型

类型 描述
int 整型
double 浮点型
varchar 字符串型
date 日期类型,给是为yyyy-MM-dd,只有年月日,没有时分秒

注意:MySQL中的char类型与varchar类型,都对应了java中的字符串类型,

区别在于:

char类型是固定长度的: 根据定义的字符串长度分配足够的空间。

varchar类型是可变长度的: 只使用字符串长度所需的空间

比如:保存字符串 "abc"

x char(10) 占用10个字节
y varchar(10) 占用3个字节

适用场景: char类型适合存储 固定长度的字符串,比如 密码 ,性别一类 varchar类型适合存储 在一定范围内,有长度变化的字符串

需求1: 创建商品分类表

表名:
category 分类
表中字段:
	分类ID :cid ,为整型
    分类名称:cname,为字符串类型,指定长度20 
-- 切换到数据库
db1 USE db1;
-- 创建表
CREATE TABLE category(
    cid INT,
    cname VARCHAR(20)
); 

练习:

创建测试表

表名:
test1 表中字段:
	测试ID : tid ,为整型
    测试时间: tdate , 为年月日的日期类型
-- 创建测试表
CREATE TABLE test1(
    tid INT,
    tdate DATE
); 

快速创建一个表结构相同的表

语法格式

create table 新表名 like 旧表名
-- 创建一个表结构与 test1 相同的 test2表
CREATE TABLE test2 LIKE test1;
-- 查看表结构
DESC test2;
-- 查看创建表的SQL语句
SHOW CREATE TABLE category; 

删除表

命令 说明
drop table 表名; 删除表(从数据库中永久删除某一张表)
drop table if exists 表名 判断表是否存在,存在的话就删除,不存在就不执行删除
-- 直接删除 test1 表
DROP TABLE test1;
-- 先判断 再删除test2表
DROP TABLE IF  EXISTS test2; 

修改表

1)修改表名

语法格式

rename table 旧表名 to 新表名

将category表 改为 category1

RENAME TABLE category TO category1; 
  1. 修改表的字符集
alter table 表名 character set 字符集

create table

drop table

rename table

alter table

将category表的字符集 修改为gbk

alter table category character set gbk;

3)向表中添加列, 关键字 ADD

alert table 表名 add 字段名称 字段类型

为分类表添加一个新的字段为 分类描述 cdesc varchar(20 )

# 为分类表添加一个新的字段为 分类描述 cdesc varchar(20) ALTER TABLE category ADD cdesc VARCHAR(20);
  1. 修改表中列的 数据类型或长度 , 关键字 MODIFY
alter table 表名 modify 字段名称 字段类型

对分类表的描述字段进行修改,类型varchar(50)

ALTER TABLE category MODIFY cdesc VARCHAR(50);

5)修改列名称 , 关键字 CHANGE

alter table 表名 change 旧列名 新列名 类型(长度);

对分类表中的 desc字段进行更换, 更换为 description varchar(30)

ALTER TABLE category CHANGE cdesc description VARCHAR(30);

6)删除列 ,关键字 DROP

alter table 表名 drop 列名; 

删除分类表中description这列

ALTER TABLE category DROP description;
  1. DML 操作数据

DML主要是对数据进行增(insert)删(delete)改(update)操作。

添加数据

语法格式:

insert into 表名 (字段名1,字段名2...) values(字段值1,字段值2...);

create table

Student

insert into Student  (id,name,age) values(1,"dongtianchi",18);
insert into Student  (id,name,age) values(2,"fengxudong",19);
id name age
1 dongtianchi 18
2 fengxudong 19

案例

表名:student
表中字段:
学员ID, sid int
姓名, sname varchar(20)
年龄, age int
性别, sex char(1)
地址, address varchar(40)
# 创建学生表
CREATE TABLE student(
    sid INT,
    sname VARCHAR(20),
    age INT,
    sex CHAR(1),
    address VARCHAR(40)
); 

向学生表中添加数据,3种方式

方式1: 插入全部字段, 将所有字段名都写出来

INSERT INTO student (sid,sname,age,sex,address) VALUES(1,'孙悟空',20,'男','花果山'); 

方式2: 插入全部字段,不写字段名

INSERT INTO student VALUES(2,'孙悟饭',10,'男','地球'); 

方式3:插入指定字段的值

INSERT INTO category (cname) VALUES('白骨精'); 

批量添加数据

 INSERT INTO 表名(列名1,列名2,…) VALUES(值1,值2,…),(值1,值2,…),(值1,值2,…)…; INSERT INTO 表名 VALUES(值1,值2,…),(值1,值2,…),(值1,值2,…)…;
INSERT INTO student VALUES(2,'孙悟饭',10,'男','地球'),(3,'孙悟饭1',10,'男','地球'); 

修改数据

语法格式1:不带条件的修改

update 表名 set 列名 = 值 

语法格式2:带条件的修改

update 表名 set 列名 = 值 [where 条件表达式:字段名 = 值 ]

1)不带条件修改,将所有的性别改为女(慎用!!)

UPDATE student SET sex = '女';

2)带条件的修改,将sid 为3的学生,性别改为男

UPDATE student SET sex = '男' WHERE sid = 3;

3)一次修改多个列, 将sid为 2 的学员,年龄改为 20,地址改为 北京

UPDATE student SET age = 20,address = '北京' WHERE sid = 2; 

删除数据

DELETE FROM 表名 [WHERE 条件] ;

1)删除 sid 为 1 的数据

DELETE FROM student WHERE sid = 1;

  1. 删除所有数据
DELETE FROM student; 

  1. 如果要删除表中的所有数据,有两种做法
  1. delete from 表名; 不推荐. 有多少条记录 就执行多少次删除操作. 效率低

  2. truncate table 表名: 推荐. 先删除整张表, 然后再重新创建一张一模一样的表. 效率高

truncate table student; 

  1. DQL查询表中数据

DQL:查询语法

SELECT
	字段列表(想要查询的字段)
FROM
	表名列表 (来源表)
WHERE
    条件列表
GROUP BY
    分组字段
HAVING 
    分组后条件
ORDER BY
    排序字段
LIMIT
    分页限定

准备初试数据

#创建员工表
表名 emp
表中字段:
eid 员工id,int
ename 姓名,varchar
sex 性别,char
salary 薪资,double
hire_date 入职时间,date
dept_name 部门名称,varchar
# 删除emp表
drop table if exists emp;
#创建员工表
CREATE TABLE emp(  
    eid INT,
    ename VARCHAR(20),
    sex CHAR(1),
    salary DOUBLE,
    hire_date DATE,
    dept_name VARCHAR(20)
);
#添加数据
INSERT INTO emp VALUES(1,'孙悟空','男',7200,'2013-02-04','教学部');
INSERT INTO emp VALUES(2,'猪八戒','男',3600,'2010-12-02','教学部');
INSERT INTO emp VALUES(3,'唐僧','男',9000,'2022-09-08','教学部');
INSERT INTO emp VALUES(4,'白骨精','女',5000,'2022-10-07','市场部');
INSERT INTO emp VALUES(5,'蜘蛛精','女',5000,'2022-09-14','市场部');
INSERT INTO emp VALUES(6,'玉兔精','女',200,'2022-03-14','市场部');
INSERT INTO emp VALUES(7,'林黛玉','女',10000,'2019-10-07','财务部');
INSERT INTO emp VALUES(8,'黄蓉','女',3500,'2022-09-14','财务部');
INSERT INTO emp VALUES(9,'吴承恩','男',20000,'2022-03-14',NULL);
INSERT INTO emp VALUES(10,'孙悟饭','男', 10,'2020-03-14','财务部');
INSERT INTO emp VALUES(11,'兔八哥','女', 300,'2022-03-14','财务部');

  1. 简单查询

查询多个字段

select 字段列表  from 表名;
select * from  表名; --查询所有数据

去除重复记录

select distinct 字段列表 form 表名

起别名

As : As 也可以省略 

查询emp中的所有数据

select * from emp;  -- 使用* 表示所有列

查询emp表中的所有记录, 仅显示id和name 字段

select eid, ename from emp

将所有的员工信息查询出来,并将列名改为中文

# 使用 AS关键字,为列起别
SELECT  eid AS '编号',
ename AS '姓名' , 
sex AS '性别',
salary AS '薪资',
hire_date '入职时间', -- AS 可以省略
dept_name '部门名称'
FROM emp;

查询一共有几个部门

使用去重关键字distinct

--使用distinct 关键字,去掉重复部门信息

将所有元的工资 + 1000元进行显示

select ename, salary +1000 from emp

  1. 条件查询

6.1 语法

select 字段列表 from 表名 where  条件列表

条件

条件列表可以使用以下运算符

符号 功能
> 大于
< 小于
>= 大于等于
<= 小于等于
= 等于
<>或!= 不等于
between...and... 在某个范围之内(都包含)
in(...) 多选一
like 占位符 模糊查询 单个任意字符 % 多个任意字符
is null 是null
is not null 不是null
and 或 && 并且
or 或 || 或者
not 或 ! 非, 不是

6.2 条件查询练习

# 查询员工姓名为黄蓉的员工信息
# 查询薪水价格为5000的员工信息
# 查询薪水价格不是5000的所有员工信息
# 查询薪水价格大于6000元的所有员工信息
# 查询薪水价格在5000到10000之间所有员工信息
# 查询薪水价格是3600或7200或者20000的所有员工信息

代码实现

# 查询员工姓名为黄蓉的员工信息
select * from emp where ename ="黄蓉";
# 查询薪水价格为5000的员工信息
SELECT * FROM emp WHERE salary = 5000;
# 查询薪水价格不是5000的所有员工信息
SELECT * FROM emp WHERE salary != 5000;SELECT * FROM emp WHERE salary <> 5000;
# 查询薪水价格大于6000元的所有员工信息
SELECT * FROM emp WHERE salary > 6000;
# 查询薪水价格在5000到10000之间所有员工信息
SELECT * FROM emp WHERE salary BETWEEN 5000 AND 10000;
# 查询薪水价格是3600或7200或者20000的所有员工信息-- 
方式1: or
SELECT * FROM emp WHERE salary = 3600 OR salary = 7200 OR salary = 20000;
-- 方式2: in() 匹配括号中指定的参数
SELECT * FROM emp WHERE salary IN(3600,7200,20000);

6.3 模糊查询练习

模糊查询使用like关键字,可以使用通配符进行占位:

(1)_ : 代表单个任意字符

(2)% : 代表任意个数字符

# 查询含有'精'字的所有员工信息
SELECT * FROM emp WHERE ename LIKE '%精%';
# 查询以'孙'开头的所有员工信息
SELECT * FROM emp WHERE ename LIKE '孙%';
# 查询第二个字为'兔'的所有员工信息
SELECT * FROM emp WHERE ename LIKE '_兔%';
# 查询没有部门的员工信息
SELECT * FROM emp WHERE dept_name IS NULL;-- SELECT * FROM emp WHERE dept_name = NULL;
# 查询有部门的员工信息
SELECT * FROM emp WHERE dept_name IS NOT NULL;

  1. 排序查询

7.1 语法

 SELECT 字段列表 FROM 表名 ORDER BY 排序字段名1 [排序方式1],排序字段名2 [排序方式2] …;

上述语句中的排序方式有两种,分别是:

  • ASC : 升序排列 (默认值)

  • DESC : 降序排列

注意:如果有多个排序条件,当前边的条件值一样时,才会根据第二条件进行排序

7.2 练习

1)单列排序

使用salary 字段,对emp表数据进行排序(升序/降序)

-- 默认升序排序
ASCSELECT * FROM emp ORDER BY salary;
-- 降序排序
SELECT * FROM emp ORDER BY salary DESC;

2)组合排序

同时对多个字段进行排序,如果第一个字段相同 就按照第二个字段进行排序,以此类推

在薪水排序的基础上,再使用id进行排序,如果薪水相同就以id做降序排序

--组合排序
select * from emp order by salary , eid desc;

  1. 聚合函数

8.1 概念

之前我们做的查询都是横向查询,它们都是根据条件一行一行的进行判断,而使用聚合函数查询是纵向查询,它是对某一列的值进行计算,然后返回一个单一的值(另外聚合函数会忽略null空值。);

8.2 聚合函数分类

函数名 功能
count(列名) 统计数量(一般选用不为null的列)
max(列名) 最大值
min(列名) 最小值
sum(列名) 求和
avg(列名) 平均值

8.3 聚合函数语法

select 聚合函数名(列名) from 表;

注意:null 值不参与所有聚合函数运算

8.4 练习

#1 查询员工的总数
#2 查看员工总薪水、最高薪水、最小薪水、薪水的平均值
#3 查询薪水大于4000员工的个数
#4 查询部门为'教学部'的所有员工的个数
#5 查询部门为'市场部'所有员工的平均薪水

#1 查询员工的总数
-- 统计表中的记录条数 使用 count()
SELECT COUNT(eid) FROM emp;-- 使用某一个字段
SELECT COUNT(*) FROM emp; -- 使用 *
SELECT COUNT(1) FROM emp; -- 使用 1,与 * 效果一样
-- 下面这条SQL 得到的总条数不准确,因为count函数忽略了空值
-- 所以使用时注意不要使用带有null的列进行统计
SELECT COUNT(dept_name) FROM emp;

#2 查看员工总薪水、最高薪水、最小薪水、薪水的平均值
-- sum函数求和, max函数求最大, min函数求最小, avg函数求平均值SELECT
SUM(salary) AS '总薪水',
MAX(salary) AS '最高薪水',
MIN(salary) AS '最低薪水',
AVG(salary) AS '平均薪水'
FROM emp;

#3 查询薪水大于4000员工的个数
SELECT COUNT(*) FROM emp WHERE salary > 4000;

#4 查询部门为'教学部'的所有员工的个数 
SELECT COUNT(*) FROM emp WHERE dept_name = '教学部'; 

#5 查询部门为'市场部'所有员工的平均薪水
SELECT AVG(salary) AS '市场部平均薪资' FROM emp WHERE dept_name = '市场部';

  1. 分组查询

9.1 语法

 SELECT 字段列表 FROM 表名 [WHERE 分组前条件限定] GROUP BY 分组字段名 [HAVING 分组后条件过滤];

注意:分组之后,查询的字段为聚合函数和分组字段,查询其他字段无任何意义

-- 按照性别进行分组操作
SELECT * FROM emp GROUP BY sex; -- 注意 这样写没有意义 

image7

9.2 练习

1.通过 性别字段 进行分组, 求各组的平均薪资

SELECT sex, AVG(salary) FROM emp GROUP BY sex;

#1.查询所有部门信息 
select dept_name as '部门名称' from emp group by dept_name;
#2.查询每个部门的平均薪资 
select dept_name as '部门名称', avg(salary) as '平均薪资' from emp group by dept_name;
#3.查询每个部门的平均薪资, 部门名称不能为null 
select dept_name as '部门名称',
avg(alary) as '平均薪资'
from emp
where dept_name is not null group by dept_name;

查询平均薪资大于6000部门.

分析:

  1. 需要在分组后,对数据进行过滤,使用 关键字 hiving

2)分组操作中的having子语句,。是用于在分组后对数据进行过滤的,作用类似于where条件。

sql 实现

标签:--,数据库,表名,基础,查询,emp,MySQL,SELECT
From: https://www.cnblogs.com/zcf94264/p/17086983.html

相关文章

  • mysql悲观锁 (使用行级锁,走索引字段,必须是具体值)
        不需要加锁,一行更新语句即可,符合原子性   对于没有加注解的,mysql也会对增删改的自动加上事务,autocommit=0的时候才没有事务,其他都有事务开启......
  • mysql创建视图注意事项
    转自:https://www.cnblogs.com/cctvyuzhou/p/8985582.html可以使用CREATEVIEW语句来创建视图语法格式如下:CREATEVIEW<视图名>AS<SELECT语句>语法说明如下。1......
  • python mysql直接导出excel文件
    importpymysqlimportxlwt#数据库连接对象conn=pymysql.connect(host='124.71.72.144',port=3306,user='root',password="gClUjjCh2tozZY23o",db="pay",chars......
  • 零基础学前端之CSS选择器的权重
    在前面,我们学习了样式表引入的优先级判断。如果多个选择器都来修饰同一个元素,优先级又该如何判断呢?我们来看一个例子。<!DOCTYPEhtml><htmllang="en"><head><metachars......
  • Linux基础课:第四章--ssh
    第四章的学习ssh配置ssh免密登录首先在.ssh/.config创建文件,初始化server信息。然后利用公钥或者命令ssh-copy-id登录scp两个终端之间传递文件scp[-r]sourcedest......
  • shell 编程基础
    变量类型Shell中按照变量的作用域和生命周期,Shell变量可分为四大类:(1)永久环境变量:需要修改配置文件,变量永久生效。(2)临时环境变量:使用export命令行声明即可,变量在Shell脚......
  • 【推荐】MySQL数据库设计SQL规范
    1命名规范1、【强制】库名、表名、字段名必须使用小写字母并采用下划线分割,禁止拼音英文混用;(禁用-,-相当于运算符)2、【建议】库名、表名、字段名在满足业务需求的条件下使用......
  • 安装MySQL
    1.登录https://dev.mysql.com/downloads/2.下载MySQLInstallerforWindows3.安装MySQLInstallerforWindows4.启动MySQL服务5.验证:打开MySQL8.0CommandLineC......
  • Java基础学习10--算法
     队列(2023-02-02)使用数组模拟队列(未优化)1.需要用的变量有front=-1,rear=-1,maxsize以及数组int[]arr;2.判断队列已满的条件是rear==maxsize-1,队列为空的条件是rear==fro......
  • vim基础用法
    如何退出Esc+:q(或者:wq,如果你改了东西要保存的话;:!q不保存,强制退出)讲个笑话:我用vim三年了,因为我到现在都不知道怎么退出!删除所有内容Esc+ggdG跳转到指定行E......