如何通过MySQL进行数据库基本操作

介绍

本文博客基于数据库MySQL8.0.23,编译器IntelliJ IDEA 2019.3.3,在IDEA中进行数据库连接并进行SQL基本语句操作。

1.连接数据库

首先打开IDEA工作界面,新建工程,打开数据库Database,点击DaTa Source进入数据库连接界面,
首先打开IDEA工作界面,点击database选择来源中MySQL
输入用户名及密码,测试连接成功后就点击OK,就可以连接好数据库了。
测试成功
在连接好图后可以得到下图的效果。SQL的数据库在右边可一一展示,也可以选择只展示一部分。左半部分的空白部分,是编写数据库程序的地方,可以把cmd命令里的指令操作给可视化操作。
在这里插入图片描述




2. 进行数据库SQL编写的基本语句

进入数据库后,需要掌握 基本的SQL语句进行数据库、表的建立和操作;也需要掌握查询的基本方式;积累一些常用的SQL函数集合。 本模块着重介绍这方面的基本内容,包括代码即样例。

创建数据库,表以及更新数据的方法

(1)【创建/使用/删除】【数据库/表】

在学习掌握数据库基本命令的过程中,创建/删除 是最为重要的命令。利用CREATE命令来创建数据库和表。DROP命令删除。USE 命令使用数据库,实现数据库间的切换。
比如说,我们要建立一个名字叫做 WNB 的数据库,里头要有一个叫做 student的表格,表格里分为学号,姓名,年级号,性别,出生日期,家庭地址,邮箱。


