关系型数据库 RDBMS(Relational Database Managment System)

  • 1.数据以表格的形式出现
  • 2.每行为各种记录名称
  • 3.每列为记录名称所对应的数据域
  • 4.许多的行和列组成一张表单
  • 5.若干的表单组成database

RDBMS术语

  • 数据库: 数据库是一些关联表的集合。
  • 数据表: 表是数据的矩阵。在一个数据库中的表看起来像一个简单的电子表格。
  • 列: 一列(数据元素) 包含了相同类型的数据, 例如邮政编码的数据。
  • 行:一行(=元组,或记录)是一组相关的数据,例如一条用户订阅的数据。
  • 冗余:存储两倍数据,冗余降低了性能,但提高了数据的安全性。
  • 主键:主键是唯一的。一个数据表中只能包含一个主键。你可以使用主键来查询数据。
  • 外键:外键用于关联两个表。
  • 复合键:复合键(组合键)将多个列作为一个索引键,一般用于复合索引。
  • 索引:使用索引可快速访问数据库表中的特定信息。索引是对数据库表中一列或多列的值进行排序的一种结构。类似于书籍的目录。
  • 参照完整性: 参照的完整性要求关系中不允许引用不存在的实体。与实体完整性是关系模型必须满足的完整性约束条件,目的是保证数据的一致性。

SELECT

