简单实用的进阶SQL语句

作者: CSU_IceLee | 来源:发表于2017-03-15 20:27 被阅读790次

    Structured Query Language(SQL)

    入门语句(以MySql为例)我已经默认你已经熟悉了mysql的基本操作了,如果还没接触过mysql等数据库,那么这篇文章可能不适合你。

    本文主要从以下几个方面讲解

    • 对数据库基本操作
    • 对表的增删改查
    • 表的合并
    • 模糊查询
    • 表的排序
    • 记录分组
    • 集合并、交、差运算

    数据库基本操作

    登录:mysql -u root -p
    查看数据库:SHOW DATABASES;
    删除数据库:drop database 数据库名;
    使用数据库:USE 数据库名;
    显示目前的数据库:SELECT DATABASE();


    表的基本操作

    显示当前数据库的数据表:SHOW TABLES;
    建表:create table 表名 ( 属性名 属性类型,......);

    建表举例

    我在这里没有指定主键 主键只需要在相应的后面加上 primary key
    查看数据表的字段:SHOW COLUMNS FROM 表名;
    插入记录:INSERT 表名 VALUES(A,B,C);
    查询行记录:SELECT * FROM 表名;
    查询特定的列:SELECT 列名 FROM 表名 WHERE 条件;
    删除表记录:DELETE FROM 表名 WHERE 表达式;
    例如删除编号为1的记录: DELETE FROM tb1 WHERE id=1;
    修改表中的数据:UPDATE 表名 SET 字段=新值,...WHERE 条件
    例如: UPDATE tb1 SET USERNAME="JHON" WHERE id=1;
    增加字段:ALTER TABLE 表名 ADD 字段 类型...;
    删除字段:ALTER TABLE 表名 DROP 字段名;


    2. 实用进阶

    我会根据实际问题,来引出我们要学习的进阶知识。

    合并多个表

    首先大家先看两个表:

    表1 用户登录
    表2 用户信息
    一个表叫signon(用于用户登录时候验证用户名和密码),一个叫info(用于查看用户的信息)

    我们可能面临上面的情况,会便于查找某些信息将信息分开存储,而用主键与外键进行两个表的约束(这里通过username可以把两个表的记录一一对应)。
    我们有时候需要将两个表合并为一个,然后得到所需的数据(在编程的时候,虽然可以通过username这个主键来查询两个表,然后保存所需的数据,但是还是比较麻烦,特别是表很多的时候,需要查许多次表)。
    这里我们可以用这样的语句,在from后面跟上多个表名即可:

    表的连接
    这样就一步得到了两个表了!
    咦,为什么好像多了一些记录!!!这是因为连接表的时候会进行笛卡尔积运算,所以记录的行数是两个表的记录行数相乘。所以我们要通过条件选择来排除无效的记录!
    去除无效记录
    这里我进行了更名操作as,可以把表名替换成短一点的,并没有其他影响。where条件是两个记录的username相等才留下,其他的是无效的!

    模糊查询

    模糊查询你可能想要进行一些相似的结果,那么这个办法能够基本满足你的需要!看个例子就懂了:

    模糊查询%

    我们把平时使用的=号换成了like关键字,所以后面我们就可以进行特殊的处理,我使用了%,这个符号可以看成是任意的字符串!所以"icelee"被匹配出来了。

    还有一种:

    模糊查询 _

    下划线_可以匹配一个字符。所以模糊查询的时候,我们通常都会使用%,匹配的更广。


    结果排序

    我给info表增加了一个字段:

    增加age字段

    对于年龄字段,所以我想排序该怎么办呢?我们这里本来就是升序的,所以我们来降序输出一下:

    对age降序排列

    所以排序的语法就是order by 列名 asc/desc 分别可以对属性进行升序和降序排列输出


    对记录进行分组

    我们又添加了一个字段(怎么老是添加字段啊),现在表结构如下:

    添加sex字段
    我们想把sex进行分组,那么就要用到group by了:
    对sex进行分组
    这里有些地方要注意,如果要分组,我们不能直接select *,我们能直接使用的是用于分组的属性,如上面的sex,age,而不能用username,否则会报错。如果想通过sex的分组查看username的话该肿么办呢?别急,有办法的: 查看分组数据

    我们通过group_concat(属性)来得到分组后的结果,这个可以将多个值合并到一起。可以看到icelee,和b已经归到一组了。

    我们还可以通过一些聚集函数来查看结果:

    看年龄平均值

    这里的avg(age)是平均值函数。类似的还有:COUNT(属性名)返回记录的数目(不论是否为NULL)、min(属性名)返回最小值、max(属性名)返回最大值,还有许多,大家可以自己查查看。
    如果我们想选出性别人数多于1个的,那么我们可以通过count()和group by`实现:

    having用法

    这里的having只能和group by搭配,和where的作用是一样的!


    集合并、交、差运算

    我们新建了下面两个表:

    • 这个是借款人的表:
    借款人 borrower

    这个是存款人的表:

    存款人 depositor

    我们想查出有存款或者有借款的人该咋办呢???

    简单,我们可以用集合的并运算!学的数学总算派上用场了吧~(__) 嘻嘻……

    mysql16.png

    使用union会自动去重,若想保留重复项,那么可以使用union all

    我们想找出既有存款,又有借款的用户:
    交运算(intersect),很遗憾,mysql并没有提供这个运算。
    但是我们可以自己实现呀:
    思路:首先把两个表并起来(union),然后找出重复的name(我们假定name是主键)就可以了:

    mysql17.png

    注意上面有个temp,如果去掉temp,那么会报Every derived table must have its own alias错误,意思是说要给合并之后的表加上一个别名,随便命名都可。
    差运算:找出只有存款、没有借款的用户。
    我们可以先通过两个表进行并运算,然后分组 count(name) =1,就可以找出只存在一项的用户了,但是这一项我们并不知道只有存款还是只有借款。所以我们可以把这些特定的用户和存款表里的客户进行交运算就可以得出结果了。但是这个代码嵌套比较多,就不贴出来了。

    结语

    这几个查询语句的用法还是很实用的,能够减少输入语句的次数。特别是在程序里面写SQL语句的时候,还是可以好好灵活运用的。

    相关文章

      网友评论

        本文标题:简单实用的进阶SQL语句

        本文链接:https://www.haomeiwen.com/subject/vpwuwttx.html