- MySQL里一个数据库就是一个文件夹。
- 文件以frm结尾的是一个表,myd结尾的是一个数据文件。
- 客户端通过数据库管理系统,创建一个至多个数据库,数据库又创建多个数据表,表里又储存多个数据。
- 然后用户可以通过SQL语句操作数据库管理系统,对数据库、数据表、以及表里的数据进行操作(增删改查)了。
SQL
SQL简介
- 它是结构化查询语言,是操作关系型数据库的一门编程语言。
- 定义了操作所有关系型数据库的统一标准。
- 同一需求,不同数据库操作的方式都有所不同。可以成为“方言”
SQL通用语法
- SQL语句可以多行书写,以 ; 分号结尾。
- MySQL数据库的SQL语句并不区分大小写,但是关键字建议大写。
- MySQL语句中注释
- 单行注释:在语句前加一个 #号
- 多行注释:/* 想写的注释 */
SQL分类
- DDL:用户通过SQL语句对数据库、数据表进行操作的语句;
- DML:对表中的数据进行增删改;
- DQL:对表中的数据进行查;
- DCL:对数据库进行权限的控制;
DDL
- DDL操作数据库:
show databases; #查询数据库
create database bd1;
create database if not exists db1; #如果不存在db1,就执行创建语句,反之则不执行;
#创建数据库的两种SQL语句
drop database db1;
drop database if exists db1; #如果存在db1,就执行删除语句,反之则不执行;
#删除数据库的两种SQL语句
use db1; #进入db1这个数据库
select database(); #查询正在使用哪个数据库
- DDL操作数据表:
对表的查询
/*对表的查询*/
use mysql; #对表进行操作首先要进入对应的数据库中
show tables; #查看数据库中的表
desc db; #可以查看目标表中的结构 可以查看表的字段、类型、描述信息
对表的创建
/*对表的创建*/
create table 表名(
字段名 数据类型,
字段名 数据类型,
字段名 数据类型 #最后一行内容不加逗号
);
数据类型
//常用的数据类型的用法
age int
double score(总长度,小数点后保留几位)---> double score(5,2) //满分150分长度为三,小数点后要保留两位,所以为(5,2)
birthday date //表示的日期只有年月日
name char(12) //定长字符串 储存性能高但浪费空间
name varchar(12) //变长字符串 储存性能低但节约空间
//比如输入“张三”,char会为张三分配12个字符(其余十个字符用空格代替),而varchar只会为张三分配两个字符。
对表的删除
drop table tb_user;
drop table if not exists tb_user;
对表的修改
- 修改表名
alter table 表名 rename to 新的表名;
alter table student rename to stu;
- 添加一列
alter table 表名 add 列名 数据类型;
alter table stu add address varchar(50);
- 修改数据类型
alter table 表名 modify 列名 修改成的数据类型;
alter table stu modify address char(50);
- 同时修改列名和数据类型
alter table 表名 change 列名 修改成的列名 修改成的数据类型
alter table stu change address add varchar(50);
- 删除列
alter table 表名 drop 列名;
alter table stu drop addr;
DML
添加数据
#增加数据
INSERT INTO 表名 (列名 1,列名 2,...) VALUES (值 1,值 2);
#insert into 表名 (列名1,列名2,...) values (值1,值2);
#可以给表中所有的列名都赋值,都赋值时可以省略表名之后的,但不建议
INSERT INTO stu VALUES( 2, '李四', 1,'2003-01-25', 100.20, '3208408966@qq.com', '13000006000', 1 );
#也可以同时操作多个列,但导入的数据前都加逗号分隔开
INSERT INTO stu ( id, NAME, sex, birthday, score, email, tel, STATUS ) VALUES( 3, '李四', 1,'2003-01-25', 100.20, '3208408966@qq.com', '13000006000', 1 ),( 4, '李四', 1,'2003-01-25', 100.20, '3208408966@qq.com', '13000006000', 1 ),( 5, '李四', 1,'2003-01-25', 100.20, '3208408966@qq.com', '13000006000', 1 ),( 6, '李四', 1,'2003-01-25', 100.20, '3208408966@qq.com', '13000006000', 1 ),( 7, '李四', 1,'2003-01-25', 100.20, '3208408966@qq.com', '13000006000', 1 ),( 8, '李四', 1,'2003-01-25', 100.20, '3208408966@qq.com', '13000006000', 1 );
修改数据
#修改数据
--修改数据update 表名 set 列名1=值1,列名2=值2,...where 条件;/UPDATE 表名 SET 列名1=值1,列名2=值2,...WHERE 条件;
-- 将张三改为男的(1)
UPDATE stu SET sex = 0,birthday = '2022-01-04'WHERE name = '张三';
删除数据
#删除数据
-- 删除数据 DELETE FROM 表名 WHERE 条件;
-- 删除id为8的李四
delete from stu where id = 8;
DQL
查询数据库中的数据
基础查询
查询数据库中的列
select 列名1,;列名2,… from 表名; *号可以代表全部。
select * from mate;
select id,name,sex,age,score from mate;
-- 如果查询单列数据有重复的数据,我们可以加入 distinct 来去除重复数据
select distinct sex from mate;
-- 添加列名的别名 列名后添加 as 别名 ,或者 空格+别名
select id as 编号,name as 姓名,sex as 性别,age as 年龄,score as 成绩 from mate;
-- 查询一列中数据的总数、总和、最大、最小和平均
-- 查询人数
select count(name) from mate;
-- 查询成绩最大
select max(score) from mate;
-- 查询成绩最小
select min(score) from mate;
-- 查询成绩平均
select avg(score) from mate;
-- 查询成绩总和
select sum(score) from mate;
分组查询(group by)
select 要查询的内容 from 表名 where 条件 group by 要分组的列名 having 条件;
where > 聚合函数 > having having可以对聚合函数进行操作而where不行
-- 查询不同年龄的平均分
select age,avg(score) from mate group by age;
-- 查询不同年龄的平均分以及各自的人数
select age,avg(score),count(*) from mate group by age;
-- 查询不同年龄的平均分以及各自的人数,要求:低于80分的不参与分组
select age,avg(score),count(*) from mate where score >= 80 group by age;
-- 查询不同年龄的平均分以及各自的人数,要求:低于80分的不参与分组,分组后人数要大于等于3
select age,avg(score),count(*) from mate where score >= 80 group by age having count(*)>=3;
分页查询(limit)
select * from mate limit 起始索引[(当前页码-1)*当前页码显示的条数],显示的条目数;
-- 从零开始,查询三条数据
select * from mate limit 0,2;
-- 每页显示两条数据,显示第一页。
select * from mate limit 0,2;
-- 每页显示两条数据,显示第二页。
select * from mate limit 2,2;
-- 每页显示两条数据,显示第三页。
select * from mate limit 4,2;
-- 在 MySQL 中分页查询的方言是limit,在 Oracle 中使用rownumber,在 SQL Server 中使用 top
排序查询(order by)
查询某一列数据,并且升序或者降序排列
asc-升序排列 desc-降序排列 使用 order by 列名 asc/desc;
select * from mate oder by score desc;#按成绩大小降序排列成绩
select * from mate order by score desc,age asc;#按成绩大小先降序排列成绩,然后再升序排列年龄。
-- 只有当第一个条件相同时,第二个条件才被使用。
条件查询 (where)
-- 成绩大于85分的
select * from mate where score >85;
-- 成绩大于85并且小于95分的
select * from mate where score >85 and score <95;
-- 查询年纪等于21的学生
select * from mate where age = 21;
-- 查询年纪不等于21的学生
select * from mate where age != 21;
-- 查询年纪等于21或者等于20的学生
select * from mate where age = 20 or age = 21;
-- 查询有无null
select * from mate where score is not null;
-- 查询某段日期内的数据用 between 起始日期 and 结束日期
-- 查询姓张的
select * from mate where name like '张%';
-- 查询第三个字为文的
select * from mate where name like '%文';
-- 查询第二个字为凯的
select * from mate where name like '_凯%';
-- 查询名字中含有佳的
select * from mate where name like '%佳%';