SQL语法

以MySQL为例

数据库—>表—>数据

目录

SQL语句的分类:

管理数据库:

管理表:

管理数据:

数据约束:

索引

索引结构

索引分类

聚集索引

非聚集索引

覆盖索引

最左前缀原则

存储过程

触发器



使用命令行窗口连接MySQL数据库实例:mysql –u用户名 –p密码

MySQL数据类型(点击链接)

特殊数据类型:Enum,Set,Text,Blob,TIMESTAMP ,默认值

字符和日期型数据应包含在单引号中。


| Database                          |
+---------------------------+
| information_schema       | -- mysql元数据,基础数据
| mysql                                 | --mysq配置数据库,其中包含用户信息。(用户名和密码,权限管理)
| performance_schema     | --mysql数据库软件的运行数据,日志信息,性能数据
| test                                     | --测试数据库。空的
+---------------------------+


SQL语句的分类:

DDL: 数据定义语言【创建/ 删除 / 更改】
  create / drop / alter
DML:数据操作语句 【增删改】
  insert / delete /update /truncate
DQL
: 数据查询语言 【查】
  select / show
 

delete from:可以全表删除 ;可以带条件删除 ;不能删除表的约束;使用delete from删除的数据可以回滚(事务)
truncate table:可以全表删除 ;不能带条件删除 ;可以删除表的约束 ;使用truncate table删除的数据不能回滚 (不产生回滚记录不用回滚空间,所以删除更快)


管理数据库

增加: create database 数据库 default character utf8;
删除: drop database 数据库;
修改: alter database 数据库 default character gbk;
查询: show databases / show create database 数据库;

表空间:

创建表空间:     create tablespace 表空间名 datafile '数据文件名' size 表空间大小

设置为默认表空间, 更改表空间状态, 重命名, 删除, 维护...


管理

选择数据库:use 数据库;

加: create table 表(字段名1 字段类型,字段名2 字段类型......);

级联除: drop table 表  cascade constraints; 


  添加字段:  alter table 表 add [column] 字段名 字段类型;
  删除字段:     alter table 表 drop [column] 字段名;
  修改字段类型:  alter table 表 modify 字段名 新的字段类型;
  修改字段名称 : alter table 表 change 旧字段名 新字段名 字段类型;
  修改表名称: alter table 表 rename [to] 新表名;

询: show tables / desc student;

查询其他用户的存储过程:  select * from DBA_objects where object='PROCEDURE' and owner='用户'


管理数据

增加: insert into 表(字段1,字段2,。。。) values(值1,值2.。。。。);
删除: delete from 表 where 条件;
修改: update set字段1=值1,字段2=值2...... where 条件;
查询: 

--------------------------------------------------------------------------------------------------------------

SELECT语句格式:{}必选;[]可选

SELECT { [all | distinct(去重) ] 列 | *}

[ INTO 新表名]

FROM {表名 | 视图 | 其他查询}

[WHERE筛选条件表达式 ]

[GROUP BY 分组字段名列表 ]

[HAVING 分组条件表达式]

[ORDER BY 排序字段名列表 [ASC | DESC] ]

[COMPUTE 集合函数(列名1) [ BY 列名2] [...n]]

---------------------------------------------------------------------------------------------------------------

 

查询案例

   所有字段: select * from 表;
   指定字段: select 字段1,字段2.... from 表;
   指定别名: select 字段 as 别名 from 表;
   合并列: select (字段1+字段2) from 表;      注:合并列只能合并数值类型的字段
   去重: select distinct 字段 from 表;     

   去重统计:select count(distinct 字段) from table

条件查询:where

a)逻辑条件 :and(&&) or(||) not(!)
select * from 表 where 条件1 and/or 条件2

b)比较条件: > < >= <= = <> ;
     BETWEEN ...AND... 在某一区间的值
     IN(set) 在in列表中的值,如:in(100,200)
select * from 表 where servlet>=90;

c)判空条件:
判断null: is null / is not null
判断空字符串: ='' / <>''

d)

LIKE %(n个字符)   _(一个字符)

IN (值1,值2,值3,...)

BETWEEN 值1 AND 值2

聚合查询(使用聚合函数的查询):SELECT sum(字段)/ avg()/ max()/ min()/ count()  FROM 表

分页查询:【查询语句】+ limit 起始行,查询行数

排序:【查询语句】+ order by 字段asc/desc

asc: 正序,顺序desc:反序,倒序

分组查询 就是按照字段值相同的 把所有条数据汇总成一条.  having对group by 相当于where对select