-- 建立数据库,把create替换为drop即删除数据库
create database if not exists WNB;
use WNB #使用数据库/表
create table if not exists student(
    `id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '学号',
    `name` VARCHAR(30) NOT NULL COMMENT '姓名',
    `gradeid` INT(1) NOT NULL COMMENT '年级号',
    `sex` VARCHAR(2) NOT NULL COMMENT '性别',
    `birthday` DATETIME DEFAULT NULL COMMENT '出生日期',
    `address` VARCHAR(100) DEFAULT NULL COMMENT '家庭住址',
    `email` VARCHAR(50) DEFAULT NULL COMMENT '邮箱',
    PRIMARY KEY(`id`)
)ENGINE = INNODB DEFAULT CHARSET=utf8 
-- 建立表,INNOBE是引擎,CHARSET是字体形式,一般这种配置显示汉字比较好

(2)【更改】【数据库/表】

更改数据库、表的命令中,DESC 命令,显示出表的结构信息,可以用来检查修改情况。此外,在进行修改时:ALTER 是最为重要的命令。利用RENAME AS命令来修改表名。MOTIFY/CHANGE命令都可以进行字段的修改,只不过Change命令只重命名字段,而Modify可以修改约束和字段类型。drop 命令删除操作。

-- 显示表结构
DESC student;
-- 修改表
ALTER table student RENAME AS student1;
-- 添加字的字段
ALTER TABLE student ADD age INT(11);
-- 修改表的字段
ALTER TABLE student MODIFY age VARCHAR(11); -- 修改约束和字段类型
ALTER TABLE student CHANGE age age1 INT(1); -- 重命名字段
-- 删除字段
ALTER TABLE student DROP age1;
-- 删除表
DROP TABLE IF EXISTS student;

(3)【更改】【表信息】

更改数据库、表的信息命令时,INSERT INTO 插入命令,是最为重要的命令。格式为INSERT INTO 标明 (字段1,字段2……)VALUES(对应字段1,对应字段2……),比如说我们插入三个数据,如下代码操作即可。

UPDATE命令来设置数据,往往联立WHERE命令进行条件的判断。

DELETE命令和TRUNCATE 命令都可以对表中数据进行删除操作。只不过TRUNCATE 命令会清空数据表,让计数器归零。

可以训练以下的代码内容:

-- 插入操作:需要一一对应,需要以“;”结尾
INSERT INTO `student`(`id`,`name`,`gradeid`,`sex`,`birthday`,`address`,`email`) 
VALUES (1000,'张三',3,'男','2004-8-9','宿舍楼A101','[email protected]'),
       (1001,'李四',3,'女','2005-4-9','宿舍楼C101','[email protected]'),
       (1002,'王五',3,'男','1999-12-9','宿舍楼A201','[email protected]');
-- 更新数值操作
UPDATE `student` SET `name` = '赵六' WHERE id =1001; -- where表示条件判断
-- 清空指定信息
DELETE FROM `student` WHERE id=1000;  -- 清空指定信息,但不会影响计数器
TRUNCATE `student`  -- 清空student表,计数器会归零,不会影响事务

注意:可用同样的方式可以自己创建result,subject等表内容,插入自己的数值结果。

查询操作

(1)查询【基本知识】和【命令】

查询命令即SELECT ,是最为重要的命令,也是数据库操作中最为重要的基础内容。格式为SELECT [某一(些)字段/*(表示全部)] FROM [表名];对于一些重复出现的信息,用DISTINCT命令进行去重,保留一个信息。

除了WHERE命令外,LIKE命令所支持的模糊查询,也一样应用广泛,需要掌握。其中“%”表示字符数不限,一个“_”只能代表一个字符, 通过一一比对字符,来判定查询结果。

可以进行如下的训练操作。

-- 查询全部学生
SELECT * FROM student;
-- 查询指定字段
SELECT `id` AS 学号,`name` AS 姓名 FROM student;
-- 查询全部成绩,distinct去重,每个学号只显示一条
SELECT DISTINCT `id` FROM result;
-- 查看版本
SELECT VERSION();
-- 考试成绩+1分显示
SELECT `id`,`mark`+1 AS '提分后' FROM result;
-- where选择查询
SELECT `id`,`subid`,`mark` FROM result
WHERE id !=1000;
-- Like模糊查询
SELECT `id`,`name` FROM student
WHERE `name` LIKE '%牛%'; -- %表示N位数,一个“_”表示一个字母

(2)【联合查询】

联合查询是联合多张表进行数据的查询,是查询的重点和难点,也是实现数据库目标功能查询的重要手段。 联合查询最主要分为联合交叉查询、左、右联表查询三种形式。

JOIN ,是联合查询最为标志性的命令,前面通过搭配INNER、LEFT、RIGHT来实现查询的分类。格式为:SELECT [内容] FROM [表] AS [新的名称1] [联合方式] JOIN [表2] AS [新的名称2] ON [新的名称1].[某字段]= [新的名称2].[某字段] 对于 ON 代表的是选择条件,显然两个都会有相同字段的表,才能联合起来一起查询,为避免两个表中查询的字段混叠,需要在SELECT中确定选择查询的是哪一张表的信息。 左右联表查询的返回值即为哪个表的值,另一个表的更改,不会引起查询结果的变换。

可以进行如下的训练操作。

-- 联合查询
-- 格式:联立subject表和result表,课程id号是联合的媒介,
-- 注意书写格式,对于媒介字段需要特别标明是选自哪个表的。
SELECT id,s.subid,subname,mark
FROM `subject` AS s
INNER JOIN result AS r
ON s.subid=r.subid

-- 左右联表
-- 注意:与联合查询不同之处在于命令,左Left,右Right,
-- 左联表查询会从左表返回所有值即使右表没有匹配,
-- 右联表同理,左右联表和联合查询可以同时使用。
SELECT id,s.subid,subname,mark
FROM `subject` AS s
LEFT JOIN result AS r
ON s.subid=r.subid
-- 注意:由于是左联表查询,返回左表的值即subject,如果
-- result表里内容发生改变,得到的结果不会出现右表的改变。

(3)【分页和排序】

排序和分页都位于Where命令之后,而排序位置靠前分页位置。
排序的命令格式: order by [方式],其中方式填asc为升序;desc降序
分页的命令格式: limit 起始值,页面的大小1

可以进行如下的训练操作:比如在subject表里,建立了一门名叫数据库的课程。要求查询《数据库》课程成绩排名前5的学生信息,并且要求学生该门课程的分数要大于90。 容易知道,需要联合查询科目、成绩以及学生三张表,课程号和学号是连接三张表的纽带。由于成绩排名,并且要取出前5名,所以需要考虑排序和分页。

-- 执行命令:
SELECT s.id,`name`,`subname`,mark
FROM `student` s
         INNER JOIN `result` r
                    ON s.id=r.id
         INNER JOIN `subject` sub
                    ON sub.subid=r.subid
WHERE subname='数据库' AND mark>=90 -- mark是分数字段,可自己设置
ORDER BY mark DESC
LIMIT 0,5

mysql常用函数表

MySQL官网提供非常多的内置函数信息,以下整理的这些函数,对于一般的数据库操作是十非常有用的,所以还请各位收藏保留这部分内容,最好能熟练应用,可事半功倍。

下面是一些内置函数应用练习:

--1)基本函数
-- 数学运算
SELECT ABS(-8) -- 绝对值
SELECT CEILING(9.4) -- 向上取整
SELECT FLOOR(9.4)  -- 向下取整
SELECT RAND() -- 返回随机数
SELECT SIGN(10) -- 判断一个数的符号 0-0,负数-1,正数1
-- 字符串函数
SELECT CHAR_LENGTH('Hello world!') -- 字符串长度
SELECT CONCAT('Hello',' world','!') -- 拼接字符
SELECT INSERT('我爱美食世界',1,2,'超级热爱') -- 查询,
-- 从某个位置开始代替某个长度,本例子是从“我”字符开始替换,2个字节长度,
-- 即把“我爱”替换成“超级喜欢”
SELECT UPPER('wangshen') -- 大写字母
SELECT LOWER('WANGSHEN') -- 小写字母
SELECT INSTR('Wangshen','n') -- 返回第一次出现子串的索引
SELECT REPLACE('A说你很厉害','你','他')  -- 替换出现的指定字符串,你换成他
SELECT SUBSTR('AB说他可是特别牛逼',4,6) -- 返回指定的字符子串(源字符串,截取位置,长度)截取出来“他可是特别牛”
SELECT REVERSE('猫吃鱼') -- 反转,得到鱼吃猫的结果
-- 查询姓 王-->李的同学
SELECT DISTINCT REPLACE(`name`,'王','李') FROM student
WHERE `name` LIKE '王%'
-- 获取时间
SELECT NOW() -- 获取当下时间
SELECT CURDATE() -- 获取当前日期,等同于 SELECT CURRENT_DATE(); SELECT LOCALTIME() -- 获取本地时间;SELECT SYSDATE(); -- 获取系统时间
SELECT DAY(NOW()) -- 获取当下天数
--2)聚合函数
聚合函数用途非常广泛,最常用的来说,分为count,sum,avg,max,min五种。
用法:
SELECT COUNT(*) FROM student; -- 不会忽略NULL
SELECT COUNT(id) FROM student; -- 会忽略NULL值
SELECT COUNT(1) FROM student; -- 本质计算行数
SELECT SUM(`mark`) AS 总和 FROM result
SELECT AVG(`mark`) AS 平均分 FROM result
SELECT MAX(`mark`) AS 最高分 FROM result
SELECT MIN(`mark`) AS 最低分 FROM result
-- 获取成绩单中成绩信息

补充

下面是一道练习查询不同学生指定几门科目的科目成绩,并求总和按高低排序的代码练习。
【题目练习】有学生表student(学号id,姓名name;至少5名学生数据),科目表subject(科目号subid,科目名subname;3门课程),成绩表result1(学号id,课程号subid,成绩mark),利用SQL语言,实现如下查找功能:列出学生学号,姓名,对应《A科》,《B科》,《C科》三门课程的单科成绩,以及总成绩、平均成绩,并按照平均成绩进行高低排名。
【参考代码】

SELECT a1.id '学号', d.`name` '姓名',a1.mark 'A',a2.mark 'B',a3.mark 'C',b.sumscore '总成绩',c.avgscore '平均分'
FROM
    ( SELECT r.id, r.mark FROM result1 r WHERE r.subid = 20200001 ) a1
        LEFT JOIN ( SELECT r.id, r.mark FROM result1 r WHERE r.subid = 20200002 ) a2 ON a1.id = a2.id
        LEFT JOIN ( SELECT r.id, r.mark FROM result1 r WHERE r.subid = 20200003 ) a3 ON a3.id = a2.id
        LEFT JOIN ( SELECT r.id, SUM( r.mark ) sumscore FROM result1 r GROUP BY r.id ) b ON a3.id = b.id
        LEFT JOIN ( SELECT r.id,CAST(AVG( mark ) AS DECIMAL ( 10, 2 )) avgscore FROM result1 r
                    GROUP BY r.id) c ON c.id = b.id
        LEFT JOIN ( SELECT s.id, s.name FROM student s GROUP BY s.id ) d ON c.id = d.id
ORDER BY b.sumscore DESC



  1. limit 起始值,页面的大小[其中:第N页 limit (n-1)* pagesieze, pagesize]。分页的作用,是缓解数据库压力,瀑布流,给人更好的体验 ↩︎

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章