目录
1,WHERE中比较运算符【>,>=,<,<=,=,!=】。
3,where中between比较运算符,使用BETWEEN运算符显示某一值域范围的记录。
4,where中使用IN运算符,使用IN运算符获得匹配列表值的记录。
5,where中使用LIKE运算符,使用LIKE运算符执行模糊查询,查询条件可包含文字字符或数字,‘%’可表示零或多个字符,‘_’表示任意单字符。
7,联合查询,对两个结果求并集,使用union(去掉重复的)或者union all(不去掉重复的行)
8,排序显示,查询语句执行的查询结果默认是按数据插入顺序排列,实际上可能需要按某列的值大小排列,按某列排序采用order by 列名[desc],列名…;设定排序列的时候可采用列名、列别名。
9,where中使用正则表达式,<列名> regexp '正则表达式'
MySQL之sql语句
一, INSERT语句
在表里面插入数据:默认情况下,一次插入操作只插入一行
方式1:
INSERT[INTO] 表名 [(column[, column...])] VALUES(value[, value...]);
方式2:
insert[into] 表名 set字段1=值1, 字段2=值2
一次性插入多条记录:
INSERT[INTO] table[(column[, column...])] VALUES(value[, value...]),(value[, value...])
注意:
1、如果为每列都指定值,则表名后不需列出插入的列名
2、可以使用如下方式一次插入多行:insert into表名[(列名,…)] select语句
3、如果需要插入其他特殊字符,应该采用\转义字符做前缀,
insert语句的使用:
1,给表中一次性插入一条记录
此时数据库chap04下的表t4没有任何记录
select * from t4;
查看表t4的表结构:
desc t4;
方法一:
(1)给表t4插入一条数据,id为1,name为‘zhouyi’
没设置主键的情况下,可以重复插入此信息
insert into t4 (id,name) values (1,'zhouyi');
(2)查看插入记录后的表t4的所有信息
select * from t4;
方法二:
(1)向表t4插入一条记录,id=2,name='zhouer‘
insert into t4 set id=2,name='zhouer';
(2)查询t4下的所有信息:
select * from t4;
2,给表中一次性插入多条记录
一次性插入多条数据,前面的属性字段可以省略;后面的值用括号括起来,逗号隔开
(1)给表t4一次性插入两条记录,(3,'zhousan'),(4,'zhousi')
insert into t4 (id,name) values (3,'zhousan'),(4,'zhousi');
(2)查看t4表的所有信息
select * from t4;
二, REPLACE语句
replace语句的语法格式有三种语法格式。
语法格式1:replace [into] 表名 [(字段列表)] values(值列表)
语法格式2:
replace[into] 目标表名[(字段列表1) select(字段列表2) from源表 where条件表达式
语法格式3:
replace[into] 表名 set字段1=值1, 字段2=值2
REPLACE与INSERT语句区别:
replace语句的功能与insert语句的功能基本相同,不同之处在于:使用replace语句向表插入新记录时,如果新记录的主键值或者唯一性约束的字段值与已有记录相同,则已有记录先被删除(注意:已有记录删除时也不能违背外键约束条件),然后再插入新记录。
使用replace的最大好处就是可以将delete和insert合二为一(效果相当于更新),形成一个原子操作,这样就无需将delete操作与insert操作置于事务中了
REPLACE语句的使用
1,语法一
语法格式1:replace [into] 表名 [(字段列表)] values(值列表)
没设置主键前,replace等价于insert
(1)插入一条记录(1,'zhouwu')
replace into t4 values(1,'zhouwu');
(2)查看t4表下的所有信息
select * from t4;
设置主键后
(1)创建表t1,并设置主键
create table t1(
id int primary key,
name char(30),
birthday date
);
(2)将t4表的name列进行非空约束
alter table t1 modify name char(30) not null;
(3)查看表t1的表结构:
desc t1;
(4)给t1表插入(1,'zhouyi',20000101),(2,'zhouer',20000102)记录
insert into t1 values (1,'zhouyi','20000101'),(2,'zhouer','20000102');
(5)查看表t1的所有记录:
select * from t1;
(6)使用replace插入记录(1,'zhouwu','20000101'),
replace into t1 values (1,'zhouwu','20000101');
(7)查看表t1下的所有信息,会发现之前id1的记录,被新的id1记录覆盖
select * from t1;
2,语法二
语法格式2:
replace[into] 目标表名[(字段列表1) select(字段列表2) from源表 where条件表达式
(1)把t4表中的(4,'zhousi')插入到t1表中
replace into t1 (id,name) select * from t4 where id=4;
(2)查看插入后的t1表的所有记录
select * from t1;
(3)把t4表中的(1,'zhouwu')插入到t1表中 与t1表中的主键重复
replace into t1 (id,name) select * from t4 where name='zhouwu';
(4)查看t1表会发现之前的zhouwu那条记录被新的zhouwu 记录覆盖
select * from t1;
3,语法三
语法格式3:
replace[into] 表名 set字段1=值1, 字段2=值2
如果主键值重复,依旧会替换
(1)在表t1中输入记录 id=1,name='zhouyi',birthday='20000101'
replace into t1 set id=1,name='zhouyi',birthday='20000101';
(2)查看表t1的所有信息,可以看到表t1中的(1,zhouwu)被信息(1,zhouyi,20000101)覆盖
select * from t1;
三,UPDATE语句
UPDATE 表名
SETcolumn= value[, column= value]
[WHEREcondition];
修改可以一次修改多行数据,修改的数据可用where子句限定,where子句里是一个条件表达式,只有符合该条件的行才会被修改。没有where子句意味着where字句的表达式值为true。也可以同时修改多列,多列的修改中间采用逗号(,)隔开。
UPDATE语句的使用
(1)把表t1中id为4的生日更新为20000104
update t1 set birthday='20000104' where id=4;
(2)查看更改后的表t1的所有信息,可以看到id=1的birthday被更新了
select * from t1;
如果匹配到两行记录,则两行记录都更新
四, delete和TRUNCATE语句
DELETE FROM table_name[where条件];
TRUNCATE TABLE table_name
DROP、TRUNCATE、DELETE的区别:
delete:删除数据,保留表结构,可以回滚,如果数据量大,很慢。
truncate: 删除所有数据,保留表结构,不可以回滚,一次全部删除所有数据,速度相对很快。
drop: 删除数据和表结构(文件),删除速度最快。
delete和TRUNCATE语句的使用
1,DELETE
DELETE FROM table_name[where条件];
删除整个表的数据
(1)删除整个表t4的数据
delete from t4;
(2)查看表t4的所有信息,可以看到表t4中的内容空了
select * from t4;
(3)查看t4的表结构,看到表t4的结构还在
desc t4;
删除表中一条数据
(1)删除表t1中id=4的一行记录
delete from t1 where id=4;
(2)查看表t1的所有记录,Id=4的一行记录被删除掉了
select * from t1;
2,TRUNCATE
TRUNCATE TABLE table_name
(1)删除表t1
truncate table t1;
(2)查看表t1的所有信息,表t1中的数据全部被删除
select * from t1;
(3)表t1的表结构还在
desc t1;
五,SELECT语句
1、简单的SELECT语句:
SELECT {*, column[alias],...}
FROM table;
说明:
select*表示所有列。
FROM提供数据源(表名/视图名)
1,查看chap04下面的t4表
select * from chap04.t4;
2,查看chap03下t1表的name信息
select name from chap03.tb_dept;
2、SELECT语句中的算术表达式:
对数值型数据列、变量、常量可以使用算数操作符创建表达式(+ - * /)
对日期型数据列、变量、常量可以使用部分算数操作符创建表达式(+ -)
运算符不仅可以在列和常量之间进行运算,也可以在多列之间进行运算。
运算符的优先级:
乘法和除法的优先级高于加法和减法;
同级运算的顺序是从左到右;
表达式中使用括号可强行改变优先级的运算顺序;
常数
1,计算常量1+1
select 1+1;
2,在数据库chap04下面创建一个表t1,包含属性id,name,slary,performance
create table t1(
id int primary key,
name char(30) not null,
salary int,
performance decimal(3,2)
);
查看表t1的表结构
desc t1;
向表t1中插入记录(1,'xiaoming',10,1.3),(2,'xiaohong',6,2.0)
(3,'xiaohei',13,1.12)(4,'xiaobai',8,1.678)
insert into t1 values (1,'xiaoming',10,1.3),(2,'xiaohong',6,2.0),(3,'xiaohei',13,1.2),(4,'xiaobai',8,1.678);
(1)查看t1表的所有数据:
select * from t1;
(2)算出每个人的工资(工资*绩效)
select id,name,salary*performance from t1;
(3)算出每个人的年薪(12个月)
select id,name,salary*12 "年薪" from t1;
补充说明:MySQL的+默认只有一个功能:运算符
SELECT100+80; # 结果为180
SELECT'123'+80; # 只要其中一个为数值,则试图将字符型转换成数值,转换成功做预算,结果为203
SELECT 'abc'+80; # 转换不成功,则字符型数值为0,结果为80
SELECT 'This'+'is'; # 转换不成功,结果为0
SELECT NULL+80; # 只要其中一个为NULL,则结果为NULL
1,计算字符串'123'加1的值
只要其中一个为数值,则试图将字符型转换成数值,转换成功做预算,
select '123'+1;
2,计算字符串和数值的和,
(1)字符串与数值的和;转换不成功,则字符型数值为0,结果为数值的值
select 'abc'+1;
(2)字符串与字符串的和; 转换不成功,结果为0
select 'abc'+'def';
3, 只要其中一个为NULL,则结果为NULL
(1)计算null+1
select null+1;
(2)计算null+asd
select null+'asd';
NULL值的使用:
空值是指不可用、未分配的值
空值不等于零或空格
任意类型都可以支持空值
包括空值的任何算术表达式都等于空
字符串和null进行连接运算,得到也是null
安全等于运算符<=>
1,可作为普通运算符的=,两个值进行比较时,2<=>2结果是1,2<=>3是0;
如果=或者<=>两边的值相等,返回值为1,否则返回值为0
select 2=2;
select 2=3;
select 2<=>2;
select 2<=>3;
2,也可以用于判断是否是NULL;
where salary isNULL等价于where salary <=>NULL;
where salary is not NULL等价于where not salary <=>null;
在t1表中查找salary等于null的所有字段
方法一:
select * from t1 where salary<=>null;
方法二:
select * from t1 where salary is null;
在t1表中查找salary不等于null的所有字段
方法一:
select * from t1 where not salary<=>null;
方法二:
select * from t1 where salary is not null;
3、定义字段的别名:
改变列的标题头
用于表示计算结果的含义
作为列的别名
如果别名中使用特殊字符,或者是强制大小写敏感,或有空格时,都可以通过为别名添加加双引号实现。
查询表t1中的id(编号),name(姓名);表中的信息并没有变化,只是显示别名
select id as "编号",name "姓名" from t1;
4、重复记录处理
(1)此时的t1表的所有信息如下:
select * from t1;
(2)缺省情况下查询显示所有行,包括重复行;可以看出有两个相同的6
select salary from t1;
(3)使用DISTINCT关键字可从查询结果中清除重复行,可以看出只有一个6
select distinct salary from t1;
DISTINCT的作用范围是后面所有字段的组合
5、使用where子句限制所选择的记录:
使用WHERE子句限定返回的记录,WHERE子句在FROM 子句后。
语法:SELECT [DISTINCT] {*, column[alias], ...} FROM table[WHEREcondition(s)] [order by column[alias], ...];
WHERE中的字符串和日期值:字符串和日期要用单引号扩起来;日期值是格式敏感的。
1,WHERE中比较运算符【>,>=,<,<=,=,!=】。
查找在20010101年前出生的
select * from t1 where birthday<'20010101';
2,使用IS NULL运算符,查询包含空值的记录
查找t1中salary为null的记录
select * from t1 where salary is null;
3,where中between比较运算符,使用BETWEEN运算符显示某一值域范围的记录。
查找salary大于8元小于15元的记录
select * from t1 where salary between 8 and 15;
4,where中使用IN运算符,使用IN运算符获得匹配列表值的记录。
查找t1表中salary是6,7,9中的记录
select * from t1 where salary in (6,7,9);
5,where中使用LIKE运算符,使用LIKE运算符执行模糊查询,查询条件可包含文字字符或数字,‘%’可表示零或多个字符,‘_’表示任意单字符。
查找t1表中2000年出生的记录
select * from t1 where birthday like "2000%";
6,where中使用逻辑运算符
(1)使用and运算符,所有条件都是满足
查找t1表中salary大于9元,且2001年出生的记录
select * from t1 where salary>9 and birthday like "2001%";
(2)使用OR运算符,只要两个条件满足一个就可以
查找t1表中salary大于9元,或者2001年出生的记录
select * from t1 where salary>9 or birthday like "2001%";
(3)使用NOT运算符,取反的意思
查找t1表中salary不是(6,7,10)的记录,null不参与判断
select * from t1 where salary not in (6,7,10);
7,联合查询,对两个结果求并集,使用union(去掉重复的)或者union all(不去掉重复的行)
查找t1表中salary大于7和birthday是2001年的并集(重复的去掉)等价于or
select * from t1 where salary>9 union select * from t1 where birthday like'2001%'
查找t1表中salary大于7和birthday是2001年的并集(重复的不去掉)
select * from t1 where salary>9 union all select * from t1 where birthday like'20001%';
8,排序显示,查询语句执行的查询结果默认是按数据插入顺序排列,实际上可能需要按某列的值大小排列,按某列排序采用order by 列名[desc],列名…;设定排序列的时候可采用列名、列别名。
查找salary大于6的记录并排序(默认升序asc)
select * from t1 where salary>6 order by salary;
查找salary大于6的记录并排序(默认升序,末尾加desc为降序)
select * from t1 where salary>6 order by salary desc;
9,where中使用正则表达式,<列名> regexp '正则表达式'
mysql8.0[chap04]>select* fromt1 where name regexp'^xiao';
基本正则:^,$,\,.,*,[0-9],[a-z],[A-Z],[a-Z],[^],\(\),\<,\>
扩展正则:+,?
在t1中查找name为i结尾的记录
select * from t1 where name regexp 'i$';