java MySQL数据库 详解

本文详细介绍数据库的概念、存储方式及优缺点,深入解析SQL语言的作用、分类及其在不同数据库中的通用性和差异性。涵盖数据库的创建、修改、删除,表结构的操作,数据的增删改查等核心知识点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.数据库介绍

 1.1 数据概念

 数据的储存方式:

 

存储位置优点缺点
内存速度快不能永久保存,数据是临时状态。
文件数据可以永久保存操作数据不方便,查询某个数据。
数据库

1)数据可以永久保存

2)查询速度快

3)对数据的管理方便

占用资源,需要购买。

1.2 什么是数据库

   (1)存储数据的仓库

   (2 )本质上是一个文件系统,还是以文件的方式存在服务器的电脑上的。

   (3)所有的关系型数据库都可以使用通用的SQL语句进行管理 DBMS DataBase Management System

 2.SQL的概念

    2.1 什么是SQL

        Structured Query Language 结构化查询语言

  2.2 SQL作用

     (1)是一种所有关系型数据库的查询规范,不同的数据库都支持。

      (2)通用的数据库操作语言,可以用在不同的数据库中。

      (3)不同的数据库SQL语句有一些区别‘。

    2.3 SQL语句分类

           (1) Data Definition Language (DDL数据定义语言) 如:建库,建表。

           (2)Data Manipulation Language(DML数据操纵语言),如:对表中的记录操作增删改。

           (3)Data Query Language(DQL 数据查询语言),如:对表中的查询操作

           (4)Data Control Language(DCL 数据控制语言),如:对用户权限的设置

2.4 MySQL的语法

         (1)每条语句以分号结尾,如果在SQLyog中不是必须加的。

         (2)SQL中不区分大小写,关键字中认为大写和小写是一样的。

         (3)数据库中注释        

                   

注释的语法说明
--空格单行注释
/* */多行注释
#这是mysql特有的注释方式

     

3 DDL操作数据库(数据定义语言)

  3.1 创建数据库

     创建数据库的方式:

        (1)创建数据库

                CREATE  DATABASE 数据库名;

        (2)判断数据库是否已经存在,不存在则创建数据库

                 CREATE  DATABASE IF NOT EXISTS 数据库名;

         (3)创建数据库并指定字符集

               CREATE  DATABASE  数据库名 CHARACTER  SET 字符集;

     具体操作:

-- 直接创建数据库db1
create database db1;
-- 判断是否存在,如果不存在则创建数据库db2
create database if not exists db2;
-- 创建数据库并指定字符集为gbk
create database db3 default character set gbk;

  3.2  查看数据库

-- 查看某个数据库的定义信息
SHOW CREATE DATABASE db3;

 3.3 修改数据库

      修改数据库默认的字符集

          AlTER   DATABASE  数据库名  DEFAULT  CHARACTER  SET 字符集;

-- 修改数据库默认的字符集
ALTER DATABASE db2 CHARACTER SET utf8;

3.4 删除数据库

    删除数据库的语法

        DROP  DATABASE 数据库名;

-- 删除数据库
DROP DATABASE bd1;

 3.5 使用数据库

      查看正在使用的数据库:

         SELECT  DATABASE();

     使用/切换数据库

        USE 数据库名;

-- 查看正在使用的数据库
SELECT DATABASE();
-- 使用/切换数据库
USE db2;

4.DDL操作表结构(数据定义语言)

       前提需要使用某个数据库

4.1  创建表

        创建表的格式:

CREATE  TABLE 表名(
    字段名1 字段类型1,
    字段名2 字段类型2
)

       CREATE---创建       TABLE —表           

  4.2 MySQL数据类型

      

分类类型名称类型说明
整数tinyInt微整型:很小的整数(占8位二进制)
smallint小整型:小的整数(占16位二进制)
mediumint中整型:中等长度的整数(占24位二进制)
int(integer)整型:整数类型(占32位二进制)
小数float单精度浮点数,占4个字节
 double双精度浮点数,占8个字节
日期time表示时间类型
 date表示日期类型
 datetime同时可以表示日期和时间类型
字符串char(m)固定长度的字符串,无论使用几个字符都占满全部,M为0~255之间的整数
 varchar(m)可变长度的字符串,使用几个字符就占用几个,M为0~65535之间的整数
大二进制tinyblob
Big Large Object
允许长度0~255字节
 blob允许长度0~65535字节
 mediumblob允许长度0~167772150字节
 longblob允许长度0~4294967295字节
大文本tinytext允许长度0~255字节
 text允许长度0~65535字节
 mediumtext允许长度0~167772150字节
 longtext允许长度0~4294967295字节

      具体操作

       创建student表包含id,name,birthday字段

