zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

MySQL基础及SQL入门

2023-06-13 09:18:56 时间

SQL 概念

1)什么是SQL? 结构化查询语言(Structured Query Language)简称SQL,是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。 2)SQL的作用

  • 是所有关系型数据库的统一查询规范,不同的关系型数据库都支持SQL
  • 所有的关系型数据库都可以使用SQL
  • 不同数据库之间的SQL 有一些区别 (方言)

命令行登录MySQL

mysql   -h+主机名  -u+用户名  -p+密码 # (使用指定的用户名密码进行登录)
mysql -h+主机IP -u+用户名 -p+密码  #(指定IP方式进行登录)

SQL的分类

分类

说明

数据定义语言

简称DDL(Data Definition Language),用来定义数据库对象:数据库,表,列等。

数据操作语言

简称DML(Data Manipulation Language),用来对数据库中表的记录进行更新。

数据查询语言

简称DQL(Data Query Language),用来查询数据库中表的记录。

数据控制语言

简称DCL(Date Control Language),用来定义数据库的访问权限和安全级别,及创建用户。

DDL操作 数据库

  • 创建数据库
/*
方式1 直接指定数据库名进行创建
默认数据库字符集为:latin1
*/
CREATE DATABASE db1;
/*
方式2 指定数据库名称,指定数据库的字符集
一般都指定为 utf8,与Java中的编码保持一致
*/
CREATE DATABASE db1_1 CHARACTER SET utf8;
  • 查看和选择数据库

命令

说明

use数据库

切换数据库

select database();

查看当前正在使用的数据库

show databases;

查看Mysql中 都有哪些数据库

show create database 数据库名;

查看一个数据库的定义信息

-- 切换数据库 从db1 切换到 db1_1
USE db1_1;
-- 查看当前正在使用的数据库
SELECT DATABASE();
-- 查看Mysql中有哪些数据库
SHOW DATABASES;
-- 查看一个数据库的定义信息
SHOW CREATE DATABASE db1_1;
  • 修改数据库
-- 将数据库db1 的字符集 修改为 utf8
ALTER DATABASE db1 CHARACTER SET utf8;
-- 查看当前数据库的基本信息,发现编码已更改
SHOW CREATE DATABASE db1;
  • 删除数据库
-- 删除某个数据库(drop database 数据库名)
DROP DATABASE db1_1;

DDL 操作数据表

  • MySQL常见的数据类型

注意:MySQL中的 char类型与 varchar类型,都对应了 Java中的字符串类型,区别在于: char类型是固定长度的: 根据定义的字符串长度分配足够的空间。 varchar类型是可变长度的: 只使用字符串长度所需的空间。比如x char(10) 占用10个字节 y varchar(10) 占用3个字节。

  • 创建表
CREATE TABLE 表名(
字段名称1 字段类型(长度),
字段名称2 字段类型 注意 最后一列不要加逗号
);
#如下:
CREATE TABLE category(
cid INT,
cname VARCHAR(20)
);

-- 创建一个表结构与 category1相同的 category2表
CREATE TABLE category2 LIKE category1;
  • 查看表
-- 查看当前数据库中的所有表名
SHOW TABLES;
-- 显示当前数据表的结构
DESC category;
-- 查看创建表的SQL语句
SHOW CREATE TABLE category;
  • 删除表
-- 直接删除 test1 表
DROP TABLE test1;
-- 先判断表是否存在,存在的话再删除test2表
DROP TABLE IF EXISTS test2;
  • 修改表
# 修改表名
rename table 旧表名 to 新表名
RENAME TABLE category TO category1;
# 修改表的字符集
alter table 表名 character set 字符集
alter table category character set gbk;
#向表中添加列, 关键字 ADD
alert table 表名 add 字段名称 字段类型
# 为分类表添加一个新的字段为 分类描述 cdesc varchar(20)
ALTER TABLE category ADD cdesc VARCHAR(20);
# 修改表中列的 数据类型或长度 , 关键字 MODIFY
alter table 表名 modify 字段名称 字段类型
ALTER TABLE category MODIFY cdesc VARCHAR(50);
# 修改列名称 , 关键字 CHANGE
alter table 表名 change 旧列名 新列名 类型(长度);
ALTER TABLE category CHANGE cdesc description VARCHAR(30);
# 删除列 ,关键字 DROP
alter table 表名 drop 列名;
ALTER TABLE category DROP description;

DML 操作表中数据

  • 向表中插入数据
insert into 表名 (字段名1,字段名2...) values(字段值1,字段值2...);

首先表中内容定义如下: 表名: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)
);
#方式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('白骨精');

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

  • 更改数据
#语法格式1:不带条件的修改
update 表名 set 列名 = 值
#语法格式2:带条件的修改
update 表名 set 列名 = 值 [where 条件表达式:字段名 = 值 ]
UPDATE student SET age = 20,address = '北京' WHERE sid = 2;
  • 删除数据
# 语法格式1:删除所有数据
delete from 表名
#语法格式2: 指定条件 删除数据
delete from 表名 [where 字段名 = 值]
DELETE FROM student WHERE sid = 1;
# 如果要删除表中的所有数据,有两种做法
#1. delete from 表名; 不推荐. 有多少条记录 就执行多少次删除操作. 效率低
#2. truncate table 表名: 推荐. 先删除整张表, 然后再重新创建一张一模一样的表. 效率高
truncate table student;

DQL 查询表中数据

准备数据

/*创建员工表
表名 emp
表中字段:
eid 员工id,int
ename 姓名,varchar
sex 性别,char
salary 薪资,double
hire_date 入职时间,date
dept_name 部门名称,varchar */
#创建员工表
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-14',NULL);
INSERT INTO emp VALUES(10,'孙悟饭','男', 10,'2020-03-14','财务部');
  • 简单查询
select 列名 from 表名
# 需求1: 查询emp中的 所有数据
SELECT * FROM emp; -- 使用 * 表示所有列
# 需求2: 查询emp表中的所有记录,仅显示id和name字段
SELECT eid,ename FROM emp;
# 需求3: 将所有的员工信息查询出来,并将列名改为中文
# 使用 AS关键字,为列起别名
SELECT
eid AS '编号',
ename AS '姓名' ,
sex AS '性别',
salary AS '薪资',
hire_date '入职时间', -- AS 可以省略
dept_name '部门名称'
FROM emp;
# 需求4:查询一共有几个部门
-- 使用distinct 关键字,去掉重复部门信息
SELECT DISTINCT dept_name FROM emp;
# 需求5: 将所有员工的工资 +1000 元进行显示
SELECT ename , salary + 1000 FROM emp;
  • 条件查询
#先取出表中的每条数据,满足条件的数据就返回,不满足的就过滤掉
select 列名 from 表名 where 条件表达式
  • 运算符

比较运算符

说明

> < <= >= = <> !=

大于、小于、大于(小于)等于、不等于

BETWEEN …AND…

显示在某一区间的值例如: 2000-10000之间: Between 2000 and 10000

IN(集合)

集合表示多个值,使用逗号分隔,例如: name in (悟空,八戒)in中的每个数据都会作为一次条件,只要满足条件就会显示

LIKE ‘%张%’

模糊查询

IS NULL

查询某一列为NULL的值, 注: 不能写 = NULL

逻辑运算符

说明

AND &&

多个条件同时成立时

OR ||

多个条件任一成立

NOT

不成立,取反

# 查询员工姓名为黄蓉的员工信息
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);
  • 模糊查询 通配符

通配符

说明

%

表示匹配任意多个字符串,

_

表示匹配 一个字符

# 查询含有'精'字的所有员工信息
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;