-- 查询所有的数据库列表
-- 先记着这个
-- sql 执行顺序优先级由高到低依次是:
-- from 关键字后面的语句、 where 关键字后面的语句(所以通常操作不到别名,因为是select后操作的)、 group by 后面的语句、 select 后面的语句
-- order by 后面的语句
-- 当然还有其他语句或者他的顺序,这里就不多说了,具体可以百度,这里只给出主要的语句和顺序
SHOW DATABASES;
/*
对数据库操作的分类包含:
CRUD
C create 创建 代码里insert
R retrieve 查询 代码里select
U update 修改 代码里update
D delete 删除 代码里delete
使用数据库
*/
/*
创建数据库 方式1: 指定名称的数据库
latin1 编码
*/
CREATE DATABASE db1;
/*
指定字符集的方式创建数据库
utf8
*/
CREATE DATABASE db1_1 CHARACTER SET utf8;
/*
查看数据库
*/
-- 切换数据库
USE db1_1;
-- 查询当前正在使用的数据库
SELECT DATABASE();
-- SELECT 英文意思:选取
-- 查询MySql中有哪些数据库
SHOW DATABASES;
-- 修改数据库的字符集
-- 语法格式 alter database 数据库名 character set utf8;
ALTER DATABASE db1 CHARACTER SET utf8;
-- 查询当前数据库的基本信息
SHOW CREATE DATABASE db1; -- 可以理解为展示创建该数据库的sql语句,sql规定这样写
-- 之所以没有单个展示,是因为有了全部展示了,所以不需要,然后可以直接use 数据库名,然后切换了
-- alter 英文意思:更改
-- show 英文意思:展示
-- 删除数据库
-- 语法格式 drop database 数据库名称 将数据库从MySql中永久删除
DROP DATABASE db1_1; -- 慎用
-- drop 英文意思:减少
/*
DML 对表中的数据进行 增删改
增加
语法格式: insert into 表名 (字段名1,字段名2...) values(字段值1,字段值2...)
*/
-- 创建学生表
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,'孙悟空',18,'男','花果山');
-- 方式2 插入全部字段 不写字段名
INSERT INTO student VALUES(2,'孙悟饭',5,'男','地球');
-- 方式3 插入指定字段
INSERT INTO student (sid,sname) VALUES(3,'蜘蛛精');
-- 注意事项
-- 1.值与字段必须对应 个数&数据类型&长度 都必须一致
INSERT INTO student (sid,sname,age,sex,address) VALUES(4,'孙悟空',18,'男','花果山');
-- 2.在插入 varchar char date 类型的时候,必须要使用 单引号 或者双引号进行包裹
INSERT INTO student (sid,sname,age,sex,address) VALUES(4,'孙悟空',18,'男','花果山');
-- 3.如果插入空值 可以忽略不写 或者写 null
INSERT INTO student (sid,sname) VALUES(5,'唐僧');
INSERT INTO student (sid,sname,age,sex,address) VALUES(6,'八戒',NULL,NULL,NULL);
-- 其中values(value)后面添加值时,可以添加多个,用逗号隔开
-- 如values(1,1),(2,2)这样的写法,当然以此类推,可以写多个
/*
修改操作
语法格式1: update 表名 set 列名 = 值
语法格式2: update 表名 set 列名 = 值 [where 条件表达式: 字段名 = 值]
*/
-- 修改表中的所有的学生性别为女
UPDATE student SET sex = '女'; -- (慎用!!)
-- 带条件的修改 将sid为 1的数据,性别改为男
UPDATE student SET sex = '男' WHERE sid = 1;
-- 一次性修改多个列
-- 修改sid 为 5的这条数据, 年龄改为20, 地址改为 大唐
UPDATE student SET age = 20 , address = '大唐' WHERE sid = 5;
/*
删除
语法格式1: delete from 表名;
语法格式2: delete from 表名 [where 条件];
*/
-- 删除 sid为 6的数据
DELETE FROM student WHERE sid = 6;
-- 删除所有数据
DELETE FROM student;
-- 删除所有数据的方式 两种
-- 1. delete from 表; 不推荐,对表中的数据逐条删除,效率低,因为要回收很多次,即判断多次
-- 2. truncate table 表; 推荐,删除整张表,然后再创建一个一模一样的新表
-- 位置不变,是因为在操作前,就已经确认了
-- 类似于drop table 表名删除表后,再用create创建表,其中创建的表与删除的表一模一样的,只不过没有值
INSERT INTO student VALUES(1,'孙悟空',20,'男','花果山');
TRUNCATE TABLE studen
-- insert 英文意思:插入
-- delete 英文意思:删除
-- update 英文意思:更新
-- select 英文意思:选取
-- into 英文意思:进入
-- from 英文意思:来自
-- where 英文意思:在该情况下
-- set 英文意思:设置,写在表名后面,where前面
-- charactor 英文意思:字符
-- truncate 英文意思:截断
-- values(value) 英文意思:值,这两个都可以插入数据,values插入单行快,value插入多行快
-- 多行,代表多条数据,单行,代表一条数据
-- 比如insert into 表 value(),(),就是多行,而insert into 表 values(),就是单行
注意:在插入时,若你不写字段名,那么必须要插入全部字段(也就是值),不可以少,否则报错
因为若少了,则不知道对应字段的字段名是什么
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','财务部');
INSERT INTO emp VALUES(11,'兔八哥','女', 300,'2010-03-14','财务部');
简单查询---------------------------------
查询不会对数据库中的数据进行修改,只是一种显示数据的方式 SELECT
条件查询-------------------------------
如果查询语句中没有设置条件,就会查询所有的行信息,在实际应用中,一定要指定查询条件,对记录进行过滤
运算符--------------------
比较运算符:
运算符
说明
> < <= >= = <> !=
大于、小于、大于(小于)等于、不等于
BETWEEN …AND…
显示在某一区间的值,例如: 2000-10000之间: Between 2000 and 10000
IN(集合)
集合表示多个值,使用逗号分隔,例如: name in (悟空,八戒) in中的每个数据都会作为一次条件 只要满足条件就会显示
LIKE ‘%张%’
模糊查询,含有"张"字
IS NULL
查询某一列为NULL的值,注: 不能写 = NULL
逻辑运算符-------------------------
运算符
说明
And &&
多个条件同时成立
Or | |
多个条件任一成立
Not
不成立,取反
模糊查询 通配符------------------------------
通配符
说明
%
表示匹配任意多个字符串
_
表示匹配 一个字符
/*
DQL
简单查询
select 列名 from 表名;
*/
-- 查询emp 表中的所有数据
SELECT * FROM emp; -- * 表示所有的列
-- 查询所有数据 只显示 id 和 name
SELECT eid, ename FROM emp;
-- 查询所有的数据,然后给列名 改为中文
SELECT * FROM emp;
-- 别名查询 使用关键字 as
SELECT
eid AS '编号',
ename AS '姓名',
sex AS '性别',
salary AS '薪资',
hire_date AS '入职时间',
dept_name '部门名称' -- as 可以省略
FROM emp;
-- 查询一共有几个部门
SELECT dept_name FROM emp;
-- 去重操作 关键字 distinct,放前面,即前面不可有字段,否则报错
-- 且如果后面有多个字段,比如DISTINCT a ,b,那么必须是a和b字段都相同,才会去重,单个相同不会去重(去掉)
SELECT DISTINCT dept_name FROM emp;
-- 将我们的员工薪资数据 +1000 进行展示(一般也可以操作字段之间的操作,在其他数据库可能有所不同)
SELECT ename, salary+1000 AS salary FROM emp;
-- 当操作上面的数据时,会显示salary+1000的字段给你看,而不是salary,可以用as来表示回去
-- 注意: 查询操作 不会对数据表中的数据进行修改,只是一种显示的方式
/*
条件查询
语法格式: select 列名 from 表名 where 条件表达式
比较运算符
> < <= >= = <> !=
BETWEEN ... AND ... 在两者之间,且包括两者,如BETWENN 1000 AND 2000
在1000和2000之间,包括1000和2000
通常用于条件查询,放在字段后面,进行判断,然后查询对应结果
但这里需要注意:对应的''或者""包括的,一般有特殊的不能写,比如"100",'100'等等, 无论中间是否加上信息(比如-),否则会导致查询失败(一般日期的数字范围不会出现这样的情况)
即不会返回数据,所以由于特殊的情况有很多,所以最好不加''或者""
IN(集合) 包含集合的东西,如IN(1000,2000),包含1000和2000(不是或,而是与)
通常用于条件查询,放在字段后面,进行判断,然后查询对应结果
LIKE,模糊查询,如LIKE '%和%',含有"和"字,LIKE '%和',"和"字结尾,LIKE '和%',"和"字开头
如LIKE '-和-',"和"字前面和后面必须只能由一个字
LIKE '_和',"和"字结尾,但前面必须只能有一个字
LIKE '和_',"和"字开头,但后面必须只能有一个字
%表示匹配任意多个字符串,即可以是零个,_表示匹配 一个字符
通常用于条件查询,放在字段后面(不一定放在字段后面,如show variables like 'autocommit')
进行判断,然后查询对应结果,即可以理解为对数据进行选择(必须有操作对象)
当然也可以直接查对应的,如LINK '和',直接查"和"字
IS 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;
SELECT * FROM emp WHERE salary >= 5000 AND salary <= 10000;
# 查询薪水价格是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 = null; 错误方式
-- 不可以与null进行判断
SELECT * FROM emp WHERE dept_name IS NULL;
# 查询有部门的员工信息
SELECT * FROM emp WHERE dept_name IS NOT NULL;
-- not不可以写is前面,否则报错,sql规定这样写
-- 条件查询 先取出表中的每条数据,满足条件的就返回,不满足的就过滤
-- select 英文意思:选取
-- as 英文意思:如同
-- distinct 英文意思:不同的
-- 最后注意:默认情况下,where或者其他的条件的,默认为true,即会显示数据,如果你通过条件使得结果是false,那么不会显示,这也是条件的底层原因,也就是说,如果是where a>6 && false,那么就没有a>6的数据了