MySQL数据库-MySql基础&SQL入门

222 阅读12分钟

数据库的基本概念

什么是数据库

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

为什么使用数据库

存储方式优点缺点
内存速度快不能够永久保存,数据是临时状态的
文件数据是可以永久保存的使用IO流操作文件, 不方便
数据库1.数据可以永久保存
2.方便存储和管理数据
3.使用统一的方式操作数据库(SQL)
占用资源,有些数据库需要付费(比如Oracle数据库)

常见的数据库

数据库名介绍
MySql开源免费的数据库
因为免费开源、运作简单的特点,常作为中小型的项目的数据库首选。
MySQL1996年开始运作,目前已经被Oracle公司收购了. MySQL6.x开始收费
Oracle收费的大型数据库,Oracle公司的核心产品。
安全性高
DB2IBM公司的数据库产品,收费的超大型数据库。
常在银行系统中使用
SQL ServerMicroSoft 微软公司收费的中型的数据库。
C#、.net等语言常使用。
但该数据库只能运行在windows机器上,扩展性、稳定性、安全性、性能都表现平平。

SQL

SQL的概念

  • 结构化查询语言(Structured Query Language)简称SQL,是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。
  • 是所有关系型数据库的统一查询规范,不同的关系型数据库都支持SQL
  • 所有的关系型数据库都可以使用SQL
  • 不同数据库之间的SQL有一些区别

SQL通用语法

  • SQL语句可以单行或者多行书写以分号结尾
  • 可以使用空格和缩进增加语句的可读性
  • MySql中使用SQL不区分大小写,一般关键字大写数据库名表名列名小写
  • 注释方式
注释语法说明
-- 空格单行注释
/* */多行注释
#MySql特有的单行注释
# show databases; 单行注释 
-- show databases; 单行注释 
/* 
    多行注释 
    show databases; 
*/

SQL的分类

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

image.png

DDL操作数据库

创建数据库

命令说明
create database 数据库名;创建指定名称的数据库。
create database 数据库名 character set字符集;创建指定名称的数据库,并且指定字符集(一般都指定utf-8)
/* 
    方式1 直接指定数据库名进行创建 
    默认数据库字符集为:latin1 
*/
CREATE DATABASE db1; 

/* 
    方式2 指定数据库名称,指定数据库的字符集 
    一般都指定为utf8,与Java中的编码保持一致 
*/
CREATE DATABASE db1_1 CHARACTER SET utf8;

查看/选择数据库

命令说明
use 数据库切换数据库
select database();查看当前正在使用的数据库
show databases;
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;

DDL操作数据表

MySQL常见的数据类型

类型描述
int整型
double浮点型
varchar字符串型
date日期类型,给是为 yyyy-MM-dd ,只有年月日,没有时分秒
  • 注意:MySQL中的char类型与varchar类型,都对应了Java中的字符串类型,区别在于:
    • char类型是固定长度的: 根据定义的字符串长度分配足够的空间。
    • varchar类型是可变长度的: 只使用字符串长度所需的空间

创建表

  • 语法格式:
CREATE TABLE 表名(
	字段名称1 字段类型(长度),
	字段名称2 字段类型(长度)注意最后一列不要加逗号
);
  • 需求1:创建商品分类表
-- 切换到数据库db1
USE db1;

-- 创建表
CREATE TABLE category(
    cid INT,
    cname VARCHAR(20)
);
  • 需求2:创建测试表
-- 创建测试表
CREATE TABLE test1(
    tid INT,
    tdate DATE
);
  • 需求3:快速创建一个表结构相同的表(复制表结构) create table 新表名 like 旧表名
-- 创建一个表结构与test1相同的test2表
CREATE TABLE test2 LIKE test1; 
-- 查看表结构 
DESC test2;

查看表

命令说明
show tables;查看当前数据库中的所有表名
desc 表名;查看数据表的结构
-- 查看当前数据库中的所有表名 
SHOW TABLES; 

-- 显示当前数据表的结构 
DESC category; 

-- 查看创建表的SQL语句 
SHOW CREATE TABLE category;

删除表

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

-- 先判断再删除test2表 
DROP TABLE IF EXISTS test2;

修改表

  • 修改表名 rename table 旧表名 to 新表名

  • 需求:将category表 改为 category1

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

  • 需求: 将category表的字符集修改为gbk

alter table category character set gbk;
  • 向表中添加列,关键字ADD alert table 表名 add 字段名称 字段类型

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

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

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

ALTER TABLE category MODIFY cdesc VARCHAR(50);
  • 修改列名称,关键字CHANGE alter table 表名 change 旧列名 新列名 类型(长度);

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

