zoukankan      html  css  js  c++  java
  • MYSQL教程系统(一)-select

    sql查询关键字 select

    数据表可以想象成一张excel表格,由行和列组成,每列有字段代表这一列的内容(但区别的是,excel字段列(表头)占表中一行,而数据库的表字段不占用一行,数据表存储的内容就相当于excel表格去掉表头一行)

    以下是作为测试讲解设计的数据库表格,表名为test,有三个列表,分别为id, name, age,sex

    id name age sex
    1 阿猫 12 M
    2 阿狗 32 F
    3 阿三 12 F
    4 阿四 3 M
    5 阿五 4 M
    6 阿六 15 F
    7 阿七 6 F
    8 阿莎 1 M
    9 阿信 2 M
    10 阿猫 12 M

     

     

     

    查询某一列数据

    select 列名 from 表名 

    select name from test; #查询name列所有内容

    查询多列数据

    select 列名1,列名2,列名n from 表名 

    select name,age from test; #查询name和age列所有内容

    查询所有列数据

    select * from 表名 

    select * from test; #查询所有内容

    查询不同行数据

    select DISTINCT 列名 from 表名 

    DISTINCT关键字是用来过滤重复的记录,只保留一条,返回唯一不同的值

    DISTINCT关键字只能返回过滤的字段内容,其他非过滤的是不会被显示的

    select DISTINCT age from test;  #查询不同的age

    select DISTINCT sex from test;  #查询不同的性别

    select DISTINCT age, sex from test;  #查询age+sex不同的组合

    select sex, DISTINCT age from test;  #报错,distinct必须放在最前

    Q: 那如何查询多个字段并显示,但仅仅某个字段是唯一的呢?

    查询限制行数数据

    默认查询结果是返回全部行数据 

    select 列名1,列名2,列名n from 表名 LIMIT 5

    select * from test LIMIT 10; #查询结果不多于10行,默认从第1行开始,等同LIMIT 0,10

    select * from test LIMIT 5,10; #查询结果从第6行开始往后10行,也就是6-15行(第一行是行0

    排序

    默认查询结果的顺序是不确定的,如果想要在结果集上排序,在最后加上关键字ORDER BY子句

    select 列名1,列名2,列名n from 表名 ORDER BY 列名1,列名2,列名n

    select * from test order by id; #根据id排序

    select * from test order by name, age; #先根据name排序,再根据age排序

    升降序

    默认排序是升序,如果想要降序,必须制定关键字DESC(降序),ASC(升序,其实没有多大用处,默认就是升序,所以一般也就不指定了)

    select 列名1,列名2,列名n from 表名 ORDER BY 列名1 DESC,列名2,列名n  DESC

    select * from test order by id desc ; #根据id降序排序

    select * from test order by name desc, age; #先根据name降序排序,再根据age升序排序

    如果想在多个列都进行同一种排序,那么必须在每个列指定关键字

     select * from test order by name desc, age desc; #先根据name降序排序,再根据age降序排序

    过滤数据

    select 列名1,列名2,列名n from 表名 WHERE 表达式

    select * from test where id=1 ; #查询id=1的行

    表达式操作符

    操作符 说明
    = 等于 
    <> 不等于
    != 不等于
    < 小于
    <= 小于等于
    > 大于
    >= 大于等于
    BETWEEN AND 在指定的两个值之间,包含两头

     

     

     

     

     

     

    select * from test where id > 1;

    select * from test where name != '阿三';

    select * from test where id between 1 and 10;

    特殊的空值检查 IS NULL

    空值在mysql中是NULL值,而不是0,空字符串,仅仅包含空格

    select * from test where age IS NULL;

    逻辑操作符

    逻辑操作符就是用来联结或者改变where子句的关键字

    操作符        说明                  
    AND 同时满足所有给定条件
    OR 满足任意一个指定条件
    IN 与指定范围的每一个条件都可以匹配
    NOT 否定之后跟的任何条件,可以与IN,BETWEEN,EXISTS子句取反

    select * from test where age > 3 and age < 10;

    select * from test where age > 3 or id < 10;

    select * from test where age > 3 or age< 2 and name='啊三'; #注意顺序,and优先,查询的是age<2的阿三或者age>3的所有人

    select * from test where (age > 3 or age< 2) and name='啊三'; #注意顺序,括号优先,查询的是age>3 或者 age<2的阿三

    任何时候都应该加上括号,更加清晰

    select * from test where age in (3,4,5,6,10); # 查询年龄是3,4,5,6,10的行

    select * from test where age not in (3,4,5,6,10); # 查询年龄不是3,4,5,6,10的行

    IN和OR有什么区别呢?

    1,在使用长的范围值时候,IN更加简洁

    2,操作符少,不用考虑顺序

    3,执行块

    4,IN可以包含其他select语句

    通配符

    通配符可以用来匹配值的一部分的特殊字符 ,使用关键字LIKE操作符,告诉mysql利用通配符匹配

    通配符       说明                           
    % 匹配任何字符出席任意次数,包括0,1,多个字符
    _ 匹配单个任意字符

     

     

    select * from test where name LIKE '阿%'; #查询name以阿开头,后面跟任何字符,不管有多少字符

    select * from test where name LIKE '%dw%';  #查询name包含dw,不论他前面和后面跟着多少任意字符

    select * from test where name LIKE '%';  #查询name为任意字符的行,除了name为NULL

    select * from test where name LIKE '阿_'; #查询name以阿开头,后面跟1个字符

    使用通配符技巧

    使用通配符查询效率比上面所介绍的都要慢,这里给出一些技巧

    • 不要过度使用通配符,如果其他操作符能够达到目的应该使用其他操作符
    • 在确实需要使用通配符时,除非绝对有必要,否则不要把他们用在搜索模式的开始处,
    • 仔细注意通配符的位置,如果放错地方,可能不会返回想要的数据

    正则表达式

    正则表达式可以用来查找,提取和替换文本中某些特殊的字符集合,关键字REGEXP,类似LIKE

    但是LIKE和REGEXP不同,LIKE匹配整个字符串,REGEXP匹配子串,利用定位符^$可以使得和LIKE一样

    下面介绍一些常用的正则表达式,mysql正则表达式支持的仅仅是一般所说的正则表达式的一部分

    符号         说明                           
    . 匹配任意1个字符
    ^ 匹配开头
    $ 匹配结尾
    [[:<:]] 词的开始
    [[:>:]] 词的结尾
    A|B 或的匹配,匹配A或B即可
    [ABCDE] 匹配多个字符之一,另一种或的匹配,1|2|3实际等同[123]
    [^ABCDE] 匹配不包含ABCDE的字符
    [1-9][a-z] 匹配任意数字,任意字母
    \ 匹配特殊字符,包括.|-[]和其他特殊字符,\.匹配.  \匹配  \n换行等等
    [:alnum:] 任意字母和数字,同[1-9a-zA-Z]
    [:alpha:] 任意字母,同[a-zA-Z]
    [:blank:] 空格和制表符,同\t
    [:cntrl:] ASCII控制字符,ASCII0到37和127
    [:digit:] 任意数字,同[0-9]
    [:graph:] 与[:print:]相同,不包括空格
    [:lower:] 任意小写字母,同[a-z]
    [:upper:] 任意大写字母,同[A-Z]
    [:print:] 任意可打印字符
    [:space:] 包括空格在内的任意空白字符,同[\t\f\n\r\v]
    [:punct:] 既不在[:alnum:]又不在[:cntrl:]中的任意字符
    [:xdigit:] 任意十六进制数字,同[a-fA-F0-9]
    * 0个或多个匹配
    + 1个或多个匹配
    ? 0个或1个匹配
    {n} 指定数目的匹配
    {n,} 不少于指定数目的匹配
    {n,m} 不少于n,不超过m的数目匹配

    select * from test where name REGEXP '阿'; #查询name中有阿字的行,如果换成LIKE,则是查询name=阿的行

    select * from test where name REGEXP '^阿$'; #查询name=阿的行

    select * from test where name REGEXP '阿.'; #查询name中有阿字,且阿字后面跟着一个任意字符

    mysql正则表达式匹配不区分大小写,如果要区分,加上关键字BINARY

    select * from test where name REGEXP BINARY 'ABCabc.Dd'; 

    select * from test where age REGEXP ‘10|20’; 

    select * from test where age REGEXP ‘[123]’;

    可以在没有数据表的情况下,测试正则表达式

    select 'hello' REGEXP '[0-9]'; #匹配成功返回1,匹配失败返回0

  • 相关阅读:
    pandas读写csv最简代码
    csv.read和csv.write
    交叉验证
    纪念被win10大更新搞崩的vbox
    c++中关于保留小数的小总结
    Java里的值传递与“引用传递”——一些想法
    Eclipse使用遇到的一些问题及解决方案(持续更新)
    Pray for 京阿尼——愿逝者安息,伤者早日康复
    洛谷p1208—混合牛奶【典型贪心】(关联排序小技巧)
    洛谷p1217—回文质数(默默宣传打表法)
  • 原文地址:https://www.cnblogs.com/happyuu-2019/p/13719855.html
Copyright © 2011-2022 走看看