select语句,用于查询表中的数据,大多数情况下对MySQL的优化主要是对select语句的优化
如:

  1. 查询某个表中的所有数据

    1. SELECT * FROM tablename
  2. 查询某个表中的某两个字段

    1. SELECT COLUNM1, COLUNM2 FROM tablename

    WHERE

    用于对查询的增加条件;对数据进行过滤
    如:

  3. 模糊查询

    1. SELECT * FROM tablename WHERE COLUNM1 LIKE '%A%'
    2. # % 百分号表示一个或多个字符
    3. # _ 下划线表示单个字符
  4. 大于、小于、不等于、区间、and、or等

    1. SELECT * FROM tablename WHERE COLUMN < 10
    2. SELECT * FROM tablename WHERE COLUMN > 10
    3. SELECT * FROM tablename WHERE COLUMN <> 10 # 不等于
    4. SELECT * FROM tablename WHERE COLUMN BETWEEN 10 AND 30
    5. SELECT * FROM tablename WHERE COLUMN < 30 AND COLUMN > 10

    ORDER BY

    排序,默认时升序排序;ASC 升序 DESC 降序
    可以与WHERE混合使用,执行过程时先执行where语句查询再执行ORDER BY排序
    order by 执行时从左至右的顺序

    常用的函数

    最全的MySQL常用函数

  5. select LOWER(ename) from emp 将表emp中的ename列下的大写全部变成小写;与之相反的时upper()

  6. 数学函数

    1. ABS(x) --返回x的绝对值
    2. BIN(x) --返回x的二进制(OCT返回八进制,HEX返回十六进制)
    3. CEILING(x) --返回大于x的最小整数值
    4. EXP(x) --返回值e(自然对数的底)的x次方
    5. FLOOR(x) --返回小于x的最大整数值
    6. GREATEST(x1,x2,...,xn)
    7. --返回集合中最大的值
    8. LEAST(x1,x2,...,xn)
    9. --返回集合中最小的值
    10. LN(x) --返回x的自然对数
    11. LOG(x,y) --返回x的以y为底的对数
    12. MOD(x,y) --返回x/y的模(余数)
    13. PI() --返回pi的值(圆周率)
    14. RAND() --返回0到1内的随机值,可以通过提供一个参数(种子)使RAND()随机数生成器生成一个指定的值。
    15. ROUND(x,y) --返回参数x的四舍五入的有y位小数的值
    16. SIGN(x) --返回代表数字x的符号的值
    17. SQRT(x) --返回一个数的平方根
    18. TRUNCATE(x,y) --返回数字x截短为y位小数的结果
  7. 字符串函数

    1. ASCII(char) --返回字符的ASCII码值
    2. BIT_LENGTH(str) --返回字符串的比特长度
    3. CONCAT(s1,s2...,sn)
    4. --将s1,s2...,sn连接成字符串
    5. CONCAT_WS(sep,s1,s2...,sn)
    6. --将s1,s2...,sn连接成字符串,并用sep字符间隔
    7. INSERT(str,x,y,instr)
    8. --将字符串str从第x位置开始,y个字符长的子串替换为字符串instr,返回结果
    9. FIND_IN_SET(str,list)
    10. --分析逗号分隔的list列表,如果发现str,返回strlist中的位置
    11. LCASE(str)或LOWER(str)
    12. --返回将字符串str中所有字符改变为小写后的结果
    13. LEFT(str,x) --返回字符串str中最左边的x个字符
    14. LENGTH(s) --返回字符串str中的字符数
    15. LTRIM(str) --从字符串str中切掉开头的空格
    16. POSITION(substr,str)
    17. --返回子串substr在字符串str中第一次出现的位置
    18. QUOTE(str) --用反斜杠转义str中的单引号
    19. REPEAT(str,srchstr,rplcstr)
    20. --返回字符串str重复x次的结果
    21. REVERSE(str) --返回颠倒字符串str的结果
    22. RIGHT(str,x) --返回字符串str中最右边的x个字符
    23. RTRIM(str) --返回字符串str尾部的空格
    24. STRCMP(s1,s2) --比较字符串s1s2
    25. TRIM(str) --去除字符串首部和尾部的所有空格
    26. UCASE(str)或UPPER(str)
    27. --返回将字符串str中所有字符转变为大写后的结果
  8. 日期和时间函数 ```sql CURDATE()或CURRENT_DATE()

    1. --返回当前的日期

    CURTIME()或CURRENT_TIME()

    1. --返回当前的时间

    DATE_ADD(date,INTERVAL int keyword)

    1. --返回日期date加上间隔时间int的结果(int必须按照关键字进行格式化)

    例如 SELECT DATE_ADD(CURRENT_DATE,INTERVAL 6 MONTH);

DATE_FORMAT(date,fmt)
—依照指定的fmt格式格式化日期date值 DATE_SUB(date,INTERVAL int keyword) —返回日期date加上间隔时间int的结果(int必须按照关键字进行格式化) 例如 SELECT DATE_SUB(CURRENT_DATE,INTERVAL 6 MONTH);

DAYOFWEEK(date) —返回date所代表的一星期中的第几天(1~7) DAYOFMONTH(date) —返回date是一个月的第几天(1~31) DAYOFYEAR(date) —返回date是一年的第几天(1~366) DAYNAME(date) —返回date的星期名,如:SELECT DAYNAME(CURRENT_DATE); FROM_UNIXTIME(ts,fmt)
—根据指定的fmt格式,格式化UNIX时间戳ts HOUR(time) —返回time的小时值(0~23) MINUTE(time) —返回time的分钟值(0~59) MONTH(date) —返回date的月份值(1~12) MONTHNAME(date) —返回date的月份名,如:SELECT MONTHNAME(CURRENT_DATE); NOW() —返回当前的日期和时间 QUARTER(date) —返回date在一年中的季度(1~4) 例如 SELECT QUARTER(CURRENT_DATE);

WEEK(date) —返回日期date为一年中第几周(0~53) YEAR(date) —返回日期date的年份(1000~9999) 例如,获取当前系统时间 SELECT FROM_UNIXTIME(UNIX_TIMESTAMP()); SELECT EXTRACT(YEAR_MONTH FROM CURRENT_DATE); SELECT EXTRACT(DAY_SECOND FROM CURRENT_DATE); SELECT EXTRACT(HOUR_MINUTE FROM CURRENT_DATE);

返回两个日期值之间的差值(月数) SELECT PERIOD_DIFF(200302,199802);

在Mysql中计算年龄: SELECT DATE_FORMAT(FROM_DAYS(TO_DAYS(NOW())-TO_DAYS(birthday)),’%Y’)+0 AS age FROM employee; 这样,如果Brithday是未来的年月日的话,计算结果为0。 下面的SQL语句计算员工的绝对年龄,即当Birthday是未来的日期时,将得到负值。 SELECT DATE_FORMAT(NOW(), ‘%Y’)

  • DATE_FORMAT(birthday, ‘%Y’) -(DATE_FORMAT(NOW(), ‘00-%m-%d’) < DATE_FORMAT(birthday, ‘00-%m-%d’)) AS age from employee

    1. <a name="yQaSb"></a>
    2. ## 组函数(重点)又称之为 聚合函数
    3. ```sql
    4. AVG(X) --返回指定列的平均值
    5. COUNT(X) --返回指定列中非NULL值的个数
    6. MIN(X) --返回指定列的最小值
    7. MAX(X) --返回指定列的最大值
    8. SUM(X) --返回指定列的所有值之和
    9. GROUP_CONCAT(X) --返回由属于一组的列值连接组合而成的结果,非常有用

    GROUP BY 分组

    涉及到表连接的概念 join

    1. SELECT
    2. ename,
    3. emp.deptno,
    4. sal
    5. FROM
    6. emp
    7. JOIN ( SELECT deptno, MAX( sal ) max_sal FROM emp GROUP BY deptno ) t
    8. WHERE
    9. emp.deptno = t.deptno
    10. AND emp.sal = t.max_sal
    11. HAVING
    12. sal
    13. ORDER BY
    14. sal DESC
    15. # ( SELECT deptno, MAX( sal ) max_sal FROM emp GROUP BY deptno ) 把此部分查询的结果,看做为一张表
    16. # SELECT ename, emp.deptno, sal FROM emp 此查询结果 看作为另外一张表
    17. # 使用join 联合两张表 作为整个select语句;可以类比为一个select语句
    18. # 然后使用where过滤条件

    image.png

使用having 对group by进行限制

image.png