数据库技能实战进阶之常用结构化sql语句(上)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库技能实战进阶之常用结构化sql语句(上)相关的知识,希望对你有一定的参考价值。

      常用的结构化查询语言主要分为数据定义语言(DDL)、数据操作语言(DML)、数据控制语言(DCL)和数据查询语言(DQL)。特别在关系型的数据库例如(mysql、mariadb、 percona、DB2、Oracle、SQL server)等都是采用共同的SQL语句来实现增删改查等数据的管理。本文会针对以下的四种类型的结构化SQL来进行介绍。

DDL 数据定义语言  create     drop     alter
DML 数据操作语言  insert    delete   update
DCL 数据控制语言  grant    commit   rollback
DQL 数据查询语言  select

  一、  create与drop 简介

    首先create 与drop 是直接可以对数据库进行操作,例如创建数据库、删除数据库。简单示例如下,

CREATE  DATABASE  IF  NOT EXISTS   DBMS  default  character set utf8; 
#创建一个名为DBMS默认字符集为UTF8的数据库
SHOW databases; #显示当前数据库管理系统里面所有的数据库,就可以看到我们当前创建的DBMS库
Drop  database  DBMS; #删除名为DBMS的数据库

其次,create 和drop能对表进行操作,和对库的操作一致 将database 更改为table,即可创建和删除操作。后面我们要联系增删改查,所以创建以下表SQL如下:

create table if not exists user (
     id int unsigned not null auto_increment primary key,
     username  varchar(30) not  null,
     password  varchar(30)  not  null
     );
或者使用下方SQL。其实原理和表结构是一样,只是呈现方式不一样
   CREATE TABLE  if not exists `user` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `username` varchar(30) NOT NULL,
  `password` varchar(30) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

二、插入数据 insert

    insert 是我们将数据写进数据库最用的方法之一,常见的语法如下:

 insert  into  tablename  (COLUMN ) VALUEs( );
 
 #tablename 是我们要插入数据的目标表名,column是列名,values里面对应的是要插入的值,需要强
 调的当我们对所有列插入即values()中对应列与创建表结构的列顺序对应时,可以省略(COLUMN )
 insert  into  tablename   VALUEs(‘‘,‘‘,‘‘ );
 例如:
 insert  into  user    VALUEs(1,‘linux‘,‘linux‘ );但是给id设置了主键自增所以就没必须做,
 使用上面的列名对应就可以了
 优化后: insert  into  user (username,password )   VALUE(‘python‘,‘java‘ )

 #批量插入数据
 我们还可以用 insert  into  tablename  (COLUMN ) VALUEs( 值1),(值2)...的方式批量插
 入效率高很多。
 isert into  user (username,password )   VALUEs(‘python999‘,334989 ),(‘LInuxmysql‘,‘777‘)
 或者
  insert  into  user (username,password )   VALUE(‘python‘,‘java‘ ),(‘LInuxmysql‘,‘777‘)
 
 注意:经测试values和value插入值时一样,需要注意的是,定义的密码是varchar()字符类型,
 而3334989是整形,也会插入成功,这里是将整形转换成字符串类型。

     将数据插入到数据库的方法除了insert外,还有load data infile (加载文件),以及从其他表查询插入的方法,可以参考之前的文章,甚至可以用navicat之类客户端工具导入。

三、删除数据

   删除数据可以分为删除部分和删除全部,删除全部里面又可以分为只删除数据和表和数据一起删除,删除表和数据 ,可以使用上面提到的drop table  tablename ,删除全部数据可以用delete   from tablename   或者tuncate  table。

    delete   from table  和tuncate table 的区别:

    delete  删除后不会刷新主键的值  例如你删除主键ID(3-5),那么下次插入数据就是从5开始。

delete     from user  #删除所有数据
  insert  into  user (username,password )   VALUE(‘pythonlinux‘,‘javadocker‘ ),(‘LInuxmysql‘,‘redis‘)
