MySQL 是最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一。
数据库(Database)是按照数据结构来组织、存储和管理数据的仓库。
每个数据库都有一个或多个不同的 API 用于创建,访问,管理,搜索和复制所保存的数据。
我们也可以将数据存储在文件中,但是在文件中读写数据速度相对较慢。所以,现在我们使用关系型数据库管理系统(RDBMS)来存储和管理大数据量。
所谓的关系型数据库,是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。
RDBMS 即关系数据库管理系统(Relational Database Management System)的特点:
https://blog.csdn.net/su2231595742/article/details/107972521
Structured Query Language 结构化查询语言
其实就是定义了操作所有关系型数据库的规则。每一种数据库操作的方式存在不一样的地方,就成为“方言”
注释的语法 | 说明 |
---|---|
–空格 注释内容 | 单行注释 |
/* */ | 多行注释 |
#注释内容 | 这是 mysql 特有的注释方式 |
操作数据库:CRUD
CREATE DATABASE 数据库名;
create detabase if not exists 数据库名;
creare database 数据库名 character set 字符集;
show databases;
show create database 数据库名称;
alter database 数据库名 character set 字符集;
drop database 数据库名;
drop database if exists 数据库名;
select database();
use 数据库;
操作表结构
create table 表名(
列名1 数据类型1,
列名2 数据类型2,
`` ```,
列名n 数据类型n
);
show tables;
desc 表名;
show create table 表名;
alter table 表名 rename to 新的表名;
alter table 表名 character set 字符集;
alter table 表名 add 列名 数据类型;
alter table 表名 change 列名 新列名 新数据类型;
alter table 表名 modify 列名 新数据类型;
alter table 表名 drop 列名;
drop table 表名;
drop table if exists 表名;
insert into 表名(列名1,列名2,... 列名n) values(值1,值2, ... 值n)
delete from 表名 [where 条件]
delete form 表名; -- 不推荐使用,有多少删多少
truncate table 报名; -- 先删表,再创建一张一样的表
update 表名 set 列名1=值1,列名2=值2,...[where 条件]
基础查询:
select 字段名 1, 字段名 2, 字段名 3, ... form 表名;
select * form 表名;
select distinct 字段名 from 表名;
select 字段名1 as 别名, 字段名2 as 别名... from 表名;
select 字段名1 as 别名, 字段名2 as 别名... from 表名 as 表别名;
条件查询
>、<、<=、>=、=、<> //<>在SQL中表示不等于,在mysql中也可以使用!= 没有==
BETWEEN...AND //在一个范围之内,如:between 100 and 200 相当于条件在 100 到 200 之间,包头又包尾
IN(集合) //集合表示多个值,使用逗号分隔
LIKE '张%' //模糊查询
IS NULL //查询某一列为 NULL 的值,注:不能写=NULL
and 或 && //与,SQL 中建议使用前者,后者并不通用。
or 或 || //或
not 或 ! //非
模糊查询
- SELECT * FROM 表名 WHERE 字段名 LIKE '通配符字符串';
- selcet * from 表名 where 字段名 between 100 and 200;
排序查询
select * from 表名 order by asc/ desc; 升序/降序,默认升序
select * from 表名 order by 字段名1[asc/desc], 字段名2[asc/desc],...;
聚合函数: 将一列数据作为一个整体,进行纵向的计算
select count(字段) from 表名;
分组查询:
select sex, avg(math) from student3 group by sex; -- 按性别进行分组,求男生和女生数学的平均分
SELECT sex, COUNT(*) FROM student3 WHERE age > 25 GROUP BY sex having COUNT(*) >2; -- 查询年龄大于 25 岁的人,按性别分组,统计每组的人数,并只显示性别人数大于 2 的数据
分页查询
我们现在默认使用的都是 root 用户,超级管理员,拥有全部的权限。但是,一个公司里面的数据库服务器上面可能同时运行着很多个项目的数据库。所以,我们应该可以根据不同的项目建立不同的用户,分配不同的权限来管理和维护数据库。
create user '用户名'@'主机名' identified by '密码';
drop user '用户名'@'主机名';
1. update user set password = password('新密码') where user = '用户名';
2. set password for '用户名'@'主机名' = password('新密码');
```sql
* mysql中忘记了root用户的密码?
1. 管理员身份运行cmd --> net stop mysql 停止mysql服务
2. 使用无验证方式启动mysql服务:mysql --skip-grant-tables
3. 打开新的cmd窗口,直接输入mysql命令,敲回车。就可以登录成功
4. 改密码
5. 关闭两个窗口
6. 打开任务管理器,手动结束mysqld.exe进程
7. 启动msql服务,使用新密码登录
1. 切换到mysql数据库
use mysql;
2. 查询user表
select * from user;
show gtants for '用户名'@'主机名';
grant 权限 1, 权限 2... on 数据库名.表名 to '用户名'@'主机名';
grant all on *.* to 'user2'@'%';给 user2 用户分配所有权限,对任意数据库的所有表
revoke 权限 1, 权限 2... on 数据库.表名 from '用户名'@'主机名';
create table st8 (
id int,
name varchar(20) not null,
gender char(1)
)
alter table 表名 modify name varchar(20) not null
alter table 表名 modify name varchar(20);
create table stu(
id int,
phone_number varchar(11) unique
);
alter table 表名 drop index phone_number;
alter table 表名 modify phone_number varchar(11) unique;
create table stu(
id int primary key,
name varchar(11)
);
alter table stu drop primary key;
alter table stu modify id int primary key;
create table stu(
id int primary key auto_increment,
name varchar(20)
);
alter table stu modify in int;
alter table stu modify in int auto_increment;
create table 表名(
...
外键列
constraint 外键名称 foreign key(外键列名称) references 主表名称(主表列名称)
);
alter table 表名 drop foreign key 外键名称;
alter table 表名 add constarint 外键名称 foreign key(外键字段名称) references 主表名称(主表列名称);
foreign key(外键字段名称) references 主表名称(主表列名称) on update cascade on delete cascade;
select 字段列表 from 表名1 [inner] join 表名2 on 条件;
左外连接:
select 字段名 from 左表 left[outer] join 右表 on 条件;
右外连接:
select 字段名 from 左表 right[outer] join 右表 on 条件;
select 查询字段 from 表名 where 字段 = (子查询);
select * from dept d, (select * from emp where join_date >='2011-1-1') e where
d.`id`= e.dept_id ;
MySQL 事务主要用于处理操作量大,复杂度高的数据。比如说,在人员管理系统中,你删除一个人员,你既需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务!
视图是由数据库中的一个表或多个表导出的虚拟表。视图就像一个窗口,通过这个窗口可以看到系统专门提供的数据。这样,用户可以不用看到整个数据库表中的数据,而只关心对自己有用的数据。
视图的作用:
create view 视图名 as select 语句 [with check option]
create view 视图名 as select * from 表名;
create view 视图名 as select 字段列表 from 表1,表2... where 条件
describe 视图名;
describe 可缩写为 desc
show table status like 视图名;
show create view 视图名;
create or replace view 视图名 as select语句;
或
alter view 视图名 as select语句;
update 视图名 set ...;
drop view [if exists] 视图名;
两者的区别:
两者的联系:
索引是创建在表上的,是对数据库表中一列或多列的值进行排序的一种结构,其作用是提高对表中数据的查询速度。
create table 表名(
属性名 数据类型
...
[unique | fulltext | spatial]
index|key [别名] --index和可以参数用来指定字段为索引的,选其一就可
(属性名1 [(长度)] [asc|desc]) --属性1 参数指定索引对应的字段名称,长度指索引的长度,必须是字符串类型才可以使用;asc/desc 升序\排序
);
create [unique | fulltext | spatial]
index 索引名
on 表名
(属性名 [(长度)] [asc|desc]);
alter table 表名
add [unique | fulltext | spatial]
index 索引名(属性名 [(长度)] [asc|desc]);
drop index 索引名 on 表名;
注意:选择索引的最终目的是为了使查询的额速度更快。上面给出的原则是最基本的准则,但不能拘泥于上面的准则。应根据应用的实际情况进行分析和判断,选择最合适的索引方式。
函数 | 作用 |
---|---|
ABS(x) | 返回 x 的绝对值 |
CEIL(x) | 返回大于或等于 x 的最小整数 |
CEILING(x) | 返回大于或等于 x 的最小整数 |
FLOOR(x) | 返回小于或等于 x 的最大整数 |
RAND() | 返回 0 到 1 的随机数 |
ROUND(x) | 返回离 x 最近的整数 |
GREATEST(expr1, expr2, expr3, …) | 返回列表中的最大值 |
LEAST(expr1, expr2, expr3, …) | 返回列表中的最小值 |
MIN(expression) | 返回字段 expression 中的最小值 |
MAX(expression) | 返回字段 expression 中的最大值 |
TRUNCATE(x,y) | 返回数值 x 保留到小数点后 y 位的值(与 ROUND 最大的区别是不会进行四舍五入) |
SUM(expression) | 返回指定字段的总和 |
AVG(expression) | 返回一个表达式的平均值,expression 是一个字段 |
COUNT(expression) | 返回查询的记录总数,expression 参数是一个字段或者 * 号 |
SIN(x) | 求正弦值(参数是弧度) |
ASIN(x) | 求反正弦值(参数是弧度) |
COS(x) | 求余弦值(参数是弧度) |
ACOS(x) | 求反余弦值(参数是弧度) |
TAN(x) | 求正切值(参数是弧度) |
ATAN(x) | 求反正切值(参数是弧度) |
ATAN2(n, m) | 求反正切值(参数是弧度) |
COT(x) | 求余切值(参数是弧度) |
DEGREES(x) | 将弧度转换为角度 |
RADIANS(x) | 将角度转换为弧度 |
n DIV m | 整除,n 为被除数,m 为除数 |
POW(x,y) POWER(x,y) | 返回 x 的 y 次方 |
EXP(x) | 返回 e 的 x 次方 |
SQRT(x) | 返回x的平方根 |
MOD(x,y) | 返回 x 除以 y 以后的余数 |
PI() | 返回圆周率(3.141593) |
LN | 返回数字的自然对数,以 e 为底。 |
LOG(x) 或 LOG(base, x) | 返回自然对数(以 e 为底的对数),如果带有 base 参数,则 base 为指定带底数。 |
LOG2(x) | 返回以 2 为底的对数 |
LOG10(x) | 返回以 10 为底的对数 |
函数 | 描述 |
---|---|
ASCII(s) | 返回字符串 s 的第一个字符的 ASCII 码。 |
CHAR_LENGTH(s) , CHARACTER_LENGTH(s) | 返回字符串 s 的字符数 |
CONCAT(s1,s2…sn) | 字符串 s1,s2 等多个字符串合并为一个字符串 |
CONCAT_WS(x, s1,s2…sn) | 同 CONCAT(s1,s2,…) 函数,但是每个字符串之间要加上 x,x 可以是分隔符 |
FIELD(s,s1,s2…) | 返回第一个字符串 s 在字符串列表(s1,s2…)中的位置 |
FIND_IN_SET(s1,s2) | 返回在字符串s2中与s1匹配的字符串的位置 |
FORMAT(x,n) | 函数可以将数字 x 进行格式化 “#,###.##”, 将 x 保留到小数点后 n 位,最后一位四舍五入。 |
INSERT(s1,x,len,s2) | 字符串 s2 替换 s1 的 x 位置开始长度为 len 的字符串 |
RPAD(s1,len,s2) | 在字符串 s1 的结尾处添加字符串 s2,使字符串的长度达到 len |
MID(s,n,len) | 从字符串 s 的 n 位置截取长度为 len 的子字符串,同 SUBSTRING(s,n,len) |
LOCATE(s1,s) | 从字符串 s 中获取 s1 的开始位置 |
POSITION(s1 IN s) | 从字符串 s 中获取 s1 的开始位置 |
LCASE(s) | 将字符串 s 的所有字母变成小写字母 |
LOWER(s) | 将字符串 s 的所有字母变成小写字母 |
UCASE(s),UPPER(s) | 将字符串转换为大写 |
LEFT(s,n) | 返回字符串 s 的前 n 个字符 |
RIGHT(s,n) | 返回字符串 s 的后 n 个字符 |
LPAD(s1,len,s2) | 在字符串 s1 的开始处填充字符串 s2,使字符串长度达到 len |
LTRIM(s) | 去掉字符串 s 开始处的空格 |
RTRIM(s) | 去掉字符串 s 结尾处的空格 |
TRIM(s) | 去掉字符串 s 开始和结尾处的空格 |
REPEAT(s,n) | 将字符串 s 重复 n 次 |
REPLACE(s,s1,s2) | 将字符串 s2 替代字符串 s 中的字符串 s1 |
REVERSE(s) | 将字符串s的顺序反过来 |
SPACE(n) | 返回 n 个空格 |
STRCMP(s1,s2) | 比较字符串 s1 和 s2,如果 s1 与 s2 相等返回 0 ,如果 s1>s2 返回 1,如果 s1< s2 返回 -1 |
SUBSTR(s, start, length),SUBSTRING(s, start, length) | 从字符串 s 的 start 位置截取长度为 length 的子字符串 |
函数名 | 描述 |
---|---|
ADDDATE(d,n) | 计算起始日期 d 加上 n 天的日期 |
ADDTIME(t,n) | 时间 t 加上 n 秒的时间 |
CURDATE() | 返回当前日期 |
CURRENT_DATE() | 返回当前日期 |
CURRENT_TIME | 返回当前时间 |
CURRENT_TIMESTAMP() | 返回当前日期和时间 |
CURTIME() | 返回当前时间 |
DATE() | 从日期或日期时间表达式中提取日期值 |
DATEDIFF(d1,d2) | 计算日期 d1->d2 之间相隔的天数 |
DATE_ADD(d,INTERVAL expr type) | 计算起始日期 d 加上一个时间段后的日期 |
DATE_FORMAT(d,f) | 按表达式 f的要求显示日期 d |
DATE_SUB(date,INTERVAL expr type) | 函数从日期减去指定的时间间隔。 |
DAY(d) | 返回日期值 d 的日期部分 |
DAYNAME(d) | 返回日期 d 是星期几,如 Monday,Tuesday |
DAYOFMONTH(d) | 计算日期 d 是本月的第几天 |
DAYOFWEEK(d) | 日期 d 今天是星期几,1 星期日,2 星期一,以此类推 |
DAYOFYEAR(d) | 计算日期 d 是本年的第几天 |
FROM_DAYS(n) | 计算从 0000 年 1 月 1 日开始 n 天后的日期 |
HOUR(t) | 返回 t 中的小时值 |
LAST_DAY(d) | 返回给给定日期的那一月份的最后一天 |
LOCALTIME(),LOCALTIMESTAMP() | 返回当前日期和时间 |
MAKEDATE(year, day-of-year) | 基于给定参数年份 year 和所在年中的天数序号 day-of-year 返回一个日期 |
MAKETIME(hour, minute, second) | 组合时间,参数分别为小时、分钟、秒 |
MICROSECOND(date) | 返回日期参数所对应的微秒数 |
MINUTE(t) | 返回 t 中的分钟值 |
MONTHNAME(d) | 返回日期当中的月份名称,如 November |
MONTH(d) | 返回日期d中的月份值,1 到 12 |
NOW() | 返回当前日期和时间 |
PERIOD_ADD(period, number) | 为 年-月 组合日期添加一个时段 |
函数 | 作用 |
---|---|
VERSION() | 返回数据库的版本号 |
USER() | 返回当前用户 |
SESSION_USER() | 返回当前用户 |
SYSTEM_USER() | 返回当前用户 |
CURRENT_USER() | 返回当前用户 |
DATABASE() | 返回当前数据库名 |
LAST_INSERT_ID() | 返回最近生成的 AUTO_INCREMENT 值 |
函数名 | 描述 |
---|---|
password(str) | 加密函数,主要用来给用户的密码加密 |
md5(str) | 加密函数,主要对普通的数据进行加密 |
encode(str,pswd_str) | 使用pswd_str来加密字符串str,加密结果是二进制数,必须使用blob类型的字段来保存 |
decode(crypt_str, pswd_str) | 解密函数,可使用pswd_str来为crypt_str解密, crypt_str是通过encode(str,pswd_str)加密后的二进制数据。字符串pswd_str应该与加密是的字符串pswd_str是相同的 |
函数名 | 描述 |
---|---|
format(x,n) | 格式化函数,可以将数字x保留到小数点后n位,这个过程需要进行四舍五入 |
BIN(x) | 返回 x 的二进制编码 |
HEX(x) | 返回x的十六进制编码 |
oct(x) | 返回x的八进制编码 |
conv(x,f1,f2) | 将x从f1进制数变为f2进制数 |
CAST(x AS type) | 转换数据类型 |
存储过程和函数是在数据库中定义一些SQL语句的集合,然后直接调用这些存储过程和函数来执行已经定义好的SQL语句。
create procedure 存储过程名(参数列表)
[characteristic]
begin
存储过程体(一组合法的SQL语句);
end
注意: 1. 参数列表有三部分组成: 输入输出类型、参数名称和参数类型
[in|out|inout] param_name type
in 表示输入参数;out表示输出参数;inout表示既可以输入,也可以输出。
type 指定存储过程的参数类型
2. 如果存储过程体仅仅只有一句话,begin end可以省略
存储过程中的每条SQL语句的结尾要求必须加分号。
为了避免冲突,首先用“delimiter $”将MySQL的结束符设置为 $,最后再用“delimiter;” 来将结束符恢复成分号。
delimiter $
create function 存储函数名([参数列表])
returns type
[characteristic]
begin
return(SQL语句);
end
call 存储过程名(存储列表)
select 存储函数名
show {
procedure | function} status [link '存储过程或函数的名称'];
show create {
procedure | function} 存储过程或函数的名称;
alter {
procedure | function} 存储过程或函数的名称
[characteristic]
SQL security {
definer | invokey};
drop {
procedure | function} 存储过程或函数的名称;