分组查询:【查询语句】+ group by 字段
               分组后筛选: having 条件

关联查询(多表查询)

多表查询规则:1)确定查询哪些表 2)确定哪些字段 3)表与表之间连接条件 (规律:连接条件数量是表数量-1)

1.交叉连接查询 不推荐,产生笛卡尔乘积现象

2.内连接查询:【只有满足条件的结果才会显示】

   方法1

         SELECT 表一字段,表二字段
         FROM 表一,表二
         WHERE 表与表之间连接条件

   方法2

         SELECT 表一字段,表二字段
         FROM 表一  别名      --这里别名可省略AS
         INNER JOIN 表二
         ON 连接条件


3.左[外]连接查询:【左表数据全部保留】

         FROM 左表
         LEFT OUTER JOIN 右表

4.右[外]连接查询:【右表数据全部保留】

         RIGHT OUTER JOIN

5.自连接查询


时间日期相关函数:

CURRENT_DATE ()      当前日期
CURRENT_TIME()      当前时间
CURRENT_TIMESTAMP ()      当前时间戳
DATE (datetime )     返回datetime的日期部分

字符串相关函数:

待补

数学相关函数:

待补


数据约束

对用户操作表的数据进行约束

默认值: DEFAULT

非空: NOT NULL

唯一: UNIQUE

主键(非空+唯一):PRIMARY KEY

自增长:  ZEROFILL PRIMARY KEY AUTO_INCREMENT    --零填充+主键+自增长

外键(约束两种表的数据):外键设置在副表上,通常参考主表的主键

CONSTRAINT 外键名称FOREIGN KEY(外键) REFERENCES 参考表(参考字段)
添加数据: 先添加主表,再添加副表
修改数据: 先修改副表,再修改主表
删除数据: 先删除副表,再删除主表

级联操作:有了外键约束后,希望直接修改或删除主表数据,从而影响副表数据。就要使用级联操作

级联修改: ON UPDATE CASCADE
级联删除: ON DELETE CASCADE
CONSTRAINT 外键名称 FOREIGN KEY(外键) REFERENCES 参考表(参考字段)  ON UPDATE CASCADE ON DELETE CASCADE


索引

索引结构

B树, B+树和Hash

B树的所有节点既存放 键(key) 也存放 数据(data);

B+树只有叶子节点存放 key 和 data,其他内节点只存放key

索引分类

  1. 主键索引(Primary Key)   主键一定是唯一性索引,唯一性索引并不一定就是主键。
  2. 二级索引 / 辅助索引二级索引的叶子节点存储的数据是主键,通过二级索引,可以定位主键的位置
    1. 唯一索引(Unique Key) 不能出现重复的数据,但是允许数据为NULL, 可以有多个
    2. 普通索引(Index) 为了快速查询数据,可以有多个
    3. 前缀索引(Prefix)  只对文本的前几个字符创建索引,只适用于字符串类型
    4. 全文索引(Full Text) 检索大文本数据中的关键字的信息

 

聚集索引

索引结构和数据一起存放的索引。查询速度非常的快,更新代价大

主键索引属于聚集索引

 

非聚集索引

索引结构和数据分开存放的索引。

可能会二次查询(回表): 叶子节点存储的是主键+列值。最终还是要“回表”,也就是要通过主键再查找一次。

二级索引属于非聚集索引。

 

覆盖索引

需要查询的字段正好是索引的字段,直接根据该索引查到数据, 而无需回表查询。


创建普通索引、UNIQUE索引或PRIMARY KEY索引

添加PRIMARY KEY(主键索引)
ALTER TABLE `table_name` ADD PRIMARY KEY (`column`)

添加UNIQUE(唯一索引)
ALTER TABLE `table_name` ADD UNIQUE (`column`)

添加INDEX(普通索引)
ALTER TABLE `table_name` ADD INDEX index_name (`column`)

添加FULLTEXT(全文索引)
ALTER TABLE `table_name` ADD FULLTEXT ( `column`) 

添加多列索引
ALTER TABLE `table_name` ADD INDEX index_name ( `column1`, `column2`, `column3` )


使用CREATE 语句对表增加普通索引或UNIQUE索引

CREATE INDEX index_name ON `table_name`(`column`)

CREATE UNIQUE INDEX index_name ON `table_name`(`column`)

CREATE PRIMARY KEY INDEX index_name ON `table_name`(`column`) ;

 删除索引

DROP INDEX index_name ON `table_name`

ALTER TABLE `table_name` DROP INDEX index_name