select  *  from  user;#插入数据再查询
查询所有数据,检查我们的id:
select   * from user 
11    python    java
12    LInuxmysql    777
13    pythonlinux    javadocker
14    LInuxmysql    redis
 观察表里面的数据,可以发现第一行的id是从11开始的,这就说明delete删除数据的时候不会刷新自增值
 truncate  user 再插入数据观察
 truncate  user#清空所有数据
 insert  into  user (username,password )   VALUE(‘pythonlinux‘,‘javadocker‘ ),(‘LInuxmysql‘,‘redis‘)
select  *  from  user;#再插入数据,再查询
1    pythonlinux    javadocker
2    LInuxmysql    redis
 truncate 清空表后 再插入数据,自增列从0开始。
删除部分数据先插入多条,检查插入后的数据,
 insert  into  user (username,password )   VALUE(‘python‘,‘javadocker‘ ),(‘LInux‘,‘redis‘),(‘linux‘,999)
,(‘redis‘,‘name ‘)

1    pythonlinux    javadocker
2    LInuxmysql    redis
3    python    javadocker
4    LInux    redis
5    linux    999
6    redis    name 
7    python    javadocker
8    LInux    redis
9    linux    999
10    redis    name 
11    python    javadocker
12    LInux    redis
13    linux    999
14    redis    name 

删除  id  >10的部分
delete   from user  where id >10; 然后再插入数据,查询结果如下:
1    pythonlinux    javadocker
2    LInuxmysql    redis
3    python    javadocker
4    LInux    redis
5    linux    999
6    redis    name 
7    python    javadocker
8    LInux    redis
9    linux    999
10    redis    name 
15    python    javadocker
16    LInux    redis
17    linux    999
18    redis    name 
与上面的结果相比 id不连续。

四、条件判断与限制

  条件判断主要根据数学运算符、逻辑运算符以及比较运算符等完成。

1) 数学运算符:
  +,-,*,% 
2)逻辑运算符
 &&,||,and,or ,in, between  and
3)比较运算符:
 =,!=,>=,<=,>,<,<>

五、更改数据或者表结构

   数据的更改使用update完成,而表结构的更改时依靠alter完成,接下来先介绍update更改数据,update和delete一样,在条件限制不够严密的情况下会导致数据全部改写,是比较危险的操作,所以一定要细心。

基本的语法:update  table   set column=" "  where  判断条件;

1    pythonlinux    javadocker
2    LInuxmysql    redis
3    python    javadocker
4    LInux    redis
5    linux    999
6    redis    name 
7    python    javadocker
8    LInux    redis
9    linux    999
10    redis    name 
15    python    javadocker
16    LInux    redis
17    linux    999
18    redis    name 

UPDATE user set  username=‘kailinux‘ where id in (1,7,9)
更改后:(sql语句一般是先执行条件部分先锁定行再锁定列)
1    kailinux    javadocker
2    LInuxmysql    redis
3    python    javadocker
4    LInux    redis
5    linux    999
6    redis    name 
7    kailinux    javadocker
8    LInux    redis
9    kailinux    999
10    redis    name 
15    python    javadocker
16    LInux    redis
17    linux    999
18    redis    name

六、查询数据

  查询数据的sql是我们使用频率最高的sql,而这些SQL的优化程度代表着一个人对数据库的熟悉程度,所以我们在查询部分会涉及到很多的知识点。

1) 查询所有与查询个别字段
  

 select username,password  form  user;

 2)对部分列起别名

select  username as loginname  form  user;
  select  username  loginame ,password  from user; # 注意将新的列名和旧列名空格隔开

 
 3)去掉重复值 distinct

 select distinct  username from  user;
 select   distinct  username  loginame ,password  from user;

 4)使用where条件查询
 

select * from user  where  **** ;

 
 5)对空值的查询
  虽然我们在创建表结构的时候一般设置 not null 但是也有些表会出现null的情况,例如我们将user表更改一下,表里面的数据如下:

1    kailinux    javadocker
2    LInuxmysql    NULL    NULL为字符NULL
3    python    NULL
4    LInux    redis
5    linux    0
6    redis    name 
7    kailinux    javadocker
8    LInux    redis
9    kailinux         #值为‘ ‘
10    redis    name 
15    python    javadocker
16    LInux        #值为‘ ‘
17    linux    999
18    redis    name 
19    ubuntu       #值为默认的NULL
20    centos      #值为默认的NULL

  经分析得,表里面不仅有NULL值还有‘ ’值,我们现在研究一下为NULL和为‘ ‘的查询,对于NULL一般不用,整形默认为0,字符串模式为" "

