美文网首页
MySQL(Structured Query Language)

MySQL(Structured Query Language)

作者: 常伟波 | 来源:发表于2018-08-13 11:07 被阅读0次

    1. 创建数据库与数据库的操作

    语句 说明
    CREATE DATABASE database_name; 创建数据库
    CREATE DATABASE IF NOT EXISTS database_name; 判断数据库是否存在,不存在则创建,存在则不创建
    CREATE DATABASE database_name charset=utf8; 创建数据库,并制定字符集
    show databases; 显示所有的数据库
    USE database_name; 选择数据库
    SELECT database; 显示当前的数据库
    SHOW VARIABLES LIKE "character_set_database"; 查看当前数据库的编码格式
    ALTER DATABASE database_name charset=utf8; 修改数据库的字符集
    DROP DATABASE database_name; 删除数据库
    DROP DATABASE IF NOT EXISTS database_name; 判断数据库是否存在后删除数据库。

    2.数据库的储存引擎 和 数据类型

    语句 说明
    SHOW ENGINES; 查看所有的储存引擎
    SHOW VARIABLES LIKE 'default_storage_engine'; 查看默认的SQL储存引擎
    SET default_storage_engine=INNODB; 修改默认的额储存引擎
    储存引擎的类型 数字数据类型 文本数据类型 日期的数据类型

    3.数据库中的表的操作

    CREATE TABLE IF NOT EXISTS table_name(id INT NOT NULL AUTO_INCREMENT,name CHAR(10) NOT NULL,PRIMARY KEY(id));
    创建的表 ,设置数据类型,限制,AUTO_INCREMENT 设置自增长 ,PRIMARY KEY() 指定主键,主键是唯一的,是表中每一行的唯一标示

    语句 说明
    SHOW TABLES 查看表
    SHOW CREATE TABLE table_name 查看表详细信息
    DESC table_name 查看表的结构
    DESC 数据表名 列名 查看某一列的信息
    CREATE TABLE students( stu_id int NOT NULL AUTO_INCREMENT, birthday date NOT NULL, address varchar(50) NOT NULL *__DEFAULT “山西长治”__*, PRIMARY_KEY(stu_id) ); 设置默认值
    ALTER ATBLE table_name ADD age int DEFAULT 0 添加新字段(列)
    ALTER ATBLE students ADD( gender int default 0, phonenum int(11) ); 添加多个新字段,用逗号分隔
    ALTER TABLE 表名 CHANGE 字段名 新字段名 数据类型; 修改字段名(列)
    ALTER TABLE 表名 DROP 字段名; 删除字段名
    ALTER TABLE 表名称 ALTER column 要修改的字段名 SET DEFAULT 修改为的默认值; 修改默认值
    ALTER TABLE 表明 ALTER column 要删除的字段名 DROP DEFAULT; 删除默认值
    重命名表
    RENAME TABLE 数据表名1 To 数据表名2 1
    ALTER TABLE oldtable RENAME AS newtable; 2
    删除表
    DROP TABLE [IF EXISTS] 数据表名; 删除表
    复制表(结构)
    CREATE TABEL IF NOT EXISTS 表名 LIKE 源表名; 复制表(复制表结构)

    4. 表内容的操作

    CREATE TABLE customers ( userid int NOT NULL AUTO_INCREMENT, name char(50) NOT NULL, address char(200) NOT NULL, email char(50) NOT NULL, PRIMARY KEY(userid) ); 创建一个表

    语句 说明
    INSERT INTO customers values(10010,'李同学','北京市朝阳区','1234567@qq.com') 插入完整的行(表中的所有字段必须全部插入)
    SELECT * FROM customers; 查询以插入的内容
    INSERT INTO customers(userid,name,adress,email) values('10011','黄同学','北京市通州区','1234789@qq.com') 根据列插入内容(没有设置默认值和设置为空的字段,必须放在字段中)
    INSERT INTO customers(userid,name,adress,email) values ('10011','黄同学','北京市通州区','1234789@qq.com'), ('10012','黄同学','北京市通州区','1234789@qq.com'), ('10013','黄同学','北京市通州区','1234789@qq.com'); 多行插入(用“,”逗号隔开)
    将一个表的内容插入到另一个表中
    INSERT INTO 表名称1 (字段名…) SELECT 字段名… from 表名称2 将表2的数据内容插入表1中(插入的内容必须一一的对应)
    INSERT INTO customer1 (userid,name,address,email) SELECT userid,name,address,email FROM customer; `
    删除数据
    1) DELETE FROM customers WHERE userid=10010; 从表中删除指定的行(where 后面指定要删除的行)
    2)DELETE FROM 表名称; 从表中删除所有的行

    修改(更新)数据

    1. 修改(更新)指定行
      UPDATE 表名 SET 字段名=修改为的内容 WHERE 指定的主键;
      eg: UPDATE customers SET email='1234@sina.com' WHERE userid=10010;
      2)修改对应字段的所有值:
      UPDATE customers SET gender=1;
      3)修改(更新)多个列`
      UPDATE customers SET email='123@sian.com',name='刘先生' WHERE userid=10013;

    5.mySQL检索数据

    语句 说明
    SELECT 列名 FROM 表名; 检索单个列
    SELECT DISTINCT 列名 FROM 表名; 检索不同的列
    SELECT * FROM 表名; 检索全部内容
    SELECT 列名,列名,…,列名 FROM 表名; 检索多个列
    SELECT 表名.列名 FROM 表名; 完全限制表名
    SELECT 表名.列 FROM 数据库.表; 完全限制表名(可以选择不先选择数据库)

    6.表数据的查询where(过滤)

    语句 说明
    where 的句子的一般形式: SELECT 字段名 FROM 表名 WHERE 条件;
    = 等于 select name from customers where name='李逵';
    <> 不等于 select name from customers where name<>'李逵';
    != 不等于 select name from customers where name!='李逵';
    < 小于 (一般情况下后面会跟数字) select name from customers where name<'李逵'; select name from customers where name<'李逵';
    <= 小于等于 select * from customers where userid<=10014;
    > 大于 select * from customers where userid>10014;
    >= 大于等于 select * from customers where userid>=10014;
    BETWEEN .. AND ..在指定的两个值之间 select name from customers where userid between 10010 and 10014; 注意:在使用BETWEEN时,必须指定两个值,所需范围的低端值和高端值。这两个值必须用AND关键字分隔。BETWEEN匹配范围中所有的值,包括指定的开始值和结束值.
    空值检查(IS NULL)
    一般格式 SELECT 列 FROM students WHERE 列 IS NULL;
    例子 SELECT name from customers WHERE age is NULL;
    AND 操作符
    一般格式: SELECT 列,列 FROM students WHERE 条件1 and 条件2;
    eg: SELECT name,adress FROM customers WHERE userid<=10015 AND adress='北京市';
    OR操作符
    一般格式: SELECT 列,列 FROM students WHERE 条件1 OR 条件2;
    eg: SELECT * FROM customers WHERE userid<100 or age >19;
    IN操作符 相当于多个or连在一起,包含其中的一个即可
    一般格式: SELECT 列 FROM 表名 WHERE 列 IN(列值,列值);
    eg: SELECT name FROM customers WHERE userid IN(10011,10013);
    NOT操作符 否定它之后所跟的任何条件(可以和其他的进行配合)
    eg: SELECT name FROM customers WHERE userid NOT IN(10011,10013);

    7.通配符查询(过滤)

    符号 说明
    %(百分号) %表示任何字符出现任意次数
    % SELECT name FROM students WHERE name like “李%”
    _(下划线) 下划线只匹配任意的单个字符
    _ SELECT name FROM customers WHERE name LIKE "李_";

    通配符搜索的处理一般要比前面讨论的其他搜索所花时间更长,所以一般不是很推荐使用通配符

    8.正则表达式

    正则表达式的匹配规则如下:

    正则表达式的匹配
    python中使用正则表达式(导入python下的re模块)
    1. match函数处理
      match 方法用于查找字符串的头部(也可以指定起始位置),它是一次匹配,只要找到了一个匹配的结果就返回,而不是查找所有匹配的结果。它的一般使用形式如下:
      当匹配成功时,返回一个 Match 对象,如果没有匹配上,则返回 None。
    import re
    使用match方法进行匹配操作
    result = re.match(正则表达式,要匹配的字符串)
    如果上一步匹配到数据的话,可以使用group方法来提取数据
    result.group()  提取match函数得到的值
    

    2..search函数的处理
    earch 方法用于查找字符串的任何位置,它也是一次匹配,只要找到了一个匹配的结果就返回,而不是查找所有匹配的结果,它的一般使用形式如下:
    当匹配成功时,返回一个 Match 对象,如果没有匹配上,则返回 None。

    3..findall函数的处理
    上面的 match 和 search 方法都是一次匹配,只要找到了一个匹配的结果就返回。然而,在大多数时候,我们需要搜索整个字符串,获得所有匹配的结果。
    findall 方法的使用形式如下:
    findall 以列表形式返回全部能匹配的子串,如果没有匹配,则返回一个空列表。
    4.sub函数的处理
    sub方法用于替换
    ret = re.sub(r"\d+", '998', "python = 997") ,要替换的内容,替换为,被替换的内容
    5.split函数的处理
    根据匹配进行切割字符串,并返回一个列表
    ret = re.split(',','你是一头猪吗?Are you a pig,please tell me.'); 用来切割的字符,要被切割的语句
    结果:["你是一头猪吗?Are you a pig:","please tell me."]
    6.finditer函数的处理
    finditer方法的行为跟 findall 的行为类似,也是搜索整个字符串,获得所有匹配的结果。但它返回一个顺序访问每一个匹配结果(Match 对象)的迭代

    贪婪和非贪婪

    Python里数量词默认是贪婪的(在少数语言里也可能是默认非贪婪),总是尝试匹配尽可能多的字符;
    非贪婪则相反,总是尝试匹配尽可能少的字符。
    *? 重复任意次,但尽可能少重复
    +? 重复1次或更多次,但尽可能少重复
    ?? 重复0次或1次,但尽可能少重复

    9.mysql的正则匹配

    select * from studentinfo where student_name regexp '^牛';
    SELECT name,email FROM studentinfo WHERE email REGEXP '.'; python中匹配一些特殊的字符的时候,需要用到转义字符“\”,将对应的符号转换成原来的意思。

    10.排序和限制查询

    1)单列排序(并指定方向)
    升序排列:

    SELECT age,name FROM customers ORDER BY age ASC;

    降序排列:

    SELECT age,name FROM customers ORDER BY age DESC;

    2)多列排序(并指定方向)

    SELECT name,adress,age FROM customers ORDER BY age DESC,name ASC;
    SELECT * FROM studentinfo WHERE gender=1 ORDER BY age; 查询出性别为1的并按照年龄升序排列
    SELECT * FROM studentinfo WHERE gender=0 ORDER BY age DESC; 查询出性别为1的并按照年龄j降序排列

    限制查询(可以指定开始的位置和显示的条数)
    指定返回的行数

    SELECT name FROM customers LIMIT 5;

    指定从第几行起,返回多少行

    SELECT name FROM badboy LIMIT 5,5; 指定开始位置是5(不包括5),返回5行 ``````无头有尾````
    SELECT name FROM customers LIMIT 0,1; 注意: 行0 检索出来的第一行为行0而不是行1。

    分页:
    已知:每页显示m条数据,当前显示第n页求第n页的数据
    SELECT * FROM sudents WHERE is_delete=0 LIMIT (n-1)*m,m

    使用ORDER BY和LIMIT的组合

    SELECT name,age FROM customers ORDER BY age DESC LIMIT 1; 取最大值
    SELECT name,age FROM customers ORDER BY age LIMIT 1; => SELECT name,age FROM customers ORDER BY age ASC LIMIT 1; 取最小值

    LIMIT 和其他的语句进行配合使用的时候,要放在语句的末尾,作为最后的限制。

    11. 聚合函数(汇总函数)

    AVG()函数

    AVG()通过对表中行数计数并计算特定列值之和,求得该列的平均值。 AVG()可用来返回所有列的平均值,也可以用来返回特定列或行的平均值。

    SELECT AVG(age) as avg_age FROM customers;
    SELECT AVG(age) as avg_age FROM customers WHERE adress LIKE '北%';

    COUNT()函数

    COUNT()函数进行计数。可利用COUNT()确定表中行的数目或符合特定条件的行的数目。
    COUNT()函数有两种使用方式。 使用COUNT(*)对表中行的数目进行计数, 不管表列中包含的是空值( NULL)还是非空值。

    SELECT COUNT(*) FROM customers;

    使用COUNT(column)对特定列中具有值的行进行计数,忽略 NULL值。 SELECT COUNT(name) FROM customers;

    MAX()函数

    MAX()返回指定列中的最大值。 MAX()要求指定列名,如下所示
    SELECT MAX(age) FROM customers;

    MIN()函数

    MIN()的功能正好与MAX()功能相反,它返回指定列的最小值.如下所示
    SELECT MIN(age) FROM customers;

    SUM()函数

    SUM()用来返回指定列值的和(总计)。如下所示
    SELECT SUM(age) as sum_age from customers;

    聚集不同值

    下面的例子使用AVG()函数返回同学的平均价格。 它与上面的SELECT语句相同,但使用了DISTINCT参数,因此平均值只考虑各个不同的年龄:
    SELECT AVG(DISTINCT age) from customers;

    12.mysql的分组查询

    group by + 集合函数

    SELECT COUNT(*) AS totalnum,age from customers group by age; AS 是给前面的集合函数返回的时候进行了重新的命名

    group by + group_concat()
    • group_concat(字段名)可以作为一个输出字段来使用,
    • 表示分组之后,根据分组结果,使用group_concat()来放置每一组的某字段的值的集合

    SELECT gender,group_concat(student_name) FROM studentinfo GROUP BY gender;

    group_concat()

    group by + with rollup

    with rollup的作用是:在最后新增一行,来记录当前列里所有记录的总和

    SELECT gender,count(*) FROM studentinfo GROUP BY gender with rollup;

    HAVING

    HAVING非常类似于WHERE。事实上,目前为止所学过的所有类型的WHERE子句都可以用HAVING来替代。唯一的差别是WHERE过滤行,而HAVING过滤分组。

    • having 条件表达式:用来分组查询后指定一些条件来输出查询结果
    • having作用和where类似,但having只能用于group by

    SELECT COUNT(),age,adress FROM customers GROUP BY age,adress HAVING COUNT() >= 2;

    SELECT COUNT(*),age,adress FROM customers GROUP BY age,adress HAVING age >= 2;

    SELECT COUNT(*),age,adress FROM customers GROUP BY age,adress HAVING age >= 2 and adress LIKE '%搜索关键字%';

    HAVING和WHERE的差别 这里有另一种理解方法,WHERE在数据分组前进行过滤,HAVING在数据分组后进行过滤。这是一个重要的区别, WHERE排除的行不包括在分组中。这可能会改变计算值,从而影响HAVING子句中基于这些值过滤掉的分组

    分组和排序

    SELECT COUNT(*),age,phonenum FROM studentinfo WHERE gender=1 GROUP BY age,phonenum HAVING phonenum is null ORDER BY age DESC; ;

    分组和排序、限定查询

    SELECT count(*),age,phonenum FROM studentinfo WHERE gender=1 GROUP BY age,phonenum HAVING phonenum is null ORDER BY age ASC LIMIT 2;

    SELECT count(*),age,phonenum FROM studentinfo WHERE gender=1 GROUP BY age,phonenum HAVING phonenum is null ORDER BY age ASC LIMIT 2,2;

    相关文章

      网友评论

          本文标题:MySQL(Structured Query Language)

          本文链接:https://www.haomeiwen.com/subject/kystvftx.html