MySQL基础之数据管理与常用函数

版权声明:作者已开启版权声明,如转载请注明转载地址。 https://blog.csdn.net/qq_34829447/article/details/82661718

1.添加记录

INSERT [INTO] tbl_name [(col_name,...)] {VALUE|VALUES}(VALUES...);
  • 不指定字段名称INSERT tbl_name VALUE (value)需要按照建表时的字段顺序给每一个字段赋值

  • 列出指定字段INSERT tbl_name(字段名称...) VALUES (值...)

  • INSERT … SET的形式INSERT tbl_name SET 字段名称=值,...;

    eg.INSERT user SET username='d',age=45,email='[email protected]';

  • INSERT … SELECT的形式INSERT tbl_name [(字段名称...)] SELECT 字段名称,... FROM tbl_name [WHERE 条件];

  • 一次添加多条记录INSERT tbl_name [(字段名称,...)] VALUES (值,...),(值...),(值...)

2.修改记录

UPDATE tbl_name SET 字段名称=值,字段名称=值 [WHERE 条件]
#如果不添加条件,整个表中的记录都会被更新

3.删除记录

DELETE FROM tbl_name [WHERE 条件]
#如果不添加条件,整个表中的记录都会被删除
  • 使用DELETE清空数据表的时候不会重置AUTO_INCREMENT的值,可以通过ALTER语句将其重置
    • 查看当前自增长内容的编号SHOW CREATE TABLE tbl_name;
    • 修改当前表中自增长的编号的值ALTER TABLE tbl_name AUTO_INCREMENT=1;
  • 彻底清空数据表TRUNCATE [TABLE] tbl_name;
    • 清空表中所有记录
    • 重置AUTO_INCREMENT的值

4.查询记录

SELECT select_expr,... FROM tbl_name 
[WHERE 条件]
[GROUP BY {col_name|position} HAVING 二次筛选]
[ORDER BY {col_name|position|expr} [ASC|DESC]]
[LIMIT 限制结果集的显示条数]
  • 查询表中所有记录SELECT * FROM tbl_name;

  • 查询指定字段信息SELECT 字段名称 FROM tbl_name;

  • 不用打开数据库,直接传指定库中的表的信息SELECT * FROM database_name.tbl_name;

  • 给字段起别名SELECT 字段名称 [AS] 别名名称 FROM db_name.tbl_name;

    eg.SELECT id AS '编号',username AS '用户名',sex AS '性别' FROM user1;

  • 给数据表起别名SELECT 字段名称,... FROM tbl_name [AS] 别名;

  • 表名.字段名的形式SELECT tbl_name.col_name,... FROM tbl_name;

  • WHERE条件用于筛选出符合条件的记录

    • 比较运算符> >= < <= != <> <=> 【注意:<=> NULL 和is NULL检测是否为NULL值】

    • =和<=>的区别:<=>可以检测NULL值。

    • 可以使用IS [NOT] NULL检测值是否为NULL或者NOT NULL

    • 指定范围[NOT] BETWEEN ... AND

    • 指定集合[NOT] IN (值1,...)

    • 逻辑运算符AND逻辑与 OR逻辑或

    • 匹配字符[NOT] LIKE

    • %通配符匹配任意长度的字符串

    • _通配符匹配任意一个字符

    eg.

    
    #查询用户长度为三位的用户
    
    SELECT id,username,age,sex FROM user1
    WHERE username LIKE '___';
    
    #%与_混合使用,查询姓张且有一个或多个名的用户
    
    SELECT * FROM user1
    WHERE username LIKE '张_%';
  • GROUP BY 分组

    • 把值相同放到一个组中,最终查询出的结果只会显示组中一条记录

    • 分组配合GROUP_CONCAT()查看组中某个字段的详细信息

    eg.
    
    #分组查看信息,使用GROUP_CONCAT()将该组对应字段的内容全部输出
    
    SELECT GROUP_CONCAT(username),age,sex,addr FROM user1
    GROUP BY sex;
    • 配合聚合函数使用

      • COUNT():统计记录总数
      
      #COUNT(*)和COUNT(字段名)的区别
      
      COUNT(字段名)当对应记录为null时,记录个数不算在内
      COUNT(*)会统计null的记录
      • SUM():求和

      • MAX():求最大值

      • MIN():求最小值

      • AVG():求平均值

    • 配合WITH ROLLUP关键字使用:会在记录末尾添加一条记录,是上面所有记录的总和

    • 按照字段的位置来分组

    SELECT id,sex,GROUP_CONCAT(username) AS usersDetail,COUNT(*) AS totalUsers
    FROM user1
    GROUP BY 1;#相当于GROUP BY id,即以第一个查询内容的位置进行排序
    • HAVING子句对分组结果进行二次筛选
    
    #对分组后的结果只保留总人数大于3的记录
    
    SELECT addr,GROUP_CONCAT(username) AS usersDetail,COUNT(*) AS totalUsers
    FROM user1
    GROUP BY addr
    HAVING totalUsers >=3;
  • ORDER BY排序:ORDER BY 字段名称 ASC|DESC

    • 按照多个字段排序ORDER BY 字段名称1 ASC|DESC,字段名称2 ASC|DESC;

    • 实现随机记录(通过RAND()函数)

    SELECT id,username,age
    FROM user1
    ORDER BY RAND();
  • LIMIT限制结果集显示条数

    • LIMIT值:显示结果集的前几条记录

    • LIMIT offset,row_count:从offset开始,显示row_count条记录[offset从0开始]

    
    #显示user表中前5条记录
    
    SELECT * FROM user LIMIT 5;
    
    #或
    
    SELECT * FROM user LIMIT 0,5;

