目录
三、数据操作语言DML(对表中的数据进行插入,删除,更新操作)
前言
(1)SQL语言语法特点:
SQL对关键字大小写不敏感
SQL语句可以以单行或多行书写,以分号;结束
SQL的注释:
-- 单行注释,--后面一定要加一个空格
# 单行注释,#后面可加可不加空格
/*
...多行注释
...多行注释
*/
(2)数据库系统分类:关系型数据库RDBMS(MySQL、Oracle、SQL server、PostgreSQL、SQLite)、非关系型数据库NoSQL(Redis、Hbase、Elasticsearch、MongoDB、Cassandra)
关系型数据库存数据就是一张一张的表,表与表之间有关系
非关系型数据库存数据是通过key-values形式存放
(3)SQL适用于所有的关系性数据库,对非关系型数据库不太支持
(4)数据库管理系统DBMS主要由数据库DB和表table组成,一个系统可以有很多数据库,每个数据库可以有很多表
一、第一次使用mysql
(1)手动安装方式:
详细教程请看07-MySQL安装-方式1-解压方式_哔哩哔哩_bilibili
首先去官网下载mysql安装包,并解压。
如果在mysql界面输入命令出错,只需要输入';即可重新输入,使用quit退出mysql,登录mysql可以直接指定密码:mysql -uroot -p'密码'
(2)自动安装方式:请看08-MySQL安装-方式2-安装包方式_哔哩哔哩_bilibili
(3)mysql的卸载:
a : 停止服务 net stop mysql 或win + R 输入services.msc进入服务窗口关闭mysql服务
b : 在控制面板删除mysql(可选,手动安装方式控制面板不会有mysql)
c :找到mysql的安装位置,删除mysql-x.x.x-winxx文件夹
d :显示隐藏文件后,删除"C:\ProgramData\MySQL"所有文件(可选,同b)
e : 清除注册表:win + R 输入regedit删除以下文件:(如果有的话删除)
f :删除环境变量中的配置,MYSQL_HOME和path中的路径
g :管理员权限cmd -->sc delete 自己电脑mysql服务的名字
h : 删除完毕
二、数据定义语言DDL
1、对数据库的常用操作
(1)show databases; : 查看所有数据库
(2)create database [if not exists] 要创建的数据库名字 [charset=utf8]; : 创建数据库
if not exists : 不存在才创建,如果存在则无操作
(3)use 要切换的数据库名字; : 切换数据库
(4)drop database [if exists] 要删除的数据库名字; : 删除数据库
(5)alter database 要修改的数据库名字 character set utf8; : 修改数据库编码
2、对表结构的常用操作
(1)创建表
或:直接指明表属于哪个数据库,同理下文的其它操作都可以这样写。
(2) 常见数据类型:(默认定义的类型都是有符号的类型,添加关键子unsigned即可设置为无符号类型)
例如sid int unsigned, # 表示无符号的int类型
declmal(M,D)M表示有效数字,D表示小数点的位数,declmal类型是一种可以自己设置的类型
timestamp类型可以根据时区自动获取当前的时间
(3)show tables; : 查看当前数据库的所有表名称
(4)show create table 表名; : 查看指定某个表的创建语句(查看该表创建的SQL语句)
(5)desc 表名; : 查看表结构
(6)drop table 表名; : 删除表
3、修改表结构格式
(1)添加列
语法: alter table 表名 add 列名 类型(长度) [约束];
例如: alter table student add dept varchar(20);
(2)修改列名和类型
语法: alter table 表名 change 旧列名 新列名 类型(长度) [约束];
例如: alter table student change dept department varchar(30);
(3)删除列
语法: alter table 表名 drop 列名;
例如: alter table student drop department;
(4)修改表名
语法: rename table 旧表名 to 新表名;
例如: rename table student to stu;
三、数据操作语言DML(对表中的数据进行插入,删除,更新操作)
(1)数据插入insert
语法:
insert into 表名(列名1,列名2,.....) values(值1,值2,....); : 向表中某些列插入一个数据
insert into 表名 values(值1,值2,值3,.....); : 向表中所有列插入一个数据
insert into 表名(列名1,.....) values(值1,...),(值1),......; : 插入多行数据
(2)数据修改update
语法:
update 表名 set 字段名=值,字段名=值......; : 对表中所有数据的某列修改
update 表名 set 字段名=值,字段名=值...... where 条件; : 对表中符合条件的数据修改其列值
例如:
(3)数据删除delete
语法:
delete from 表名 [where 条件];
truncate table 表名;
truncate 表名;
四、约束
对表加入约束的目的是为了保证表中的记录完整性和有效性,比如用户表有些列的值(手机号)不能为空,有些列的值(身份证号)不能重复。
1、约束的分类
主键约束primary key---PK : 该列的值唯一且不为空
自增长约束auto_increment : 该列的值可以自动增长,一般与PK一起使用
非空约束not null : 值不为空
唯一性约束unique : 值必须唯一
默认约束default : 该列的值如果没给,则使用默认值
零填充约束zerofill : 根据该列值的长度填充0,如果该值的长度小于定义的长度,则
在该值的前面补0
外键约束foreign key--FK : 涉及多张表时使用
2、主键约束
PK是一列或多列的组合,其值能唯一的标识表中的每一行,每个表最多只允许有一个主键。
(1)单列主键
方式1:在设计字段的同时直接指定主键
方式2:设计完所有字段后指定主键
约束名可随意取。
(2)联合主键
当主键是由多个字段组成时,不能直接在字段后面声明主键约束
联合主键的各列都不能为空
(3)创建完表之后指定主键(单列,联合都可以)
(4)删除主键约束
3、自增长约束
(1)基本概念
在mysql中,当主键定义为自增长后,这个主键的值就不在需要用户输入数据了,每增加一条记录,主键会自动以相同的步长进行增加,自增长约束都是和PK一起使用的。
默认情况下,auto_increment初始值为1,步长为1
auto_increment约束的字段必须具备not null属性,且只能是整数类型,auto_increment约束字段的最大值受该字段的数据类型约束,如果达到上限,auto_increment就会失效。
(2)指定自增字段初始值
方式1:创建表时指定
方式2:创建表之后指定
alter table 表名 auto_increment=初始值;
注意:delete数据之后自动增长从断点开始
truncate数据之后自动增长从默认初始值 1 开始
4、非空约束
(1)指定非空约束
一张表可以有多个非空约束
字段名 数据类型 not null
alter table 表名 modify 字段名 数据类型 not null;
(2)删除非空约束
alter table 表名 modify 字段名 数据类型;
5、唯一约束
(1)指定唯一约束
指所有记录中字段的值不能重复出现,由于在mysql中NULL和任何值都不同,甚至和自己都不相同,所有唯一约束允许多个NULL出现
(2)删除唯一约束
alter table 表名 drop index 唯一约束名;
方式2有约束名,但方式1没有定义约束名,这时字段名默认就是约束名
6、默认约束
(1)指定默认约束
(2)删除默认约束
alter table 表名 modify 字段名 数据类型 default null;
7、零填充约束
插入数据时,当该字段的值的长度小于定义的长度时,会在该值前面补0,zerofill默认为int(10)
当使用zerofill时默认自动加unsigned(无符号)属性
(1)指定约束
字段名 数据类型 zerofill
(2)删除约束
alter table 表名 modify 字段名 数据类型;
五、数据查询语言DQL(select语句)
(1)语法:
all:显示所有包括重复的值(默认) distinct : 去掉重复值
对表起别名主要用于多表查询例如:
select s.sid,t.sid from student s, teacher t;
对列起别名,用于控制查询的输出例如
select sid as "学号" from student; # 输出结果中列名是“学号”而不是sid了
(2)数据准备:
(3)简单查询
select * from product;
select pname,price from product;
select * from product as p;
select * from product p;
select pname as "商品名",price as "价格" from product;
select price from product;
select all price from product;
select distinct price from product; # 去掉重复值
select distinct * from product; #一行所有内容都一样的行会去掉
select pname, price from product;
select pname, price+10 from product; # 只是显示的时候加10,原始表格不会变化,显然这个时候列名不好看
select pname, price+10 as new_price from product;
(4)运算符
算术运算符:+,-,*,/或DIV,%或MOD
select pname,price + 10 as new_price from product;
比较运算符:
逻辑运算符:NOT或!,AND或&&,OR或||,XOR(异或)
select * from product where pname = "海尔洗衣机";
select * from product where price = 400;
select * from product where price != 400;
select * from product where price <> 400;
select * from product where not(price = 400);
select * from product where price > 400;
select * from product where price >=400 && price <=3000;
select * from product where price >=400 and price <=3000;
select * from product where price between 400 and 3000; # [400,3000]
select * from product where price = 400 or price =340;
select * from product where price in (400,340);
select * from product where pname like "%机"; # %表示任意字符
select * from product where pname like "海%";
select * from product where pname like "%尔%";
select * from product where pname like "____机"; # _表示一个字符
select * from product where pname like "香_";
select * from product where ISNULL(category_id);
select * from product where category_id is null;
select * from product where category_id is not null;
select least(10,20,30); # 10
select least(10,null,30); # null 求最小值、最大值时如果有个值位null,则不会进行比较,直接输出null
select greatest(10,20,30); # 30
select greatest(10,null,30); # null
位运算符:
(5)排序查找order by
asc表示升序,desc表示降序,默认升序
order by 子句放在查询语句的最后面,limit子句除外
order by 子句用于将查询的结果进行排序,order by后面可以加入一个或多个字段,如果是多个字段时,先根据字段1排序,然后如果字段1的值相同则使用字段2再次进行排序
select * from product order by price desc;
select * from product order by price desc,category_id asc;
select distinct price from product order by price desc;
select * from product where category_id = "c001" order by price;
select * from product order by price,pid desc;
(6)聚合查询
之前的查询都是基于行的查询,而使用聚合函数查询是纵向查询,它是对一列的值进行计算,然后返回一个单一的值,另外聚合函数会忽略空值,即认为含null的数据完全不存在。
常见的聚合函数有:
select count(pid) from product;
select count(*) from product; # count(1) 等价于count(*)
select count(pid) from product where price > 200;
select sum(price) from product where category_id = "c001"
select max(price) from product;
select min(price) from product;
select max(price) max_price,min(price) min_price from product;
select avg(price) from product where category_id="c002"
(7)分组查询group by
分组查询是先分组,然后对每组进行查询,得到查询的统计结果,最后利用having对统计的结果再次筛选,这里不能使用where
如果使用了group by语句则select子句之后只能出现分组的字段和聚合函数
group by语句之后可以有多个分组字段,只有所有字段都相同时才可分为同一组
select category_id , count(*) from product GROUP BY category_id; # 统计各个分类商品的个数
/*
category_id count(*)
c001 5
c002 4
c003 2
c004 3
(Null) 1
*/
select category_id , count(*) from product GROUP BY category_id having count(*) > 1;
/*
category_id count(*)
c001 5
c002 4
c003 2
c004 3
*/
select category_id , count(*) c from product GROUP BY category_id having c > 1 order by c;
/*
category_id c
c003 2
c004 3
c002 4
c001 5
*/
(8)分页查询limit
在实际应用中,由于数据量巨大,显示屏长度有限,因此对数据需要采用分页显示方式。例如共30条数据,每页显示5条,共6页。
select * from product limit 5;
select * from product limit 5, 6; # 从第m+1个数据开始,显示6个数据(从索引m开始显示6个数据)mysql的索引从0开始
假设有一个购物网站,规定每页显示60个商品问,第10页第一个商品的索引是多少(540)
(9)insert into select语句
将一张表的数据导入到另一张表中,可以使用insert into select语句
注意:目标表table2必须存在
(10)正则表达式
? 匹配前面的子表达式0次或1次
(.....) 把多个字符作为整体去匹配,即必须是括号中的内容
例子:
# 正则表达式就是判断给定的字符串是否与规则匹配,若匹配返回1,否则返回0
select "abc" regexp "^a"; # 1
select * from product where pname regexp "^海";
select "abc" regexp "a$"; # 0
select "abc" regexp "c$"; # 1
select * from product where pname regexp "水$";
select "abc" regexp ".b"; # 1
select "abc" regexp ".c"; # 1
select "abc" regexp "a."; # 1
select "abc" regexp "[xyz]"; # 0
select "abc" regexp "[xaz]"; # 1
select "a" regexp "[^abc]"; # 0
select "x" regexp "[^abc]"; # 1
select "abc" regexp "[^a]"; # 1
select "stab" regexp ".ta*b"; # 1
select "stb" regexp ".ta*b"; # 1
select "" regexp "a*"; # 1
select "stab" regexp ".(ta)*b"; # 1
select "stab" regexp ".ta+b"; # 1
select "stb" regexp ".ta+b"; # 0
select "stb" regexp ".ta?b"; # 1
select "stab" regexp ".ta?b"; # 1
select "staab" regexp ".ta?b"; # 0
select "a" regexp "a|b"; # 1
select "b" regexp "a|b"; # 1
select "b" regexp "^(a|b)"; # 1
select "a" regexp "^(a|b)"; # 1
select "c" regexp "^(a|b)"; # 0
select "auuuuc" regexp "au{4}c"; # 1
select "auuuuc" regexp "au{3}c"; # 0
select "auuuuc" regexp "au{3,}c"; # 1
select "auuuuc" regexp "au{4,}c"; # 1
select "auuuuc" regexp "au{5,}c"; # 0
select "auuuuc" regexp "au{3,5}c"; # 1
select "auuuuc" regexp "au{4,5}c"; # 1
select "auuuuc" regexp "au{5,10}c"; # 0
select "xababy" regexp "x(abab)y"; # 1
select "xababy" regexp "x(ab)*y"; # 1
select "xababy" regexp "x(ab){1,2}y"; # 1
select "xababy" regexp "x(ab){3}y"; # 0
Navicat工具的使用(SQLyog类似)
(1)点击新建查询,会弹出一个界面,在此界面内我们可以输入SQL语言
(2)CTRL + / : 注释 CTRL + 鼠标的滑轮 : 控制字体大小 CTRL+D:复制该行到下一行
注意:
ifnull(sal,0) #如果sal的值为null,则当作0,否则还是使用原来的值