《MySql必知必会》阅读梳理(Mysql基础语法大全)

使用到了两个表
CREATE TABLE user (
id INT NOT NULL AUTO_INCREMENT,
username CHAR(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
password CHAR(20) NOT NULL,
PRIMARY KEY (id)
) ENGINE=INNODB AUTO_INCREMENT=26 DEFAULT CHARSET=utf8

CREATE TABLE information (
id int NOT NULL AUTO_INCREMENT,
class char(10) NOT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8

show

1.show database

现实数据库内容
在这里插入图片描述

2.show tables

显示当前数据库的表信息
在这里插入图片描述

3.show columns from [表名]

例如 show columns from user
显示这个表中每个字段的详细信息
在这里插入图片描述

4.describe [表名]

和show columns from [表名]效果一样
在这里插入图片描述

use

1.user [数据库名字]

例如 show login
选中使用哪个数据库
在这里插入图片描述

select

在表中查询数据

select [字段名] from [表名]

select id from user;
在这里插入图片描述

select * from user
在这里插入图片描述

select id,username from user
在这里插入图片描述

limit

限制语句。限制显示的条数和起点
###1.select [字段名] from [表名] limit [起点],[显示条数]
select * from user limit 1,3
显示从下标1开始的3条信息
在这里插入图片描述

2. select [字段名] from [表名] limit [显示条数] offset[起点]

select * from user limit 3 offset 1
在这里插入图片描述

3.select [字段名] from [表名] limit [显示条数]

select * from user limit 4
在这里插入图片描述

order by

排序(limit要写在 order by之后)

select [字段名] from [表名] order by [字段] [排序方式]

select * from user order by id(根据id降序排列)
默认为升序排列
在这里插入图片描述
select * from user order by id asc(根据id升序排列)
在这里插入图片描述

select * from user order by id desc(根据id降序排列)
在这里插入图片描述

select [字段名] from [表名] order by [字段] [排序方式] limit [起点],[显示条数]

select * from user order by id limit 1, 3(根据id降序排列 并从第2个元素开始显示3条数据)
在这里插入图片描述

select [字段名] from [表名] order by [字段1],[字段2] [排序方式]

根据多个字段排序,只有当字段1相等时才判断字段2.排序方式只关联前一个字段
select * from user order by password desc,id (先根据password降序排序,当password相等时根据id升序排列)
注意password是字符串
在这里插入图片描述

where

过滤数据(order by 和limit要在where之后)

select * from [表名] where[判断条件]

select * from user where username = “sea”
在这里插入图片描述

select * from user where username != “sea”
!=同<>
在这里插入图片描述
select * from user where username >= “sea”
在这里插入图片描述
select * from user where id between 2 and 4
2<=id<=4
在这里插入图片描述

select * from user where username is null;
空值检测,只显示username为null的数据
在这里插入图片描述

and

当两个条件都满足时才查询出来
select * from user where id = 1 and password !=“abc”
在这里插入图片描述
select * from user where id = 1 and password !=“123”
在这里插入图片描述

or

满足一个条件
select * from user where id = 1 or password !=“abc”
在这里插入图片描述

select * from user where id = 1 or password !=“123”
在这里插入图片描述

in

范围内查询

select * from [表名] where [字段] in(值1,值2。。。)

select * from user where id in(2,3,4)
和select * from user where id = 2 or id =3 or id =4查询结构相当。但是一般情况下in更快。且in可以动态搜索
在这里插入图片描述

not

否定条件

select * from [表名] where [字段] not in(值1,值2。。。)

select * from user where id not in(2,3,4)
和select * from user where id != 2 or id !=3 or id !=4查询结构相当。但是一般情况下in更快。且in可以动态搜索
在这里插入图片描述
select * from user where id not between 1 and 2在这里插入图片描述

like

%通配符

%通配符表示任意字符出现任意次数
select * from user where password like ‘%’
在这里插入图片描述
select * from user where password like ‘1%’
在这里插入图片描述
select * from user where password like ‘%3’
在这里插入图片描述
select * from user where password like ‘%1%’
在这里插入图片描述

_通配符

与%类似,%是匹配任意个数字符,是匹配一个字符
select * from user where password like '

在这里插入图片描述
select * from user where password like ‘_1’
在这里插入图片描述
通配符的处理数据速度比前面提到的其他方式慢。特别注意尽量不要把通配符放在搜索模式的开始处。放在开始处处理起来是最慢的

正则表达式 regexp

.

select * from user where password regexp “3”;
同like"%3%"
在这里插入图片描述
select * from user where password regexp “.2”;
类似like “%2”但是.2的话前面必须有字符 %2可以没有
(一个.代表至少一个字符)
在这里插入图片描述

binary

让正则表达式区分大小写
select * from user where username regexp “q.Ea”//不区分大小写
select * from user where username regexp binary “q.Ea”;//区分大小写
在这里插入图片描述

|

或运算(可以有多个|)
mysql> select * from user where username regexp “m|q”;
在这里插入图片描述

[]

select * from user where username regexp “[qm]”;
[mq] 同m|q
在这里插入图片描述

^

select * from user where username regexp “[^sea]”;
匹配除了sea以外的所有
在这里插入图片描述

-

范围
mysql> select * from user where id regexp “[1-3]”;
匹配id再【1,3】范围内的,除了数字也可以用字符 如【a-b】
在这里插入图片描述

\

\用来转义特殊字符
mysql> select * from user where password regexp “\.”;
用来查找 .
在这里插入图片描述

重复元字符

在这里插入图片描述

定位符

在这里插入图片描述

计算字段

concat拼接

select concat(username,’(’,password,’)’) from user;
在这里插入图片描述

trim Rtrim Ltrim

去掉两边 右边 左边 的空格
select trim(password) from user
在这里插入图片描述

as 别名

select concat(username,’(’,password,’)’) as qmy from user
在这里插入图片描述

+ - * /

在这里插入图片描述
select id,password, id*password as sea from user;
在这里插入图片描述

函数

文本处理函数
upper:变成大写

在这里插入图片描述
时间函数
在这里插入图片描述
数值处理函数
在这里插入图片描述
汇集函数
在这里插入图片描述

DISTINCT

distinct:忽略重复元素
select avg(password) from user;
在这里插入图片描述
select avg(distinct password) from user;
在这里插入图片描述
select count( password)from user;
在这里插入图片描述
select count(distinct password)from user;
在这里插入图片描述

group by

根据id进行分组
select id,count() as count from user group by id;
在这里插入图片描述
根据count(id)>0进行过滤分组
having和where很类似。很多where的例子都可以用having来写。他俩的主要区别为where没有组的概念。
select id,count(
) as count from user group by id having count(id)>0;
在这里插入图片描述
select子句及其顺序
在这里插入图片描述
在这里插入图片描述

联结

#内联结 (等值联结)

select [多个字段名] from[多个表名] where [条件];

select username, password, class from user,information where user.id = information.id;
在这里插入图片描述

select [多个字段名] from[表明 inner join [表明] on [条件]

select username, password, class from user inner join information on user.id = information.id;
在这里插入图片描述

自联结

select [字段] from [表名] where[条件]

注意,自联接相当于把一个表当两个表用,为了不产生歧义,因此需要对表起两个别名。
select p1.* from user as p1,user as p2 where p2.password = 5 and p1.id>p2.id;
在这里插入图片描述

外联结 select [字段名] from [表名] [左/右] outer join [表名] on [条件]

左外联结

select * from user left outer join information on user.id = information.id;
在这里插入图片描述

右外连结

select * from user right outer join information on user.id = information.id;
在这里插入图片描述

组合查询(复合查询)

Union

相同的数据将被覆盖
select * from user where id = 2 union select * from user where password = 123;
在这里插入图片描述
union两边要查询的字段需要相同。
这个语句也可以用where来完成
select * from user where id = 2 or password=123;
在这里插入图片描述

Union All

相同数据不覆盖
select * from user where id = 2 union all select * from user where password=5;
在这里插入图片描述

全文本搜索

全文本布尔搜索

在这里插入图片描述
待续

插入数据

insert into [(列名)]/没有(当不写列名时,相当于按照表顺序写了所有列)values([值])

insert into user values(null,‘haiyang’,‘root’);
在这里插入图片描述
insert into user (username,password) values (‘yang’,‘115’);
在这里插入图片描述
查看一下现在的user表
在这里插入图片描述

low_priority

降低优先级(当需要保证查询速度时,需要降低插入的优先级)
insert low_priority into user (username,password) values (‘hai’,‘115’);
在这里插入图片描述

一次插入多条数据

insert into user (username,password) values (‘xiaoran’,‘250’),(‘an’,‘555’);
在这里插入图片描述

insert select

把查询结果插入表中
insert into information (class) (select username from user where id = 1);
在这里插入图片描述
insert into information (class) select username from user where id = 1;
在这里插入图片描述
现在的information表
在这里插入图片描述

查看最后插入数据的自增id值

select last_insert_id();
在这里插入图片描述
在这里插入图片描述

更新和删除数据

update [表名] set [列名] = [值] where [条件];

update user set username = ‘dog’ where id = 10;
注意:一定要有where条件,要不然所有列的username都被改了。
在这里插入图片描述

ignore

一般情况下,当更新发生错误时,所有之前更改的结果都会重置。
但要是想即使发生错误,其他的更新结果想要保留的话,可以加上ignore

删除数据

delete from [表名] where [条件]

delete from information where class = ‘sea’;
在这里插入图片描述
表的变化
在这里插入图片描述

truncate table [表名]

删除整个表,再重新建立(相当于删除表中所有数据,但是比delete快的多)
truncate table information;
在这里插入图片描述

创建和操作表

create table if not exists (可选,当不存在时才创建如果存在不创建,也不会报错)[表名] (字段)

CREATE TABLE IF NOT EXISTS user_age
(
id INT NOT NULL AUTO_INCREMENT,
age INT NOT NULL DEFAULT 20,
PRIMARY KEY(id)
)ENGINE = INNODB;
在这里插入图片描述
default 默认值
auto_increment 自增(只能有一个自增)
primary key([列名]) 设置主键(可以有多个主键)
not null 非空
engine = innodb 使用innodb引擎

alter table 改变表

添加列alter table [表名] add [列名] [描述];

alter table user_age add birth_year char(10);
在这里插入图片描述

删除列 alter table [表名] drop column [列名]

alter table user_age drop column birth_year;
在这里插入图片描述

删除外键 alter table [子表名] drop foreign key [外键名];

alter table user drop foreign key user_information;
在这里插入图片描述

添加外键 ALTER TABLE [子表名] ADD CONSTRAINT [外键名] FOREIGN KEY ([子表字段]) REFERENCES [外键关联的主表] ([主表字段]);

ALTER TABLE USER ADD CONSTRAINT user_information FOREIGN KEY (id) REFERENCES information (id);
在这里插入图片描述

删除表 drop table [表名]

drop table user_age;
在这里插入图片描述

重命名表 rename table [原表名] to [目标表名];

rename table user to sb;
在这里插入图片描述

创建视图 create view [视图名字] as [查询条件]

视图相当于一个虚拟的表
查询条件可以为任意,查出的数据相当于建立了一个虚拟的表
create view user_class as select user.id, username, class from user,information where user.id = information.id;
在这里插入图片描述

使用视图

select * from user_class;
在这里插入图片描述
select * from user_class where id<5;
在这里插入图片描述

存储过程

创建存储过程

不带参数

delimiter //
create procedure fun()
begin
select sum(id) from user;
end //
delimiter ;
在这里插入图片描述
创建了一个名为fun的存储过程
其中dellmiter 为改变结束符。因为在begin和end中间的sql要用到;所以要临时改变结束符。
最后记得改回来

带参数

DELIMITER //
CREATE PROCEDURE fun(IN sid INT,IN flag BOOLEAN,OUT avgId DECIMAL(8,2))
BEGIN
DECLARE totalcount INT;
DECLARE totalsum INT;
SELECT COUNT(*) FROM USER INTO totalcount;
SELECT SUM(id) FROM USER INTO totalsum;
SELECT totalsum/totalcount INTO avgId;
IF flag THEN
SELECT sid INTO avgId;
END IF;
END//
DELIMITER ;
在这里插入图片描述
declare 定义变量
decimal(x,y)y个小数位。最多x位有效数字

使用存储过程call [存储过程名]

不带参数

call fun();
在这里插入图片描述

带参数

mysql的参数名字以@起始
call fun(2333,0,@sum);
select @sum;
在这里插入图片描述
在这里插入图片描述

删除存储过程 drop procedure [存储过程名];

drop procedure fun;
在这里插入图片描述

查看存储过程show create procedure [存储过程名]

show create procedure fun;
在这里插入图片描述

列出所有存储过程 show procedure status;

可以使用like指定过滤
show procedure status like ‘%fun%’;
在这里插入图片描述

游标

创建和使用游标

DELIMITER //
CREATE PROCEDURE fun(OUT res INT)
BEGIN
DECLARE search CURSOR
FOR
SELECT id FROM USER WHERE id = 5;
OPEN search;
FETCH search INTO res;
CLOSE search;
END//
DELIMITER ;
注意
cursor:为游标类型
search:为游标变量名称
使用游标前需要使用 open命令打开游标
使用结束后需要关闭游标 close命令
如果没有关闭游标那么在end处也会自动关闭
fetch 为取出当前游标指向的数据,并把游标移向下一条数据;
游标可在存储过程中使用

loop循环

DELIMITER //
CREATE PROCEDURE fun()
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE iid INT;
DECLARE cur CURSOR
FOR
SELECT id FROM USER;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
OPEN cur;
xunhuan:LOOP
FETCH cur INTO iid;
SELECT iid;
IF done = 1 THEN
LEAVE xunhuan;
END IF;
END LOOP;
CLOSE cur;
END//

DELIMITER ;

注意: DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;相当于但cursor没有下一个元素时把done 设置为1
if then 判断
leave xunhuan;结束循环(xunhuan为自定义名字)
在这里插入图片描述
输出结果
在这里插入图片描述
他的最后一条数据输出了两次

while do循环

DELIMITER //
CREATE PROCEDURE fun()
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE iid INT;
DECLARE cur CURSOR
FOR
SELECT id FROM USER;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
OPEN cur;
WHILE done !=1 DO
FETCH cur INTO iid;
SELECT iid;
END WHILE;
CLOSE cur;
END//

DELIMITER ;

在这里插入图片描述
输出结果
在这里插入图片描述
他的最后一条数据输出了两次

repeate循环

DELIMITER //
CREATE PROCEDURE fun()
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE iid INT;
DECLARE cur CURSOR
FOR
SELECT id FROM USER;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
OPEN cur;
REPEAT
FETCH cur INTO iid;
SELECT iid;
UNTIL done = 1
END REPEAT;
CLOSE cur;
END//
DELIMITER ;
在这里插入图片描述
输出结果
在这里插入图片描述
他的最后一条数据输出了两次

多输出一次的原因是,当done改为1时,还没有进行判断就输出了一行。只有在下次循环的时候才会判断done!=1;
SQLSTATE ‘02000’ 与NOT FOUND意义相同

触发器

一共有六种触发器
after/before insert on
after/before update on
after/before delete on
分别对应着插入前插入后,更新前跟新后,删除前和删除后。
insert触发器中可以引用一个虚拟的new表,这个表就是新插入的行数据。可以通过before insert语句修改要插入的值。

before inset on

CREATE TRIGGER tri BEFORE INSERT ON USER
FOR EACH ROW
SELECT new.id INTO @temp;
在这里插入图片描述
在这里插入图片描述

CREATE TRIGGER tir BEFORE INSERT ON USER
FOR EACH ROW
SET new.username = ‘gaohaozhong’;
在这里插入图片描述

可以更改插入的值;

after insert on

CREATE TRIGGER tri AFTER INSERT ON USER
FOR EACH ROW
SELECT new.id INTO @temp;
在这里插入图片描述

update触发器。可以引用一个old表来访问未更新的值,引用一个new表来访问更新后的值。
在before update触发器中。可以改变new
DELIMITER //
CREATE TRIGGER tri BEFORE UPDATE ON USER
FOR EACH ROW
BEGIN
SELECT old.username INTO @o1;
SELECT new.username INTO @n1;
END//
DELIMITER;
在这里插入图片描述
DELIMITER //
CREATE TRIGGER tri AFTER UPDATE ON USER
FOR EACH ROW
BEGIN
SELECT old.username INTO @o1;
SELECT new.username INTO @n1;
END//
DELIMITER;

在这里插入图片描述
delete 触发器,可以引用一个old表。这个表就是删除的行。old中的值是只读的,不能修改。(可以把要删除的行保存)

事务

start transaction;
需要使用这条语句开始一个事务。
在这里插入图片描述

rollback

roll back 可以使数据库恢复到开始事务的地方
在这里插入图片描述

commit

一般的mysql语句都是自动提交的。但是在事务中不会自动提交,只有执行到commit语句时才会真正提交。
(如果要改变mysql自动提交的能力,可以使用语句set autocommit = 0;,注意此修改是针对每个连接,而不是针对服务器的)

在这里插入图片描述
虽然在这里查看的时候没有查到那条数据,但是实际上只有执行了commit才会真正删除。(在其他可视化工具中可以看到,在执行commit语句前,表格并未发生改变)

保留点

START TRANSACTION;
QUERY OK, 0 ROWS affected (0.00 sec)

DELETE FROM USER WHERE username = ‘gao’;
QUERY OK, 1 ROW affected (0.00 sec)

SAVEPOINT save1;
QUERY OK, 0 ROWS affected (0.00 sec)

DELETE FROM USER WHERE username = ‘gaohaozhong’;
QUERY OK, 1 ROW affected (0.00 sec)

ROLLBACK TO save1;
QUERY OK, 0 ROWS affected (0.00 sec)

COMMIT;
QUERY OK, 0 ROWS affected (0.01 sec)
相当于一个存档点,后面的rollback可以撤销从这个保留点到rollba的操作。
在这里插入图片描述
gao被删除而gaohaozhong没有被删除。
事务结束后,保留点将会被自动释放。
也可以用release savepoint [保存点名]如果没有保存点名,将删除离这条语句最近的保存点。

校对 字符集编码

character set [字符集名字]
collate [校对名字]
CREATE TABLE test(
colum1 INT,
colum2 VARCHAR(10)
)CHARACTER SET utf8 COLLATE utf8_bin
在这里插入图片描述

使用utf8字符集编码
使用utf8_bin校对

临时改变校对

select * from user order by username collate utf8_bin;
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_30033509/article/details/109261313