MySql
这里就使用SQLyog来操作数据库
MySql的目录结构
数据库管理系统
即DBMS,指一种操作和管理维护数据库的大型软件
数据库表
SQL
不同的关系型数据库都支持SQL
DDL操作 数据库
/*
创建数据库方式一:指定名称的数据库
*/
CREATE DATABASE db1;
/*
指定字符集的方式创建数据库 utf-8
*/
CREATE DATABASE db1_1 CHARACTER SET utf8;
/*
查看数据库
*/
USE db1;#切换数据库
SELECT DATABASE();#查询当前正在使用的数据库
SHOW DATABASE();#查询数据库
-- 修改数据库的字符集
-- 语法格式: alter database 数据库名 character set utf8;
ALTER DATABASE db1 CHARACTER SET utf8;
-- 查询当前数据库基本信息
SHOW CREATE DATABASE db1;
-- 删除数据库
-- 语法格式 drop database 数据库名称
DROP DATABASE db1_1;
MySql中常见数据类型
/*
创建表的语法格式
CREATE TABLE 表名{
字段名称 字段类型(长度),
字段名称2 字段类型,
字段名称3 字段类型 这里不要加逗号
};
MySql中常见的数据类型
int 整型
double 浮点型
varchar 字符串型
date 日期类型 只显示年月日 没有时分秒 yyyy-MM-dd
datetime 年月日时分秒 yyyy-MM-dd HH:mm:ss
char 在mysql中char类型也代表字符串
*/
varchar和char类型的区别?
- varchar特点:可变长度的 存储字符串时 只使用所需的空间、
- char类型的特点:是固定长度的,指定了多少长度,创建时就使用多少。
保存指定长度数据如密码时,可用char;保存长度在一定范围内有变化的,如名字,用varchar - 方便理解,举个例子:若同时创建char(20)和varchar(20),把字符’abc’存进去。对于char(20),'abc’后面有17个空格,而varchar(20)长度立马变为3。但char的存取速度还是比varchar快
创建表
-- 创建商品分类表
/*
表名 category
cid int 分类id
cname varchar 分类的名称
*/
USE db1;
CREATE TABLE category(
cid INT,
cname VARCHAR(20)
);
-- 创建测试表
/*
表名 test1
tid int 分类id
tdate date
*/
USE db1;
CREATE TABLE test1(
tid INT,
tdate DATE
);
-- 快速创建一个表结构相同的表(复制表结构)
-- 语法结构 create table 新表名称 like 旧表名称
-- 创建一个与test1表结构相同的表
USE db1;
CREATE TABLE test2 LIKE test1;
-- 查看表结构
DESC test2;
查看表
-- 查看表结构
DESC test1;
-- 查看当前数据库中所有表名
SHOW TABLES;
-- 查看创建表的sql
SHOW CREATE TABLE category;
删除表
-- drop table 表名;
-- drop table if exists 表名;判断表名是否存在,如果存在就删除 不存在就不执行删除
DROP TABLE IF EXISTS test1;
DDL操作数表
修改
-- 修改表名称 rename table 旧表名 to 新表名
RENAME TABLE category TO category1;
-- 修改表字符集为gbk alter table 表名 character set 字符集
ALTER TABLE category1 CHARACTER SET gbk;
-- 向表中添加一个字段 关键字:add
-- 语法格式:alter table 表名 add 字段名称 字段类型(长度)
ALTER TABLE category1 ADD add111 VARCHAR(10);
-- 修改表中列的类型或长度 关键字 modify
-- alter table 表名 modify 字段名称 字段类型
ALTER TABLE category1 MODIFY add111 VARCHAR(50);
ALTER TABLE category1 MODIFY cdes CHAR(20);
-- 修改列的名称 alter table 表名 change 旧列名 新列名 类型(长度)
ALTER TABLE category1 CHANGE cdes dedede VARCHAR(30);
-- 删除列 ALTER TABLE 表名 DROP 列名
ALTER TABLE category1 DROP dedede;
DML对表中数据进行 增删改
插入操作
-- 增加 insert into 表名{字段名1,字段名2,...} values {字段值1,字段值2,...}
USE db1;
CREATE TABLE student(
sid INT,
sname VARCHAR(20),
age INT,
sex CHAR(1),
address VARCHAR(40)
);
-- 向学生表中插入数据
-- 方式一 插入全部字段 将所有字段名都写出来
INSERT INTO student (sid,sname,age,sex,address) VALUES (1,'张三',10,'男','花果山');
-- 方式二 插入全部字段 不写字段名
INSERT INTO student VALUES (2,'李四',20,'男','水帘洞');
-- 方式三 插入指定字段
INSERT INTO student (sid,sname) VALUES (4,'蜘蛛精');
注意
- 在插入varchar、char、date类型的时候,必须要使用单引号 或者双引号进行包裹(尽量使用单引号)
- 插入空值可以忽略不写或写null
修改操作
/*
语法格式1:update 表名 set 列名 = 值
语法格式2:update 表名 set 列名 = 值[where 条件表达式: 字段名=值]
*/
-- 修改表中所有性别为女
UPDATE student SET sex = '女';
-- 将sid为1的数据,性别改为男
UPDATE student SET sex = '男' WHERE sid = 1;
-- 修改多个列
-- 修改dis为4的这条数据,年龄改为40,地址改为大唐
UPDATE student SET age = 40,address = '大唐' WHERE sid = 4;
删除操作
/*
语法格式1:delete from 表名
语法格式2:delete from 表名[where 条件]
*/
-- 删除sid为2的数据
USE db1;
DELETE FROM student WHERE sid = 2;
-- 删除全部数据
-- 1.delete from 表名 不推荐 对表中数据进行逐条删除,效率低
-- 2.truncate table 表; 推荐,删除整张表,再创建一个一模一样的新表
TRUNCATE TABLE student;
简单查询
准备数据
-- 创建表
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);
DQL查询
条件查询就是先取出表中的每条数据,满足条件的就返回,不满足的就过滤
-- 查询emp表中的所有数据
SELECT * FROM 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;
-- 查询一共有几个部门
SELECT dept_name FROM emp;
-- 要加入去重操作
-- 将我们的员工薪资数据+1000进行展示
SELECT ename,salary+1000 AS salary FROM emp;
注意:查询操作不会对数据库中数据进行修改,只是一种显示的方式
条件查询
语法格式
/*
语法格式:select 列名 from 表名 where 条件表达式
比较运算符 > < <= >= = 不等于运算符: <> !=
Between... AND 在某一区间
IN(集合) 如 name in(悟空,八戒)
LIKE'%张%' 模糊查询
S NULL 查询某一列为NULL的值
逻辑运算符
AND
OR
NOT 取反
*/
需求一
# 查询员工姓名为黄蓉的员工信息
-- 1.查哪张表 2.查哪些字段 3.查询条件
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;-- 包含10000和5000
# 查询薪水价格是3600或7200或者20000的所有员工信息
SELECT * FROM emp WHERE salary = 3600 OR salary = 7200 OR salary = 20000;
-- 方式2,使用in()匹配括号中的需求
SELECT * FROM emp WHERE salary IN(3600,7200,20000);
需求二
/*
LIKE '%精%'
% 通配符,表示匹配多个字符串 '%精'表示前面是什么都可以,最后一个子是精就行
_ 通配符,匹配一个字符 如'_精'会匹配'孔精'、'天精'等 '__精'可匹配'白骨精'
*/
# 查询含有'精'字的所有员工信息
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;