5.多表连接

  • 笛卡尔积的形式[得到表1记录*表2记录长度的表]

    eg.
    SELECT emp.id,emp.username,emp.age,dep.depName FROM emp,dep;#结果为emp记录数*dep记录数
  • 内连接的形式

    • 查询两个表中符合连接条件的记录

    • 语法

    SELECT 字段名称,... FROM tbl_name1
    INNER JOIN tbl_name2
    ON 连接条件
    • 举例
    SELECT e.id,e.username,e.age,d.depName FROM emp AS e
    [INNER] JOIN dep AS d
    ON e.depId=d.id;
  • 外连接的形式

    • 左外连接[先显示左表中的全部记录,再去右表中查询符合条件的记录,不符合的以NULL值代替]
    SELECT 字段名称,... FROM tbl_name1
    LEFT [OUTER] JOIN tbl_name2
    ON 条件;
    • 右外连接[先显示右表中的全部记录,再去左表中查询符合条件的记录,不符合的以NULL值代替]
    SELECT 字段名称,... FROM tbl_name1
    RIGHT [OUTER] JOIN tbl_name2
    ON 条件;

6.外键约束

  • 只有InnoDB存储引擎支持外键

  • 保证数据的一致性和完整性

  • 创建外键

    • 建表时指定外键

    [CONSTRAINT 外键名称]FOREIGN KEY(字段名称) REFERENCES 主表(字段名称)

    注意:

    (1)子表的外键字段和主表的主键字段类型要相似;如果是数值型要求一致,并且无符号也要一致;如果是字符型,要求类型一致,长度可以不同。

    (2)如果外键字段没有创建索引,MySQL会自动帮我们添加索引。

    (3)子表的外键关联的必须是父表的主键。

    (4)外键约束的参照操作:CASCADE从父表删除或更新,子表也跟着删除或更新,级联的操作;SET NULL从父表删除或者更新记录,并设置子表的外键列为NULL;NO ACTION|RESTRICT拒绝对父表做更新或删除操作(默认)

    ALTER TABLE news 
    ADD FOREIGN KEY(cateId) REFERENCES new_cate(id)
    ON DELETE CASCADE ON UPDATE CASCADE
    • 动态添加外键
    ALTER TABLE tbl_name
    ADD [CONSTRAINT 外键名称] FOREIGN KEY(外键字段) REFERENCES 主表(主键字段)
    • 动态添加外键之前表中的记录一定是合法的记录,没有脏值,否则外键添加不成功
  • 删除外键

    • 动态删除外键
    ALTER TABLE tbl_name
    DROP FOREIGN KEY fk_name;

