赞
踩
database:数据库,存储数据的仓库,存储一系列有组织的数据,是二维表的集合。
数据库管理系统(database management system),数据库是通过DBMS创建管理的数据容器。
常见的数据库管理系统:MySQL、Oracle、SqlServer(只能安装在windows上)。
分类:
基于共享文件系统的DBMS比如access
基于客户端和服务端的DBMS,比如Mysql,安装数据库一般指安装服务端
二维表由行(记录)和列(字段)构成,行中的记录就是数据,列中对应字段,所以表是行和列的集合。
结构化查询语言:Structure Qurey language、专门用来和数据库通信的语言。
优点:
分类:
在官网下载安装包,双击进行安装。
配置MySQL环境变量:
mysql -uusername -ppassword -Pport
SQL语言全称是Structured query language,结构化查询语言,是RDBMS提供的用来管理数据库、数据表、表数据的一个工具。
负责创建、删除、修改、查询数据库和数据表
库的管理操作:
-- 1、创建数据库
create database if not exists school_zb charset 'utf8';
-- 2、修改数据库的编码集
alter database school_zb character set 'gbk';
-- 3、查看数据库的创建细节
show databases;
show create database school_zb;
-- 4、删除数据库
drop database if exists school_zb;
表的管理操作:
创建数据表
create table if not exists table_name(
字段名 字段类型 字段约束 comment "注释",
字段名 字段类型 字段约束 comment "注释",
.......,
consistent 约束名 foreign key(表字段) references 表名(字段)
)engine="存储引擎",charset="编码集"
show engines;
mysql常见的字段类型
整数型
小数型
字符串类型
时间日期类型
两种特殊的类型
enum
set
create table demo(
sex enum('男','女'),
hobby set('唱歌','jump','rap'),
time datetime
)
insert into demo values('男','jump,rap','2023-10-01');
mysql字段约束:限制数据的格式
数据库的设计三范式
use school_zb;
-- 6、创建一个院系表:院系id、院系名字、院系领导、院系地址、院系简介、院系专业个数
create table if not exists department(
department_id int primary key auto_increment,
department_name varchar(255) not null unique comment "院系名",
department_leader varchar(255) default "",
department_address varchar(255) ,
department_intro text,
major_number int not null check(major_number > 0)
)engine="innodb",charset='utf8';
-- 7、学生表:学生id、学生姓名、学生年龄、学生学号、学号手机号、学生院系id
create table if not exists student(
student_id int primary key auto_increment,
student_name varchar(255) not null,
student_age int not null check(student_age > 15 and student_age < 150),
student_sno varchar(255) not null unique,
stdudent_phone varchar(255) unique,
student_department_id int,
constraint fk1 foreign key(student_department_id) references department(department_id)
)engine="innodb",charset='utf8';
数据表的查询
数据表的修改
数据表的删除
-- 2、修改表名
alter table department rename dept;
-- 3、修改列名
alter table dept change department_leader leader varchar(255);
-- 4、修改列的约束和列的类型
alter table dept modify department_intro varchar(255) not null;
-- 5、增加一个新列
alter table dept add dept_create_time datetime not null;
-- 6、删除一列
alter table dept drop dept_create_time;
DML主要负责表数据的增加、删除和修改,DML语言执行完成会给我返回一个整数类型的结果,这个结果代表的是数据表受影响的行数。
增加数据语法
1、insert into table_name(表字段列表) values(值列表),(值列表)
-- 8、院系表增加数据
insert into department(department_name,department_leader,department_address,department_intro,major_number) values("软件学院","软书记","学院路3号","软件学院是个好学院",1);
insert into department(department_name,department_leader,department_address,department_intro,major_number) values("理学院","理书记","学院路3号","理学院是个好学院",3),("体育学院","体书记","学院路3号","体育学院是个好学院",5);
insert into student() values(1,"kl",21,"00001","1558888888",1);
insert into student() values(2,"hyf",18,"00002","157999999",1);
insert into table(字段列表) select查询语句
insert into dept(department_name,leader,department_intro,major_number) select department_name,leader,department_intro,major_number from dept;
更改数据语法
update table_name set 字段名=字段值,字段名=字段值 where 筛选条件
update dept set department_address="学院路4号";//更新所有数据
update dept set department_address="学院路13号" where department_name="软件学院";
删除数据语法
delete from table_name where 筛选条件
truncate table_name 截断表 ————不能用在有外键的表中
截断表,增加数据时,自增列会从头开始重新自增,delete from table_name会从上一次删除的位置继续自增
单表查询
select 查询列表
[from table_name]
[where 筛选条件]
[group by 分组字段] [having 分组后的筛选条件]
[order by 排序字段 asc|desc]
[limit 数字,数字]
1、select子语句中的查询列表:常量、函数、表字段、表达式。
select 1 as "常量",1+1 as "表达式",version() as "函数";
2、from table_name 从指定的数据表中查询数据,from子语句一旦出现,select子语句中就可以有表字段
如果要查询表中的所有字段 可以在select 后加上一个 * 号,* 号慎用, * 号的效率是最低的。
select department_id,leader, 1 as "常量" from dept;
select * from dept;
3、where子语句
一般是和from子语句结合使用,代表从指定的数据表中筛选指定的行数据。
筛选条件:需要是一个返回值为boolean类型的表达式。
select * from dept where major_number >= 3;
select * from dept where department_name="软件学院";
select * from dept where department_name="软件学院" or department_name="艺术学院";
select * from dept where department_name in ("软件学院","体育学院");
select * from dept where department_address="学院路13号" and major_number=4;
select * from dept where leader is null;
select * from dept where leader is not null;
select * from dept where department_name like "%a%";
select * from dept where department_name like "_u%";-- 院系第二个字符为u
select * from dept where department_name like "___";-- 院系由三个字符组成
select * from dept where department_name like "_a_%"escape"a";-- 院系第二个字符是下划线
4、group by分组查询
就表中的每一行的数据以指定的字段划分为不同的数据组,当指定的字段值一致时候,划分为同一个组中。
一旦在MySQL中使用了分组查询,那么select的查询列表就不能随便写,只能写分组字段、常量、聚合函数。
select sex,"1" as "常量",count(1) from user group by sex;
select sex,max(age),count(1) as "数量" from user group by sex;
5、having分组后的筛选
筛选结果数据,用来表示哪些数据需要展示,哪些数据不需要展示。
分组前的筛选having都能做,只不过having使用场景更加倾向于只有分组后才能筛选的情况。
select sex,max(age),count(1) as "人数" from user group by sex having max(age) >28;
6、order by排序
order by 排序字段 asc|desc,排序字段 asc|desc
select * from user order by age asc,user_name asc;
7、limit 分页查询
【注意】
函数
查看MySQL自带的所有函数
UDF:一对一函数,输入一个数据,输出一个数据
字符函数
substring/substr —— 字符串截取函数
concat(str…) concat如果拼接了null值,返回结果也是null —— 字符串拼接
lpad(str,length,padstr)|rpad() —— 左填充|右填充
trim(str) —— 去除字符串两端的空格
length(str) —— 返回字符串长度
upper|lower —— 转字符串为全大写或全小写
replace(str,需要替换的字符串,替换之后的字符串)
select substring("zs123",2,3);
select concat("zs","ls");
select rPAD("zs",5,"ws");
select trim(" zs ls ");
select length("asdfghjklzxvbnm");
select user_name,length(user_name) as "length" from user;
select upper("cat");
select lower("CAT");
select replace("zs","s","l");
数学函数
ceil(数字) —— 向上取整
floor(数字) —— 向下取整
abs(数字) —— 取绝对值
round(数字,n) —— 四舍五入
sqrt(数字) —— 求开平方
pow(数字,n次方) —— 求平方
select ceil(1.5);
select floor(1.5);
select abs(-1);
select round(3.1415926,2);
select sqrt(9);
select pow(3,2);
时间日期函数
now(); —— 获取当前月日时分秒
current_date(); —— 获取当前年月日
current_time(); —— 获取当前时分秒
YEAR(时间) —— 获取年份
str_to_date(str,formatstr) —— 将字符串时间转换为date的时间
DATE_FORMAT(date,formatstr) —— 将date以指定的格式转为想要的格式
datediff(date,date)—— 日期相减
select now();
select current_date();
select current_time();
select year(now());
select str_to_date("2023/10/11","%Y/%m/%d");
select DATE_FORMAT(now(),"%Y-%m-%d");
其他函数
version() —— 显示当前MySQL的版本
user() —— 显示当前登录的用户
database() —— 显示当前使用的数据库
select version(),user(),database();
流程函数
if(判断条件,表达式或者值,表达式或者值)
case 要匹配的值
when 值 then 返回的结果
…
else 默认的返回
end as “别名”
select user_id,user_name,password,age,if(sex='1','男','女') as "sex" from user;
select user_id,user_name,password,age,
CASE sex
WHEN '0' THEN'女'
WHEN '1' THEN'男'
ELSE '未知'
END as "sex"
from user;
UDAF:聚合函数,输入多个数据,输出一个数据
UDTF:输入一个数据,输出多个数据
联合查询
将多条查询语句的结果整合到一个结果集当中。
查询语句1 union|union all 查询语句2 …
注意事项:
select "男" as sex,count(1) as count_people from user where sex='1'
union
select "女",count(1) as count_people from user where sex='0'
union
select "未知",count(1) as count_people from user where sex='2';
select * from user where age<30
union all
select * from user where sex='0';
多表查询(连接查询)
查询的数据来自于多张表,而且多张表一般都是有外键关系的。
语法:
select 查询列表
from table_nameA
inner join|left join|right join|full join table_nameB
on a表和b表的连接条件(a表和b表的关联字段)
..........
where group by having order by limit
连接查询分类
-- 内连接查询 查询部门存在的员工信息和员工的部门名
select e.*,d.department_name from employees as e inner join departments as d on e.department_id = d.department_id;
【注意】笛卡尔乘积问题,连接查询的时候忘记写连接条件
子查询
查询里面有嵌套了一个查询,其中嵌套的查询称之为子查询。
子查询可以出现select、where、from子语句当中。
-- 查询部门名为IT的所有员工信息
select employees.* from employees where department_id in (select department_id from departments where department_name="IT");
事务
事务的创建
事务的隔离级别
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。