- 基础知识
- 数据库(database) 保存有组织的数据的容器
- Mysql是数据库软件
- 表(table) 某种特定类型数据的结构化清单
- 列 (column) 表中的一个字段。所有表都有一列或者多列组成的。每一列都有对应的数据类型
- 行(row) 表中的一个记录
- 主键(primary key) 一列(或一组列),其值能够唯一区分表中每个行。表中每一行都应该有可以唯一标识自己的一列。表中的任何列都可以作为主键,但是必须满足以下条件:
- 任意两行都不具有相同的主键
- 每个行都必须具有一个主键
- 选择数据库
- use databasename;
- 了解数据库和表 (显示数据库和表)
- show databases;
- show databases.table;
- show columns from databases.table;
- SELECT 检索数据
- 使用select选取列数据,返回的结果是无序的
- SELECT id,name,population from world.City;
- 可以使用星号(*)来代替其他字段,返回表的所有字段数据
- 使用limit 限制返回结果行数
- 每个语句后面需要使用分号(;)
- SQL语句会忽略空格 (一个空格或者多个空格都当成一个空格)
- # 表示后面为注释,为解释代码,不执行
- ORDER BY 数据排序
- 将查询数据排序后再返回数据
- select columns1,columns2 from databases.table order by columns1 desc, columns2 desc; (先遵从第一指标,再遵从第二个指标,以此类推)
- SELECT id,name,population from world.City order by population,name;
- select * from 拍拍贷.LC order by 历史逾期还款期数 desc,总待还本金 desc; 注意哪个是优先排序
- 可以使用任何字段来作为排序的条件
- 可以设定多个字段来排序
- 可以使用 ASC 或 DESC 关键字来设置查询结果是按升序或降序排列。
- 默认情况下,它是按升序排列。
- 可以添加 WHERE...LIKE 子句来设置条件。
- WHERE 数据过滤
- 语法: SELECT field1, field2,...fieldN FROM table_name1, table_name2... [WHERE condition1 [AND [OR]] condition2.....
- SELECT ID,NAME,POPULATION,District FROM world.City WHERE ((POPULATION > 100000) OR (POPULATION < 100)) and (District not in ('Kabol','Alger'));
- 多个过滤子句使用 and/or 连接 (按顺序依次满足)
- WHERE 子句类似于程序语言中的 if 条件,根据 MySQL 表中的字段值来读取指定的数据。
- 为了代码编写的整洁,多个过滤条件之间,需要加(),清晰表明语句执行的顺序和逻辑。
- in/not (一般用于字符串 in ( ) 、not in ( ))
- LIKE 通配符
- 通配符本身实际是SQL的WHERE子句中有特殊含义的字符
- 使用通配符条件就是必须要加上LIKE操作符。
- SELECT * from world.City where name like 'b%=';
- 百分号(%)通配符:% 表示任何字符出现任意次数
- %b: 以b结尾的字符
- b%:以b开头的字符
- %b%:中间含有b的字符
- s%e:以s开头,e结尾的字符
- 通配符不能匹配NULL
- 下划线(_)通配符
- 下划线通配符的用途与%一样,但是下划线只匹配单个字符而不是多个字符。
- 下划线_ 总是匹配一个字符,不能多也不能少
- 使用通配符的技巧
- 不要过度使用通配符,因为它比其他搜索花费更多时间。
- 确实需要使用时,不要把他们放在搜索模式开始处,因为这样是最慢的。
- 仔细注意通配符的位置。如果放错地方,可能不能返回想要的数据。
- 文本操作函数
- LTRIM(s):去掉字符串 s 开始处的空格
- RTRIM(s):去掉字符串 s 结尾处的空格
- UPPER(s):将字符串s的所有字母全部转为大写
- LOWER(s):将字符串 s 的所有字母变成小写字母
- LENGTH(s): 返回字符串长度
- SUBSTRING(s, start, length)):从字符串 s 的 start 位置截取长度为 length 的子字符串
- select id,upper(name) as Name,length(rtrim(ltrim(name))) as len_name from world.City limit 20;
- 函数之间可以嵌套
- length(rtrim(ltrim(name))) 嵌套作用是求字符串name去除首尾空格后的长度
- length(rtrim(ltrim(name))) 作为列名太长,后面使用as len_name更名为len_name
- 作业: 使用substring 与 left
- substring 截取name字符串最左边三个字符,并替代name列为short_name列
- select id,substring(name,1,3) as Short_name,length(rtrim(ltrim(name))) as len_name from world.City limit 20;
- left函数,返回name字符串最左边三个字符,并替代name列为short_name列
- select id,left(name,3) as Short_name,length(rtrim(ltrim(name))) as len_name from world.City limit 20;
- 时间函数
- Curdate() ,CURRENT_DATE() 返回当前日期
- Curtime(),CURRENT_TIME() 返回当前时间
- Date() 返回日期时间的日期部分
- DATEDIFF(d1,d2) 计算日期 d1到d2 之间相隔的天数
- DAY(d) 返回日期值 d 的日期部分
- SELECT DAY("2017-06-15"); -> 15
- Dayofweek(d) 日期 d 今天是星期几,1 星期日,2 星期一,以此类推
- Hour(t) 返回 t 中的小时值
- select hour('11:49:11');11
- 注意输入的时间是字符串格式,加‘ ’
- MINUTE(t) 返回 t 中的分钟值,用法同Hour(t)
- MONTH(d)返回日期d中的月份值,1 到 12。用法同Hour(t)
- YEAR(d)返回年份。用法同Hour(t)
- select curdate(),curtime(),dayofweek(curdate()),month(curdate()),monthname(curdate()),day('2019-02-03');
- 汇总函数/聚集函数
- AVG() 返回某列的平均值
- COUNT() 返回某列的行数
- MAX() 返回某列的最大值
- MIN() 返回某列的最小值
- SUM() 返回某列值之和
- #注意,条件语句都是最新运行的,先过滤后计算
- select avg(population),count(population),min(population),max(population),sum(population) from world.City where population >= 1000000;
- select distinct CountryCode,District from world.City;
- 使用distinct去重
- 结果中不会出现CountryCode,District都一样的重复的行