select * from user where password=‘ ‘;
结果
id   username      password
9    kailinux   
16    LInux  
#查找password列为NULL的方法
select * from user where password=NULL 
结果为空
select * from user where password=‘NULL‘ 
结果为:
2    LInuxmysql    NULL
3    python    NULL

select *  from  user where password  is NULL;
结果为:
19    ubuntu    
20    centos    
所以当我们要查询默认为NULL的时,需要用is NULL查询

6)条件判断 in和 between...and...

  where 条件判断


7)like 模糊查询

like中 %p匹配任意多个字符  _  下划线匹配一个字符

select * from user where username like ‘%linux%‘  #查询用户中包含linux的用户,不区分大小写
1    kailinux    javadocker
2    LInuxmysql    NULL
4    LInux    redis
5    linux    0
7    kailinux    javadocker
8    LInux    redis
9    kailinux    
16    LInux    
17    linux    999

8)使用正则表达式

  mysql是非常牛的一个数据库,不仅函数多,而且支持正则表达式,接下来我们研究一下正则表达式的匹配。 regexp  效率会比like差一点

regexp 正则里面

select * from user where username regexp ‘^linux‘  #以linux开头的
结果:不区分大小写
2    LInuxmysql    NULL
4    LInux    redis
5    linux    0
8    LInux    redis
16    LInux    
17    linux    999
select * from  user  where   username regexp ‘python|redis‘ ; #用户名中包含redis和python的
3    python    NULL
6    redis    name 
10    redis    name 
15    python    javadocker
18    redis    name 
21    PYTHonmysql    
22    rediswinner    
23    PYthonmysql    
24    winnerredis    
select * from  user  where   username regexp ‘ python$|redis$|234$‘ ; 查询以python,redis 
234结尾的用户名
6    redis    name 
10    redis    name 
18    redis    name 
24    winnerredis    
25    PYTHoREDIS    
27    PYthon234    
28    winner1234

9 对查询结果排序  order by   desc  asc

select  *   from user order by id; #默认升序
1    kailinux    javadocker
2    LInuxmysql    NULL
3    python    NULL
4    LInux    redis
5    linux    0
 .......   #部分结果省略
23    PYthonmysql    
24    winnerredis    
25    PYTHoREDIS    
26    redispyhon    
27    PYthon234    
28    winner1234   
 select  *   from user order by id desc;  #降序排列 desc降序
28    winner1234
27    PYthon234
26    redispyhon
25    PYTHoREDIS
.......    #部分结果省略
8    LInux
7    kailinux
6    redis
5    linux
4    LInux
3    python
2    LInuxmysql
1    kailinux

select  *   from user order by id asc;  
结果:
1    kailinux    javadocker
2    LInuxmysql    NULL
3    python    NULL
4    LInux    redis
5    linux    0
 .......   #部分结果省略
23    PYthonmysql    
24    winnerredis    
25    PYTHoREDIS    
26    redispyhon    
27    PYthon234    
28    winner1234  
 默认排序方式为asc方式

     常用的结构化查询语上上篇内容基本结束,在下篇中会从续查询部分内容,完成我们常使用的结构化查询语句的介绍,由于本人水平有限,内容缺乏精彩片段,但是愿意和各位朋友一起分享学习,请各位朋友多指导!


本文出自 “坚持梦想” 博客,请务必保留此出处http://dreamlinux.blog.51cto.com/9079323/1908264

以上是关于数据库技能实战进阶之常用结构化sql语句(上)的主要内容,如果未能解决你的问题,请参考以下文章

Oracle实战笔记(第七天)之PL/SQL进阶

SQL Server数据库高级进阶之事务实战演练

Oracle实战笔记(第六天)之PL/SQL基础

史上最全java架构师技能图谱(上)

常用sql进阶语句

Python测试岗实战进阶,技能对标大厂P6+,年薪轻松40W+!