【数据库】MySQL的sql语句详解

目录

   MySQL之sql语句

一, INSERT语句

insert语句的使用:

1,给表中一次性插入一条记录

2,给表中一次性插入多条记录

二, REPLACE语句

REPLACE语句的使用 

1,语法一 

 2,语法二

3,语法三

三,UPDATE语句

 UPDATE语句的使用

四, delete和TRUNCATE语句

delete和TRUNCATE语句的使用

1,DELETE 

 2,TRUNCATE 

 

五,SELECT语句

1、简单的SELECT语句:

2、SELECT语句中的算术表达式:

常数 

补充说明:MySQL的+默认只有一个功能:运算符

安全等于运算符<=>

3、定义字段的别名:

4、重复记录处理

5、使用where子句限制所选择的记录:

1,WHERE中比较运算符【>,>=,<,<=,=,!=】。

2,使用IS NULL运算符,查询包含空值的记录

3,where中between比较运算符,使用BETWEEN运算符显示某一值域范围的记录。

4,where中使用IN运算符,使用IN运算符获得匹配列表值的记录。

5,where中使用LIKE运算符,使用LIKE运算符执行模糊查询,查询条件可包含文字字符或数字,‘%’可表示零或多个字符,‘_’表示任意单字符。

6,where中使用逻辑运算符

​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插入一条数据,id1name为‘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,语法一 

语法格式1replace [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)被信息(1zhouyi,20000101)覆盖

select * from t1;

 

 

 

三,UPDATE语句

UPDATE 表名

SETcolumn= value[, column= value]

[WHEREcondition];

修改可以一次修改多行数据,修改的数据可用where子句限定,where子句里是一个条件表达式,只有符合该条件的行才会被修改。没有where子句意味着where字句的表达式值为true。也可以同时修改多列,多列的修改中间采用逗号(,)隔开。

 

 UPDATE语句的使用

 

(1)把表t1id4的生日更新为20000104

update t1 set birthday='20000104' where id=4;

 

 (2)看更改后的表t1的所有信息,可以看到id=1birthday被更新了

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)删除表t1id=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,查看chap03t1表的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中salarynull的记录

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表中salary6,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大于7birthday2001年的并集(重复的去掉)等价于or

select * from t1 where salary>9 union select * from t1 where birthday like'2001%'

 

查找t1表中salary大于7birthday2001年的并集(重复的不去掉)

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中查找namei结尾的记录

select * from t1 where name regexp 'i$';

  

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值