7.特殊形式的查询

  • 子查询

    SELECT 字段名称 FROM tbl_name WHERE col_name = (SELECT col_name FROM tbl_name);
    SELECT 字段名称 FROM tbl_name WHERE col_name IN (SELECT col_name FROM tbl_name);
    • 内层语句查询的结果,可以作为外层语句查询的条件

    • 由IN引发的子查询

    • 由比较运算符引出子查询

    • 由EXISTS引发的子查询(看EXISTS后面的语句真假进行判断)

    SELECT * FROM emp WHERE EXISTS(SELECT depName from dep WHERE id=10);
    • ANY SOME ALL
关键字 ANY SOME ALL
> >= 最小值 最小值 最大值
< <= 最大值 最大值 最小值
= 任意值 任意值
<> != 任意值

* INSERT…SELECT
* CREATE…SELECT
* CREATE TABLE tbl_name1 LIKE tbl_name2(创建跟表2一样表结构的表1)

  eg.
  #创建一个user1表,id username
  CREATE TABLE user1(
    id int UNSIGNED AUTO_INCREMENT KEY,
      username VARCHAR(20)
  )SELECT id,username FROM emp;
  #将user表中的用户名写入到user1表中
  INSERT user1(username) SELECT username FROM user;
  #将stu表中天才用户名添加到user2表中
  INSERT user2 SET username = (SELECT username FROM stu WHERE id=9);
  • 去掉重复值,使用关键字distinct

  • 联合查询

    • UNION(合并重复记录的联合查询)
    SELECT 字段名称,... FROM tbl_name1
    UNION
    SELECT 字段名称,... FROM tbl_name2;
    • UNION ALL(不合并重复记录的联合查询)
    SELECT 字段名称,... FROM tbl_name1
    UNION ALL
    SELECT 字段名称,... FROM tbl_name2;
    • UNION ALL是简单的合并,UNION会去掉表中的重复记录
  • 自身连接查询

    • 无限级分类的实现形式

      • 表如下【pid为0表示顶级分类,其他表示对应分类下的子分类】
    id cateName pid
    1 服装 0
    2 数码 0
    3 男装 1
    4 女装 1
    5 电视 2
    6 液晶电视 5
    7 等离子电视 5
    • 自身连接查询如下
    eg.
    
    #查询所有的分类信息,并且得到其父分类
    
    SELECT s.id,s.cateName AS sCateName,p,cateName AS pCateName
    FROM cate AS s
    LEFT JOIN cate AS p
    ON s.pid=p.id;
    
    #查询所有的分类及其子分类
    
    SELECT p.id,p,cateName AS pCateName,s.cateName AS sCateName
    FROM cate AS s
    RIGHT JOIN cate AS p
    ON s.pid=p.id;
    
    #查询所有的分类并且得到子分类的数目
    
    SELECT p.id,p.cateName AS pCateName,count(s.pCateName) AS count
    FROM cate AS s
    RIGHT JOIN cate AS p
    ON s.pid=p.id
    GROUP BY p.cateName
    ORDER BY id ASC;

