SQL 中可以分为两个部分:数据操作语言 (DML) 和 数据定义语言 (DDL)。
SQL (结构化查询语言)是用于执行查询的语法。但是 SQL 语言也包含用于更新、插入和删除记录的语法。
查询和更新指令构成了 SQL 的 DML(数据操作语言) 部分:
SELECT - 从数据库表中获取数据
UPDATE - 更新数据库表中的数据
DELETE - 从数据库表中删除数据
INSERT INTO - 向数据库表中插入数据
SQL 的数据定义语言 (DDL) 部分使我们有能力创建或删除表格。我们也可以定义索引(键),规定表之间的链接,以及施加表间的约束。
SQL 中 DDL(数据定义语言) 语句:
CREATE DATABASE - 创建新数据库
ALTER DATABASE - 修改数据库
CREATE TABLE - 创建新表
ALTER TABLE - 变更(改变)数据库表
DROP TABLE - 删除表
CREATE INDEX - 创建索引(搜索键)
DROP INDEX - 删除索引
文章用到的有:增、删、改、查、视图、存储过程、储存函数
文章目录
一、定义:create、drop、alter
增加:
1.创建数据库:create database 名称;
删除:
1.drop database [if exists] 名称;
修改:
1.alter database 名称 default character set gb2312
二、操作:select、insert、update、delete、drop
2.1、增加 (create):
类型:int整型、double浮点型、bool浮点型、date日期型、time时间型、char定长字符类型、varchar可变长字符
1)、创建表的示例:并且增加主键
> create table 名称(
> 字段1 int not null auto_increment, *******************一定不能忘了要有逗号
> 字段2 char(50) not null default,
> 字段3 char(50) null,
> primary key(字段1)
> );
auto_increment:每次插入新记录时,自动地创建主键字段的值
默认地,AUTO_INCREMENT 的开始值是 1,每条新记录递增 1。
要让 AUTO_INCREMENT 序列以其他的值起始,可使用下列 SQL 语法:
> ALTER TABLE 表名 AUTO_INCREMENT=100
2)、创建表的示例:并且增加外键
创建表2的时候增加外键并和表1关联
已存在表名1,主键是:字段1
create table 表名2(
字段1 int not null, -- 主键
字段2 char(50),
字段3 int not null, -- 外键
primary key (字段1), -- 设置本表的主键
constraint 外键名 foreign key (本表字段3) references 表名1(主键字段1)
-- 解释:设置本表的外键和哪个表的主键进行关联
-- foreign key 外键名 (本表字段3) references 表名1(主键字段1) --(另一种写法)
)
-- 外键名要设置,要不然后期删除外键时较麻烦,如果忘了话,系统会有默认的名称
-- foreign key后面的字段3是自己表想要设置的外键字段
-- 表名1后面的字段1是另一张关联表的主键字段
3)、创建普通/唯一索引
> create index/unique 索引名 on 表名(cus_name(3),asc)---客户姓名列前3个字符创建索引
> create index/unique 索引名 on 表名(cus_id, cus_name)---字段组合索引
2.2、增加 (insert)
1).插入一行或多行数据
> insert into 表名 values(xx,xx,xx)/(xx,xx,xx),(xx,xx,xx)
2).使用insert…… set ……插入部分列值
> insert into 表名 set 字段名="xx",字段名="xx";
3).使用insert……select语句子查询数据
> insert into 表名 select ……
2.3、删除:
1. 删除表
> drop table 表名
2.索引删除
> drop index 索引名 on 表名
3.删除一行或多行
> delete from 表名 where 字段名="xx";
4、删除外键
> alter table 表名 drop foreign key 外键名 -- 如果没有设置外键名,就查看系统默认的外键名
2.4、修改:
使用alter table语句,增加或删减列、创建或取消索引、更改原有列的数据类型、重命名列或表、更改标的评注和表的引擎类型,为表重新创建触发器,存储过程、索引和外检。
1、向表中添加或删除列(字段):add [column]、drop [column]
> alter table 名称
> add column 新字段 char(50) not null default "shanghai" after 旧字段
----- 解释:不能为空、默认值是:shanghai,在旧字段之后添加
>drop column 新字段-------------删除的话只需要写字段名即可
2、将表中的某一列重命名:change [column] 旧字段名称 新字段名称
> alter table 名称
> add column 旧字段名称 新字段名称 char(100) not null default "shanghai" after 旧字段
-------------不能为空、默认值是:shanghai,在旧字段之后添加
> change 旧字段 新字段 完整性约束条件(not null char(20)等)
-------------重命名字段
3、修改或删除指定列的默认值:alter…alter…set/drop…
> alter table 表名
> alter column 字段1 set default "M";------------默认值改为M常量
> alter column 字段1 drop default; --------------删除字段的默认值
4、只修改指定列的数据类型,不干涉它的列名:alter…modify…
> alter table 表名
> modify column 字段1 char(50) first
---------该字段的字符长度为50,且为该表的第一列
5、增加主键或者索引
> alter table 表名 add primary key(id)/index/unique
6.增加主键或者索引
< alter table 表名 drop primary key/index/unique
7、增加外键
表2已存在时,给表2增加外键并和表1进行关联
> alter table 表名2
> add constraint 外键名 foreign key (表名2的字段) references 表名1(主键字段)
或者
> alter table 表名2
> add foreign key 外键名 (表名2的字段) references 表名1(主键字段)
8、为表重新赋名
> alter table 旧表名 rename to 新表名
> rename table 旧表名 to 新表名
9、使用update修改表中的数据
> update 表名 set 字段名="xx" where xingming(修改时的条件)="zhangsan"
10、修改数据库连接的密码
条件:需要先连接mysql进入后,然后才能修改 (mysql -u root -p)
> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的密码'
2.5、查看:
1、显示库中所有的表名
> show tables
2、查看一列或多个列的信息,并且使用别名
> show columns, cus as name from 表名
3、查看表中的索引
> show idnex from 表名
4.交叉(笛卡尔积)连接查看(多表查询)
> select * from 表名1,表名2
5.使用case语句查询结果集中的数据
-- 显示名字和性别
> select name,
> case
> when sex="M" then "男"
> else "女"
> end as 性别
> from 表名;
6.内连接(inner join或者join)
> select * from 表1 inner join 表2 on 表1.NO = 表2.NO
7、外连接:左连接(left join)
> select * from 表1 left join 表2 on 表1.NO = 表2.NO
----以左表为基准表,如果左表没有的字段右表也不显示,左表有的右表没有显示为Null
8、外连接:右连接(right join)
> select * from 表1 right join 表2 on 表1.NO = 表2.NO
> -- 和左连接类似
查询时的条件判断语句语法:
1.判定范围:between……and…… 包含值
> select * from 表名 where 字段名 between 20 and 50;
2.枚举范围:in
> select * from 表名 where 字段名 in (xx,xx,xx)
3.判定空值: is null
>select * from 表名 where 字段名 is null;
4.子查询-结合“in”使用: 查询分数大于80分的学生姓名(因为有2个表不能直接跟条件)
> select name from table_student where student_no in (select student_no from table_score where score>80);
5.分组:group by
> select sex count(*) as "人数" form table group by sex
6.指定过滤条件:having 配合group by 使用
having:过滤分组、可包含聚合函数、分组后进行过滤
where: 过滤行、 不能含聚合函数、数据分组前过滤
需求:列出相同地址中满足客户人数大于3的所有姓名以及地址
> select name, adress from table group by name,adress having count(*)>3;
7.排序:order by
order by:排序产生的输出、任意列都可使用、不一定需要
group by:分组行,输出可能不是分组的排序、只可能使用列或表达式列、若与聚合函数使用,则必须使用
需求:按照姓名和地址降序输出姓名和性别
> select name,sex from table order by name, adress desc; 默认升序(asc)
8.限制返回的行数:limit
> select id,name from table order by id limit 1,3----从第二行开始,返回3行数据
三、视图(view)
1、创建(create view)
create view 视图名 as select * from user where id=1;
2、插入(insert)
insert into 视图名 values(xx,xx,xx,xx,xx); 向视图中插入数据
3、删除(drop/delete)
drop view 视图名; 删除视图
delete from 视图名 where id= 10;删除视图的数据
4、修改(alter/update)
alter view 视图名 as select * from user where id= 2;修改视图定义
update 视图名 set 字段名=xx where id=2; 修改视图数据
5、查看视图结构
show create view 视图名
6、查看视图数据
select * from 视图名;
四、存储过程(procedure)
declare cid int(10) 声明局部变量;全局变量需要加@
1、创建存储过程:给一个id即可修改性别
mysql> delimiter $$ -- 用户定义结束符标志
mysql> create procedure procedure_cus(in cid int, in csex char(1)) -- cid、csex 参数
> begin -- 开始
> update 表名 set 性别= csex where id= cid; -- SQL语句
> end $$ -- 结束
调用:
call 存储过程名(参数)
2、删除存储过程
> drop procedure 存储过程名
五、流量控制语句:
-条件判断:
if……then……else:
if 条件 then
表达式1
else
表达式2
end if;
case
-循环语句:
while语句
while 条件
表达式1
end while
repeat语句
loop语句
六、存储函数(function)
1、创建存储函数
给定id,返回性别,如果没有,则返回"没有该客户
msyql> delimiter $$
mysql> create function func_cus(cid int) -- cid(参数)
> returns char(2)
> deterministic
> begin
> declare sex char(2); -- 声明局部变量
> select cus_sex into sex from 表名 where cus_id=cid;
> if sex is NULL then
> return (select "没有该客户")
> else if sex = "F" then
> return (select "女");
> else
> return (select "男")
> end if;
> end if; -- 这两个if对应上面两个if、else if
> end $$
调用:
select 存储函数名(参数)
2、删除存储函数:
> drop function 存储过程名
存储过程和存储函数的区别
存储过程:可以拥有输出参数、使用call调用、不能含有return(即没有返回值)
存储函数:不能有输出参数、使用selec调用、必须包含一条return(即有返回值)
**函数**:一般写函数时都是为了调用,所以不需要输出结果,需要的是返回值(return),可以方便调用