-- 创建student表包含id,name,birthday字段
CREATE TABLE student(
      id INT,-- 整数
      NAME VARCHAR(20),-- 字符串
      birthday DATE  -- 生日 ,最后没有逗号 
)

  4.3 查看表

          查看某个数据库中所有的表

                  SHOW  TABLES; 

          查看表结构:

                  DESC  表名;

         查看创建表的SQL语句:

                  SHOW   CREATE   TABLE  表名;

-- 使用/切换数据库
USE db2;
-- 查看某个数据库中的所有表
SHOW TABLES;
-- 查看表结构
DESC student;
-- 查看创建表的SQL语句
SHOW CREATE TABLE Student;

     查看表结构的执行结果:

     查看student 的创建表SQL语句,执行结果:

CREATE TABLE `student` (
`id` int(11) DEFAULT NULL,
`name` varchar(20) DEFAULT NULL,
`birthday` date DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8

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

        语法格式:

CREATE TABLE 新表名 LIKE 旧表名;

       具体实现:

-- 快速创建一个表结构相同的表
CREATE TABLE stu LIKE student;
-- 查看表结构
DESC stu;

 4.5 删除表

      直接删除表

DROP TABLE 表名;

     判断表是否存在,如果存在则删除表

DROP TABLE IF EXISTS 表名;

     具体实现:

-- 直接删除表
DROP TABLE stu;
--  判断表是否存在,如果存在则删除表
DROP TABLE IF EXISTS 'stu';

4.6 修改表结构

      (1)添加列表ADD

ALTER TABLE 表名 ADD 列名 类型;
-- 为学生表添加一个新的字段remark,类型为varchar(20)
ALTER TABLE student ADD remark VARCHAR(20);
-- 查看表结构
DESC student;

   执行结果:

      (2)修改列类型 MODIFY

ALTER TABLE 表名 MODIFY 列名 新的类型;
-- 将student表中的remark字段的改成varchar(100)
ALTER TABLE student MODIFY remark VARCHAR(100);
-- 查看表结构
DESC student;

  执行结果:

     (3)修改列名 CHANGE

ALTER TABLE 表名 CHANGE 旧表名  新表名 类型;

         将student 表中的remark 字段名改成intro ,类型varchar(30);

-- 将student表中的remark字段名改成intro,类型varchar(30)
ALTER TABLE student CHANGE remark  intro VARCHAR(30);

  (4)删除列DROP

ALTTER TABLE 表名 DROP 列名;

   删除student 表中的字段intro。

-- 删除student表中的字段intro
ALTER TABLE student DROP intro;

   (5)修改表名

RENAME TABLE 表名 TO 新表名;

       将学生表student改名成student2
 

-- 将学生表student改名成student2
RENAME TABLE student TO student1;

  (6)修改字符集

ALTER TABLE 表名 CHARACTER SET 字符集;

    将student1表的编码修改成gbk:

-- 将student1表的编码修改成gbk
ALTER TABLE student1 CHARACTER SET gbk;

 5.DML操作表中的数据(数据操纵语言)

 对于表中的数据进行增删改操作。

5.1 插入记录

INSERT [INTO] 表名 [字段名] VALUES(字段值)

  INSERT [INTO] 表名:表示往那张表中添加数据

(字段名1,字段名2,...):要给那些字段设置值

  VALUES(值1,值2,..):设置具体的值。

 (1)插入全部字段

      所有的字段名都写出来:

INSERT INTO 表名(字段名1,字段名2,字段名3...)VALUES (值1,值2,值3);

      不写字段名:

INSERT INTO 表名(值1,值2,值3....);

    具体实现:

-- 向表中插入数据
INSERT INTO  stu (id,NAME,age,SEX) VALUES(1,'张三',18,'男');
INSERT INTO stu  VALUES(1,'老子',100,'男');
SELECT * FROM stu;

 

   (2)插入部分数据

INSERT INTO 表名(字段名1,字段名2...)VALUES(值1,值2...);

    注:没有添加数据的字段就是NULL

-- 向表中插入数据
INSERT INTO  stu (id,NAME,age,SEX) VALUES(1,'张三',18,'男');
-- 如果只向表中插入部分数据,必须写对应的列名
INSERT INTO stu (id,NAME,age)  VALUES(1,'老子',100);
SELECT * FROM stu;

   5.2 DOS 命令出现操作数据乱码问题

        当我们使用DOS命令进行SQL命令进行SQL语句进行操作时,会有中文乱码的情况。

(1)INSERT 的注意事项:

              插入的数据应与字段的数据类型相同。

              数据的大小应在列的规定范围内,例如:不能将一个长度为80的字符串加入到长度为40的列中。

             在values中列出的数据位置必须与被加入的列的排列位置相对应

             字符和日期型数据应包含在单引号中。MySQL中也可以使用双引号做为分隔符。

             不指定列或使用null,表示插入空值。

(2)乱码产生的原因

          在客户端的编码默认为GBK,而在MySQL服务器端的编码为UTF-8。

(3)查看MySQL内部设置的编码。

             查看包含character开头的全局变量

SHOW variables like 'character%';

              执行结果:

(4)解决方案:

      修改client、connection、results的编码为GBK,保证和DOS命令行编码保持一致。

单独设置说明
set character_set_client=gbk;修改客户端的字符集为GBK
set character_set_connection=gbk;修改连接的字符集为GBK
set character_set_results=gbk;修改查询的结果字符集为GBK

        同时设置这三项的命令为:

SET names gbk;

       注:DOS命令退出后,编码设置就失效了,每次都需要重新配置。

5.3 蠕虫复制

      蠕虫复制:将一张已经存在的表中的数据复制到另一张表中。

      (1)语法格式:

                将表2 中所有的列复制到表名1中:

INSERT INTO 表名1 SELECT * FROM 表名2;

               只复制部分列:

INSERT INTO 表名1(列1,列2) SELECT 列1,列2 FROM 表名2;

         具体实现:

-- 创建表stu1
CREATE TABLE stu1 LIKE stu;
-- 将表stu 中的数据全部复制到stu1中
INSERT INTO stu1 SELECT * FROM stu;
-- 查看stu1中的数据
SELECT * FROM stu1;
-- 创建表stu2
CREATE TABLE stu2 LIKE stu;
-- 将表stu 中的数据全部复制到stu1中
INSERT INTO stu2(id,NAME,age) SELECT id,NAME,age  FROM stu;
-- 查看stu2中的数据
SELECT * FROM stu2;

   5.4 更新表记录

UPDATE 表名 SET 列名=值[WHERE 条件表达式]

    UPDATE:需要更新的表名

     SET:修改的列值

     WHERE:符合条件的记录才会更新。

(1) 不带条件修改数据

-- 修改所有的行
UPDATE 表名 SET 字段名=值;

(2)带条件修改数据

UPDATE 表名 SET 字段名=值 WHERE [条件表达式];

   具体现实: 

-- 不带条件修改数据,将所有的年龄改成120
UPDATE stu2 SET age=120;
-- 查看stu2中的数据
SELECT * FROM stu2;
-- 不带条件修改数据,将name为张三的age改为18
UPDATE stu2 SET age=18 WHERE NAME='张三';
-- 查看stu2中的数据
SELECT * FROM stu2;

  5.5 删除记录

DELETE FROM 表名 [WHERE 条件表达式];

      如果没有指定WHERE 语句,MySQL表中所有的数据都会被删除。

   (1)不带条件的删除;

DELETE FROM 表名;

    (2) 带条件的删除。

DELETE FROM 表名 [WHERE 条件表达式];

  (3)使用truncate 删除表中所有的记录

TRUNCATE  TABLE 表名;

        truncate 相当于删除表的结构,再创建一张表。

 具体实现:

-- 带条件删除数据,删除age为18的记录
DELETE FROM stu2 WHERE age=18;
-- 查看stu2中的数据
SELECT * FROM stu2;
-- 不带条件删除数据,删除表中的所有数据
DELETE FROM stu2;
-- 查看stu2中的数据
SELECT * FROM stu2;
-- 使用truncate删除表中所有的记录
TRUNCATE TABLE stu1;
-- 查看stu1中的数据
SELECT * FROM stu1;

 6.DQL查询表中的数据(数据查询语言)

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

SELECT 列名 FROM 表名 [WHERE 条件 表达式];

      (1) SELECT 命令可以读取一行或者多行记录

      (2)可以使用 * 代表其他字段,SELECT 语句会返回表中的所有字段数据。

      (3)可以使用WHERE 语句来包含任何条件

6.1 简单的查询

 (1)查询所有行和列的数据

           用*代表所有的列:

SELECT * FROM 表名;

 (2)查询指定列

         查询指定列的 数据,多个列之间用逗号分隔。

SELCET 字段1,字段2,字段3,....FROM 表名;

 6.2 指定列的别名进行查询

     (1)使用关键字

             使用别名的好处: 显示的时候使用新的名字,并不修改表的结构。

    (2)语法格式:

            对列指定别名:

SELCET 字段名1 AS 别名,字段名2 AS 别名....FROM 表名;

          对列和表同时指定别名:

SELCET 字段名1 AS 别名,字段名2 AS 别名...FROM 表名 AS 表别名;

     具体实现:

-- 使用别名
select name as 姓名,age as 年龄 from student;
-- 表使用别名
select st.name as 姓名,age as 年龄 from student as st

6.3 清除重复值

      查询指定列并且结果不出现重复数据

SELCET DISTINCT FROM student;

      具体实现:

-- 查询学生的年龄
SELECT age FROM stu;
-- 去掉重复的记录
SELECT DISTINCT age FROM stu;

 6.4 查询结果参与运算

    (1)某列数据和固定值运算

SELECT 列名1+ 固定值 FROM 表名;

    ( 2)某列数据和其他数据参与运算

SELECT 列名1+列名2 FROM 表名;

     注:参与运算的必须是数值类型。

具体实现:

-- 给所有的年龄+5
SELECT age+5 FROM stu;
-- 查询ID 和age之间的和
SELECT id+age FROM stu;
-- 将查询ID 和age之间的和 作为和
SELECT *,(id+age) AS 和 FROM stu;

6.5 条件查询

     条件查询的语法:

    SELECT 字段名  FROM 表名 WHERE 条件

   准备数据:

       创建一个学生表,包含以下列:

CREATE TABLE student(
     id INT,-- 编号
     NAME VARCHAR(30), -- 名字
     age INT, -- 年龄
     sex VARCHAR(20), -- 性别
     address VARCHAR(100), -- 地址
     math INT, -- 数学
     English INT-- 英语
     
);

-- 添加数据
INSERT INTO student(id,NAME,age,sex,address,math,english) VALUES (1,'马云',55,'男','杭州',66,78),(2,'马化腾',45,'女','深圳',98,87),(3,'马景涛',55,'男','香港',56,77),(4,'柳岩',20,'女','湖南',76,65),(5,'柳青',20,'男','湖南',86,NULL),(6,'刘德华',57,'男','香港',99,99),(7,'马德',22,'女','香港',99,99),(8,'德玛西亚',18,'男','南京',56,65);
-- 查询表中的数据
SELECT * FROM student;

    运算符:

 

比较运算符说明
>、<、<=、>=、=、<><>在SQL中表示不等于,在mysql中也可以使用!=
没有==
BETWEEN...AND在一个范围之内,如:between 100 and 200
相当于条件在100到200之间,包头又包尾
IN(集合)集合表示多个值,使用逗号分隔
LIKE '张%'模糊查询
IS NULL查询某一列为NULL的值,注:不能写=NULL

 具体实现:

-- 查询math分数大于80的学生
SELECT * FROM student WHERE math>80;
-- 查询english分数小于或等于80分的学生
SELECT * FROM student WHERE english<=80;
-- 查询age等于20岁的学生
SELECT * FROM student WHERE age=20;
-- 查询age不等于20岁的学生,注:不等于有两种写法
SELECT * FROM student WHERE age<>20;
SELECT * FROM student WHERE age!=20;

    逻辑运算符:

      

逻辑运算符说明
and 或 &&与,SQL中建议使用前者,后者并不通用。
or 或 ||
not 或 !

 具体实现:

-- 查询age大于35且性别为男的学生(两个条件同时满足)
SELECT * FROM student WHERE age>35 AND sex='男';
-- 查询age大于35或性别为男的学生(两个条件其中一个满足)
SELECT * FROM student WHERE age>35 OR sex='男';
--  查询id是1或3或5的学生,两种写法
SELECT * FROM student WHERE id=1 OR id=3 OR id=5;
SELECT * FROM student WHERE id IN (1,3,5);
-- 查询id不是1或3或5的学生
SELECT * FROM student WHERE id NOT IN (1,3,5);

 范围查询:

     BETWEEN 值1 AND 值2;表示从值1到值2范围,包头又包尾。

     比如:age BETWEEN 80 AND 100 相当于: age>=80 && age<=100;

  like 关键字:LIKE 表示模糊查询。

SELECT * FROM 表名 WHERE 字段名 LIKE '通配符字符串';

  MySQL 通配符:

  

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

具体实现:

-- 查询english成绩大于等于75,且小于等于90的学生
SELECT * FROM student WHERE english>75 AND english<90;
SELECT * FROM student WHERE english BETWEEN 75 AND 90;
-- 查询姓马的学生
SELECT * FROM student WHERE NAME LIKE '马%';
-- 查询姓名中包含'德'字的学生
SELECT * FROM student WHERE NAME LIKE '%德%';
-- 查询姓马,且姓名有两个字的学生
SELECT * FROM student WHERE NAME LIKE '马_';

       

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值