SQL常用语句总结

一,简介

1.1 数据库是用来存放数据的,对数据库的操作需要用到SQL语句

1.2 数据库种类有也非常多:

关系型数据库:
Oracle、DB2、Microsoft SQL Server、Microsoft Access、MySQL、SQLite

非关系型数据库:
NoSql、Cloudant、MongoDb、redis、HBase

1.3 常用的是Oracle、MySQL、SQLite

二 常用语句操作,MySQL创建用户表为例

2.1 mysql数据类型五大类

整数类型:BIT、BOOL、TINY INT等。
浮点数类型:FLOAT、DOUBLE、DECIMAL。
字符串类型:TEXT、MEDIUM TEXT、LONGTEXT等。
日期类型:Date、DateTime、TimeStamp、Time、Year。
其他数据类型:BINARY、VARBINARY、ENUM、SET等。

2.2 登录MySQL数据库,cmd命令进入MySQL安装目录bin

cd D:\PHPTools\mysql-5.7.25\bin

2.3 登录数据库,执行命令,输入密码

mysql -u root -p

 2.4 创建数据库

create database DONG;

 2.5  删除数据库

drop database DONG;

 2.6 使用数据库

use DONG;

 2.7 创建用户表

CREATE TABLE IF NOT EXISTS `user`(
   `uid` INT UNSIGNED AUTO_INCREMENT,
   `account` VARCHAR(100) NOT NULL,
   `password` VARCHAR(100) NOT NULL,
   `name` VARCHAR(100),
   `sign` VARCHAR(500),
   `avatar` VARCHAR(100),
   `time` DATE,
   PRIMARY KEY (`uid` )
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

 2.8 查看全部表

show tables;

 2.9 查看表数据结构

desc user;

 2.10 删除表

DROP TABLE user;

 2.11 插入用户表数据

INSERT INTO user 
(account,password,name,sign,time) 
VALUES 
("test" , "123456" , "zhangsan" , "hahahahaha" , NOW());

 2.12 查询用户表数据

select * from user;

 2.13 where 根据用户id查询

select * from user where uid =2;

 2.14 更新用户id是2的,用户的名字和签名

UPDATE user SET name="lisi-lisi222" , sign="吼吼吼吼-吼吼吼吼222" where uid=2;

再次查询可以看到用户名和签名已变 

select * from user where uid =2;

 2.15 删除用户id==1的那条数据

DELETE FROM user WHERE uid=1;

再次查询用户表,可以看到没有用户id==1的数据了 

2.16 使用AND(并且), OR(或者)限制查询

AND查询用户表账户是admin,并且密码是123456的数据

select * from user where account='admin' AND password='123456';

OR查询用户表账户是admin,或者账户是dong的数据

select * from user where account='admin' OR account='dong';

三 进阶查询,MySQL创建文章表为例

3.1 创建文章表,并关联用户表,创建用户表外键

CREATE TABLE IF NOT EXISTS `article`(
   `id` INT UNSIGNED AUTO_INCREMENT,
   `title` VARCHAR(255) NOT NULL,
   `content` TINYTEXT NOT NULL,
   `time` DATE,
   PRIMARY KEY (`id` ),
   uid INT  references user(uid)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

3.2  创建多个文章数据

INSERT INTO article 
(title,content,time,uid) 
VALUES 
("哈哈" , "哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈" , NOW() , 1);

INSERT INTO article 
(title,content,time,uid) 
VALUES 
("吼吼" , "吼吼吼吼吼吼吼吼吼吼吼吼吼吼吼吼" , NOW() , 1);

INSERT INTO article 
(title,content,time,uid) 
VALUES 
("嗷嗷" , "嗷嗷嗷嗷嗷嗷嗷嗷嗷嗷嗷嗷嗷嗷嗷嗷" , NOW() , 2);

INSERT INTO article 
(title,content,time,uid) 
VALUES 
("呵呵" , "呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵" , NOW() , 2);

 3.3 查询文章表数据,可以看到有4条数据

select * from article;

 3.4 LIKE 模糊查询

select * from article where  content like "%哈哈";

 3.5 查询uid==1的文章

select * from article where uid =1;

3.6 文章表按用户ID降序排序,ASC,DESC

select * from article ORDER BY uid DESC;

3.7 ORDER BY分组,文章表按用户分组,统计每个人有多少文章

SELECT COUNT(*) FROM article GROUP BY uid;

HAVING 配合 GROUP BY使用,用来过滤分组的条件

先看下全部用户数据

如下满足账户数量大于,才显示结果

select count(*) from user group by time HAVING count(account) > 2;

 下面如果数量大于4不会显示结果,因为分组后账户数量不大于4

3.8 LIMIT 限制返回条数,如下限制返回2条数据

 select * from article LIMIT 2;

3.9 分页

select * from table_name limit [offset,] rows

offset:指定第一个返回记录行的偏移量(即从哪一行开始返回),注意:初始行的偏移量为0
rows:返回具体行数

如下,文章表从第2行开始,检索3行记录,即:检索记录行 3-4

select * from article limit 2 ,3;

 分页格式,查询每页10条数据,page页码,pageSize每页条数

select * from table limit (page-1)*pageSize,pageSize; 

 select * from article limit 0,10;

3.10 ALTER修改表

MODIFY修改文章表字段类型,修改title 从 VARCHAR 改为 TEXT

ALTER table article MODIFY title TEXT;

 或使用CHANGE 修改文章表字段名字,修改 title 为 name。CHANGE 关键字之后,紧跟着的是你要修改的字段名,然后指定新字段名及类型

ALTER table article CHANGE title name TEXT;

 查询后可以看到title的名字和类型都变了

3.11 UNION 连接两个以上的表,将结果合并到一个集合中,多个 SELECT 语句会删除重复的数据

SELECT uid FROM user
UNION
SELECT uid FROM article
ORDER BY uid;

 用户表和文章表都存在用户id是1,2的数据

3.12 DISTINCT 关键字与 SELECT 语句一起使用,来消除所有重复的记录,并只获取唯一一次记录

如下查询用户表的time字段,会去除重复的time字段

select DISTINCT time from user;

四 多表联合查询

4.1 OIN 按照功能大致分为如下三类:

  • INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录。
  • LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录。
  • RIGHT JOIN(右连接): 与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录。

4.2 先看下两个表的全部数据

4.2 INNER JOIN 内连接

查询两个表的相同uid的 

select a.name , b.name from user a INNER JOIN article b ON a.uid=b.uid;

4.3  LEFT JOIN 左连接

 select a.name , b.name from user a LEFT JOIN article b ON a.uid=b.uid;

 4.4 RIGHT JOIN 右连接

 select a.name , b.name from user a RIGHT JOIN article b ON a.uid=b.uid;

五 事务

5.1 事务概念

  • 在数据库中,我们将一条 SQL 语句称为一次基本的操作。将若干条 SQL 语句“打包”在一起,共同执行一个完整的任务,这就是事务。
  • 事务( Transaction)由一次或者多次基本操作构成,或者说,事务由一条或者多条 SQL 语句构成。

5.2 事务控制语句:

  • BEGIN 或 START TRANSACTION 显式地开启一个事务;

  • COMMIT 也可以使用 COMMIT WORK,不过二者是等价的。COMMIT 会提交事务,并使已对数据库进行的所有修改成为永久性的;

  • ROLLBACK 也可以使用 ROLLBACK WORK,不过二者是等价的。回滚会结束用户的事务,并撤销正在进行的所有未提交的修改;

  • SAVEPOINT identifier,SAVEPOINT 允许在事务中创建一个保存点,一个事务中可以有多个 SAVEPOINT;

  • RELEASE SAVEPOINT identifier 删除一个事务的保存点,当没有指定的保存点时,执行该语句会抛出一个异常;

  • ROLLBACK TO identifier 把事务回滚到标记点;

  • SET TRANSACTION 用来设置事务的隔离级别。InnoDB 存储引擎提供事务的隔离级别有READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ 和 SERIALIZABLE。

5.3 MYSQL 事务处理主要有两种方法

1、用 BEGIN, ROLLBACK, COMMIT来实现

  • BEGIN 开始一个事务
  • ROLLBACK 事务回滚
  • COMMIT 事务确认

2、直接用 SET 来改变 MySQL 的自动提交模式:

  • SET AUTOCOMMIT=0 禁止自动提交
  • SET AUTOCOMMIT=1 开启自动提交

5.4 事务的使用

 begin;开始,   commit;结束,中间是执行的语句称之为事务

 begin;

 INSERT INTO user
    (account,password,name,sign,time)
     VALUES
    ("shiwu" , "123456" , "shiwu_name" , "事务签名" , NOW());

 

INSERT INTO article
    (name,content,time,uid)
    VALUES
    ("事务" , "事务事务事务事务事务事务" , NOW() , 1);

 

commit;

 六 临时表

6.1 作用:

MySQL 临时表在我们需要保存一些临时数据时是非常有用的。临时表只在当前连接可见,当关闭连接时,Mysql会自动删除表并释放所有空间

6.2 TEMPORARY创建临时表

CREATE TEMPORARY TABLE IF NOT EXISTS `article_te`(
   `id` INT UNSIGNED AUTO_INCREMENT,
   `title` VARCHAR(255) NOT NULL,
   `content` TINYTEXT NOT NULL,
   `time` DATE,
   PRIMARY KEY (`id` ),
   uid INT  references user(uid)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

 6.3 使用 SHOW TABLES命令显示数据表列表时,你将无法看到 article_te表

 6.4 删除临时表,默认情况下,当你断开与数据库的连接后,临时表就会自动被销毁。当然你也可以在当前MySQL会话使用 DROP TABLE 命令来手动删除临时表。

DROP TABLE article_te;

七 视图

7.1 视图的特点:可以被当作是虚拟表或存储查询

  • 视图跟表格的不同是,表格中有实际储存数据记录,而视图是建立在表格之上的一个架构,它本身并不实际储存数据记录。
  • 临时表在用户退出或同数据库的连接断开后就自动消失了,而视图不会消失。
  • 视图不含有数据,只存储它的定义,它的用途一般可以简化复杂的查询。 比如你要对几个表进行连接查询,而且还要进行统计排序等操作,写SQL语句会很麻烦的,用视图将几个表联结起来,然后对这个视图进行查询操作,就和对一个表查询一样,很方便。
     

7.2 视图的创建

创建一个用户表的视图,查询全部用户信息

 create VIEW user_view as select * from user;

 7.3 查看视图

show tables;

 7.4 查询视图数据

select * from user_view;

 7.5 插入修改视图跟正常表一样

INSERT INTO user_view 
(account,password,name,sign,time) 
VALUES 
("view" , "123456" , "view_name" , "呀呀呀呀" , NOW());

 查询可以看到已经有该条数据了

 7.6 删除视图

DROP view user_view;

 再次查看表,已经没有该视图了

八 触发器 TRIGGER

8.1  触发器是数据库的一种回调机制,当达到某种条件时,会自动执行语句。

8.2  创建触发器结构

DELIMITER ||
​​​​​CREATE TRIGGER
[触发器的名字] [触发器执行时机] [触发器监测的对象] ON [表名] FOR EACH ROW
BEGIN

[触发器主体代码]
[触发器主体代码]
END

||

  • DELIMITER ||MySQL 默认分隔符是; 但在触发器中,我们使用 || 表示触发器的开始与结束。
  • [触发器的名字]这里填写触发器的名字
  • [触发器执行时机]这里设置触发器是在关键动作执行之前触发,还是执行之后触发。
  • [触发器监测的对象]触发器可以监测 INSERTUPDATEDELETE 的操作,当监测的命令对触发器关联的表进行操作时,触发器就被激活了。
  • [表名]将这个触发器与数据库中的表进行关联,触发器定义在表上,也附着在表上,如果这个表被删除了,那么这个触发器也随之被删除。
  • FOR EACH ROW这句表示只要满足触发器触发条件,触发器都会被执行,也就是说带上这个参数后,触发器将监测每一行对关联表操作的代码,一旦符合条件,触发器就会被触发。
  • [触发器主体代码]这里是当满足触发条件后,被触发执行的代码主体。这里可以是一句 SQL 语句,也可以是多行命令。如果是多行命令,那么这些命令要写在 BEGIN...END 之间。

8.3 创建触发器​​​​​​​

创建如下结构的触发器

CREATE TRIGGER 触发器名 BEFORE|AFTER 触发事件
ON 表名 FOR EACH ROW
BEGIN
    执行语句列表
END

默认分隔符,结束符是分号,以 ; 作为结束执行语句,但可能会与触发器中需要的分行起冲突,为解决此问题可用DELIMITER,如:DELIMITER ||,可以将结束符号变成||,当触发器创建完成后,可以用DELIMITER ;来将结束符号变成;

 DELIMITER || 

触发插入数据前,会把对应的账户改为"_new "

CREATE TRIGGER user_demo BEFORE INSERT
ON user FOR EACH ROW
BEGIN
if new.account='trigger_test' THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT ='禁止用户名是trigger_test';
END IF;
END
||

使用IF...THEN...END IF 来创建一个监测 INSERT 语句写入的值是否在限定的范围内的触发器

如果插入的账户是trigger_test,就会返回错误信息(禁止用户名是trigger_test)

 8.4 查看已创建的触发器

show triggers;

8.5 执行触发器,上面条件是插入用户表数据会触发,我们来插入数据看看

插入一条账户名是trigger_test的数据

INSERT INTO user 
(account,password,name,sign,time) 
VALUES 
("trigger_test" , "123456" , "trigger_test" , "触发器签名_test" , NOW());

可以看到触发器返回了错误信息,禁止用户名是trigger_test 

 8.6 删除触发器

drop trigger user_demo;

再查看触发器已经没有了

8.8 注意:

触发器是针对数据发送改变才会被触发,对应的操作只有

  • INSERT
  • DELETE
  • UPDATE

九 导出数据

9.1 使用 SELECT ... INTO OUTFILE 语句导出数据

SELECT * FROM user INTO OUTFILE 'D:\\PHPTools\\mysql-5.7.25\\outfile\\user.txt';

9.2 可能出现导出失败的提示

 这是mysql设置的权限的问题,可以使用show variables like ‘%secure%’;查看 secure-file-priv 当前的值是什么

 可以看到最后一行 secure_file_priv 是 NULL就代表禁止导出,需要在my.ini里面配置一下

MySQL服务重启一下

 再次执行导出

 SELECT * FROM user INTO OUTFILE 'D:\\PHPTools\\mysql-5.7.25\\outfile\\user.txt';

可以看到成功了 

 在目录里面会生成一个文本文件

 打开文件内容如下

十 导入数据

10.1 使用 LOAD DATA 导入数据

新建一个 user2 空白表

 10.2 查询空数据

10.3 导入刚的 user.txt 文件

LOAD DATA LOCAL INFILE 'D:\\PHPTools\\mysql-5.7.25\\outfile\\user.txt' INTO TABLE user2;

10.4 再次查询,看到数据已经导入进来了

10.5 注意:

如果指定LOCAL关键词,则表明从客户主机上按路径读取文件。如果没有指定,则文件在服务器上按路径读取文件

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值