简单实用的进阶SQL语句

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语句的时候,还是可以好好灵活运用的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,236评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,867评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,715评论 0 340
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,899评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,895评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,733评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,085评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,722评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,025评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,696评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,816评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,447评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,057评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,254评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,204评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,561评论 2 343

推荐阅读更多精彩内容