8.MYSQL常用函数

  • 数学函数

    • CEIL()进一取整
    • FLOOR()舍掉小数部分
    • ROUND()四舍五入
    • TRUNCATE()截取小数点后几位
    • MOD()取余数
    • ABS()取绝对值
    • POWER()幂运算
    • PI()圆周率
    • RAND()或者RAND(X)0~1之间的随机数
    • SIGN(X)得到数字符号
    • EXP(X)计算e的x次方
    eg.
    SELECT CEIL(1.2);#2
    SELECT FLOOR(2.9);#2
    SELECT ROUND(3.56789,2);#3.57
    SELECT TRUNCATE(3.56789,2);#3.56
    SELECT SIGN(-12);#-1
    SELECT SIGN(12);#1
    SELECT SIGN(0);#0
    ...
  • 字符串函数

    • CHAR_LENGTH()得到字符串的字符数

    • LENGTH()返回字符串的字节数

    • CONCAT(s1,s2,...)将字符串合并成一个字符串[注意:如果字符串中包含NULL,返回拼接结果为NULL]

    • CONCAT_WS(x,s1,s2,...)以指定分隔符拼接字符串

    • UPPER(s1)|UCASE(s1)将字符串转换成大写

    • LOWER(s1)|LCASE(s1)将字符串转换成小写

    • REVERSE(s1)字符串反转

    • LEFT()|RIGHT()返回字符串的前几个字符或后几个字符

    • LPAD()|RPAD()用字符串填充到指定长度

    • TRIM()|LTRIM()|RTRIM()去掉字符串两端的空格;去掉字符串左侧的空格;去掉字符串右侧的空格

    • REPEAT(s,num)重复指定的次数

    • REPLACE()字符串替换

    • SUBSTRING(s,startIndex,num)截取字符串[注意:startIndex下标从1开始]

    • STRCMP(s1,s2)比较字符串,比较ASCII码,如果s1小于s2则返回-1,s1大于s2返回1,s1=s2返回0

    SELECT CHAR_LENGTH('你好呀');#3
    SELECT LENGTH('你好呀');#9[原因:在UTF-8下中文为3个字节]
    SELECT CONCAT('a','b','c');#abc
    SELECT CONCAT('a','b','c',NULL);#NULL
    SELECT CONCAT_WS('-','a','b','c');#a-b-c
    SELECT CONCAT_WS('-','a','b','c',NULL);#a-b-c
    SELECT CONCAT_WS(NULL,'a','b','c');#NULL
    SELECT UPPER('aBc');#ABC
    SELECT LOWER('AbC');#abc
    SELECT LEFT('hello',2),RIGHT('hello',2);#he lo
    SELECT LPAD('abc',10,'?');#???????abc
    SELECT RPAD('abc',10,'!');#abc!!!!!!!
    SELECT CONCAT('*',TRIM(' abc  '),'*'),CONCAT('*',LTRIM(' abc  '),'*'),CONCAT('*',RTRIM(' abc  '),'*');#*abc*,*abc  *,* abc*
    SELECT REPEAT('hello',3);#hellohellohello
    SELECT REPLACE('hello king','king','queen');#hello queen
    SELECT SUBSTRING('abcdef',1,3);#abc
    SELECT STRCMP('a','b');#-1
  • 日期时间函数

    • 返回当前日期
    SELECT CURDATE(),CURRENT_DATE();
    • 返回当前时间
    SELECT CURTIME(),CURRENT_TIME();
    • 返回当前的日期时间
    SELECT NOW(),CURRENT_TIMESTAMP(),SYSDATE();
    • 返回日期中的月份
    SELECT MONTH('2017-02-19');#2
    SELECT MONTH(CURDATE());#9
    SELECT MONTH(CURDATE()),MONTHNAME(CURDATE());#9 September
    • 返回星期几
    SELECT DAYNAME(NOW());#Wednesday
    • 返回一周内的第几天[注意:星期天为1,…]
    SELECT DAYOFWEEK(NOW());#4
    • 返回一年中的第几个星期
    SELECT WEEK(NOW());#36
    • 计算两个日期相差的天数
    SELECT DATEDIFF('2017-03-01','2017-03-05');#-4
  • 其他常用函数

    • 获得版本SELECT VERSION();#5.7.22
    • 获得当前连接数SELECT CONNECTION_ID();#81
    • 获得当前打开的数据库SELECT DATABASE();或者SELECT SCHEME();
    • 获得当前登录的用户SELECT USER()|CURRENT_USER()|SYSTEM_USER()|SESSION_USER();
    • 得到上一步插入操作产生的AUTO_INCREMENT的值SELECT LAST_INSERT_ID();
    • 加密算法加密SELECT MD5(str);
    • mysql默认的密码加密算法(添加用户时使用的加密算法)SELECT PASSWORD(str);

9.MYSQL Workbench的使用

图形化工具进行数据库的创建删除,表格的创建删除,以及数据的增删改查操作

猜你喜欢

转载自blog.csdn.net/qq_34829447/article/details/82661718
今日推荐