ALTER TABLE category CHANGE cdesc description VARCHAR(30);
  • 删除列,关键字DROP alter table 表名 drop 列名;

  • 需求: 删除分类表中description这列

ALTER TABLE category DROP description;

DML操作表中数据

  • SQL中的DML 用于对表中的数据进行增删改操作

插入数据

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

1)代码准备,创建一个学生表:

# 创建学生表 
CREATE TABLE student( 
    sid INT, 
    sname VARCHAR(20), 
    age INT, 
    sex CHAR(1), 
    address VARCHAR(40) 
);

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

  • 方式1:插入全部字段,将所有字段名都写出来
INSERT INTO student (sid,sname,age,sex,address) VALUES(1,'张三',25,'男','成都');
  • 方式2:插入全部字段,不写字段名
INSERT INTO student VALUES(2,'李四',26,'男','重庆');
  • 方式3:插入指定字段的值
INSERT INTO student (sname) VALUES('小明');

注意:
  1)值与字段必须要对应,个数相同&数据类型相同
  2)值的数据大小,必须在字段指定的长度范围内
  3)varchar、char、date类型的值必须使用单引号,或者双引号包裹。
  4)如果要插入空值,可以忽略不写,或者插入null
  5)如果插入指定字段的值,必须要上写列名

更改数据

update 表名 set 列名 = 值
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 表名
delete from 表名 [where 字段名 = 值]

1)删除sid为1的数据

DELETE FROM student WHERE sid = 1;

2)删除所有数据

DELETE FROM student;

3)如果要删除表中的所有数据,有两种做法

  1. delete from 表名; 不推荐. 有多少条记录 就执行多少次删除操作. 效率低
  2. truncate table 表名: 推荐. 先删除整张表, 然后再重新创建一张一模一样的表. 效率高
truncate table student;

DQL查询表中数据

准备数据

# 创建员工表
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,'2008-08-08','教学部');
INSERT INTO emp VALUES(4,'小红','女',5000,'2015-10-07','市场部');
INSERT INTO emp VALUES(5,'翠花','女',5000,'2011-03-14','市场部');
INSERT INTO emp VALUES(6,'秋香','女',200,'2000-03-14','市场部');
INSERT INTO emp VALUES(7,'石榴','女',10000,'2019-10-07','财务部');
INSERT INTO emp VALUES(8,'妲己','女',3500,'2011-09-14','财务部');
INSERT INTO emp VALUES(9,'赵六','男',20000,'2000-03-04',NULL);
INSERT INTO emp VALUES(10,'小明','男',10,'2020-03-14','财务部');
INSERT INTO emp VALUES(11,'兔八哥','女', 300,'2010-03-14','财务部');

简单查询

  • 查询不会对数据库中的数据进行修改.只是一种显示数据的方式 SELECT

select 列名 from 表名

需求1:查询emp中的所有数据

SELECT * FROM emp; -- 使用*表示所有列

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

SELECT eid,ename FROM emp;

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

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

需求4:查询一共有几个部门

  • 使用去重关键字distinct
-- 使用distinct关键字,去掉重复部门信息 
SELECT DISTINCT dept_name FROM emp;

需求5:将所有员工的工资+1000元进行显示

  • 运算查询 (查询结果参与运算)
SELECT ename , salary + 1000 FROM emp;

条件查询

  • 如果查询语句中没有设置条件,就会查询所有的行信息,在实际应用中,一定要指定查询条件,对记录进行过滤
select 列名 from 表名 where 条件表达式

# 先取出表中的每条数据,满足条件的数据就返回,不满足的就过滤掉

运算符

  1. 比较运算符
运算符说明
> < <= >= = <> !=大于、小于、大于(小于)等于、不等于
BETWEEN ...AND...显示在某一区间的值
例如: 2000-10000之间: Between 2000 and 10000
IN(集合)集合表示多个值,使用逗号分隔,例如: name in (悟空,八戒)
in中的每个数据都会作为一次条件,只要满足条件就会显示
LIKE '%张%'模糊查询
IS NULL查询某一列为NULL的值, 注: 不能写 = NULL
  1. 逻辑运算符
运算符说明
And &&多个条件同时成立
Or ||多个条件任一成立
Not不成立,取反。

需求1:

# 查询员工姓名为翠花的员工信息
# 查询薪水价格为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的所有员工信息
SELECT * FROM emp WHERE salary = 3600 OR salary = 7200 OR salary = 20000;
SELECT * FROM emp WHERE salary IN(3600,7200,20000);

模糊查询通配符

通配符说明
%表示匹配任意多个字符串
_表示匹配一个字符

需求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 IS NOT NULL;