ALTER TABLE `table_name` DROP PRIMARY KEY

 

最左前缀原则

创建的联合索引由三个字段组成:

ALTER TABLE table ADD INDEX index_name (num,name,age)

当查询的条件有为: num / (num AND name) / (num AND name AND age) 时,索引才生效。

有些Mysql版本好像不遵守最左前缀原则,索引也会生效。

 

 

 


存储过程

带有逻辑的sql语句

特点
1)执行效率非常快!存储过程是在数据库的服务器端执行的!!!
2)移植性很差!不同数据库的存储过程是不能移植。

 

-- 创建存储过程
DELIMITER $            -- 声明存储过程的结束符,遇到$就结束
CREATE PROCEDURE pro_test()                --存储过程名称(参数列表)
BEGIN      -- 开始
-- 可以写多个sql语句;
-- sql语句+流程控制
END $                 -- 结束 结束符

-- 执行存储过程
CALL pro_test();               -- CALL 存储过程名称(参数);
 


参数:
IN: 表示输入参数,可以携带数据带存储过程中
OUT: 表示输出参数,可以从存储过程中返回结果
INOUT: 表示输入输出参数,既可以输入功能,也可以输出功能
 

-- 传入参数id,查询信息
DELIMITER $
CREATE PROCEDURE pro_findById(IN eid INT) -- IN: 输入参数
BEGIN
        SELECT * FROM user WHERE id=eid;
END $
-- 调用
CALL pro_findById(4);

-- 带有输出参数的存储过程
DELIMITER $
CREATE PROCEDURE pro_testOut(OUT str VARCHAR(20)) -- OUT:输出参数
BEGIN
        SET str='helljava';-- 给参数赋值
END $
 


 

条件判断

IF ···THEN
ELSEIF ···THEN
ELSE ···
END IF;

循环

-- DECLARE 定义局部变量i,vsum
DECLARE i INT DEFAULT 1;
DECLARE vsum INT DEFAULT 0;
WHILE i<=num DO
SET vsum = vsum+i;
SET i=i+1;
END WHILE;

 

-- ***mysql的变量******
-- 全局变量(内置变量):mysql数据库内置的变量 (所有连接都起作用)
-- 查看所有全局变量: show variables
-- 查看某个全局变量: select @@变量名
-- 修改全局变量: set 变量名=新值
-- character_set_client: mysql服务器的接收数据的编码
-- character_set_results:mysql服务器输出数据的编码

-- 会话变量: 只存在于当前客户端与数据库服务器端的一次连接当中(如果连接断开,那么会话变量全部丢失!)
-- 定义会话变量: set @变量=值
-- 查看会话变量: select @变量

-- 局部变量: 在存储过程中使用的变量就叫局部变量(只要存储过程执行完毕,局部变量就丢失!!)
 


触发器

触发器建在永久表上。当操作了某张表时,希望同时触发一些动作/行为,可以使用触发器完成

 

create trigger 触发器名称
after/before[触发时间] insert/update/delete[监视事件] on 表名[监视地点]
for each row
begin
     sql语句; [触发事件]
end;

当【监视地点】发生【监视事件】就在【触发时间】执行【触发事件】。触发器执行过程中有可能产生new表old表(new是新插入的数据,old是原来的数据)

insert只会有new,代表着要插入的新记录
delete只会有old,代表着要删除的记录
update由于执行的是先删除旧的记录,再插入新的记录,因此new和old都会有

 

-- 创建触发器(添加)
CREATE TRIGGER 触发器名称 AFTER INSERT ON 监听表 FOR EACH ROW  
begin
    insert into 触发表 ( id, name)
    values( new.userid, new.username);     -- 当往监听表插入一条记录时,将nwe表中userid与username添加到触发表的id、name字段
end;

-- 创建触发器(修改)
CREATE TRIGGER 触发器名称 AFTER UPDATE ON 表 FOR EACH ROW  要触发的sql语句;  -- 当往表修改一条记录时···

-- 创建触发器(删除)
CREATE TRIGGER 触发器名称 AFTER DELETE ON 表 FOR EACH ROW  要触发的sql语句;  -- 当往表删除一条记录时···


-- 分配权限账户
GRANT 权限 ON 数据库.表 TO '用户名'@'账户类型'IDENTIFIED BY '密码';
-- 权限:SELECT 允许访问;DELETE 允许删除
 


备份
mysqldump –u root -p 数据库> c:/bak.sql
恢复
mysql –u root -p 数据库 < c:/back.sql
 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xyc1211

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值