zoukankan      html  css  js  c++  java
  • Mysql 常用语句

     

    使用MySQL数据库
    登录到MySQL
    MySQL服务已经运行时,我们可以通过MySQL自带的客户端工具登录到MySQL数据库中,首先打开命令提示符,输入以下格式的命名:
    mysql -h 主机名 -u 用户名 -p
        -h : 该命令用于指定客户端所要登录的MySQL主机名, 登录当前机器该参数可以省略;
        -u : 所要登录的用户名;
        -p : 告诉服务器将会使用一个密码来登录, 如果所要登录的用户名密码为空, 可以忽略此选项。
    以登录刚刚安装在本机的MySQL数据库为例,在命令行下输入mysql -uroot -p 按回车确认, 如果安装正确且MySQL正在运行,就会提示输入密码
    :如要在命令行输入密码-p和密码之间不能有空格

    一、数据库操作
    1、创建数据库:

    >CREATE DATABASE db_name;    //db_name为数据库名
    >CREATE DATABASE IF NOT EXISTS db_name default character set utf8 COLLATE utf8_general_ci;    //条件创建数据库

    2、删除数据库:

    >DROP DATABASE db_name;
    >DROP DATABASE IF EXISTS db_name;

    3、查看数据库:

    >SHOW DATABASES;

    4、选择数据库:

    >USE db_name;

    5、修改数据库

    >ALTER DATABASE my_db CHARACTER SET latin1;    //修改数据库字符编码

     

    二、的操作:
    1、创建表:

    (1).使用SQL语句创建

    >CREATE TABLE IF NOT EXISTS tb_name(
        fid INT(11) NOT NULL DEFAULT '0',   //fid INT类型显示11位,非空,默认值为0
        ......................................
        PRIMARY KEY(id)              //主键
      )ENGINE=InnoDB DEFAULT CHARSET=utf8    //设置表的存储引擎和默认编码(防止数据库中文乱码),一般常用InnoDB和MyISAM;InnoDB可靠,支持事务;MyISAM高效不支持全文检索.

    (2).根据现有的表来创建并插入指定条件的数据

    >CREATE TABLE tb_name2 SELECT * FROM tb_name;

    或者部分复制:

    >CREATE TABLE tb_name2 SELECT id,name FROM tb_name;

    (3).创建临时表:

    >CREATE TEMPORARY TABLE tb_name(这里和创建普通表一样);

    2查看表

    (1).查看数据库中可用的表

    >SHOW TABLES;

    (2).查看表结构:

    >DESC tb_name;
    也可以使用:
    >SHOW COLUMNS in/from tb_name;

    3、删除表:

    >DROP [ TEMPORARY ] TABLE [ IF EXISTS ] tb_name[ ,tb_name2.......];

    实例:

    >DROP TABLE IF EXISTS tb_name;    //存在则删除,不存在不操作

    4、更改表:

    >ALTER TABLE tb_name ADD[CHANGE,RENAME,DROP] [after 插入位置]...要更改的内容...

    实例:

    >ALTER TABLE tb_name ADD COLUMN address varchar(80) NOT NULL AFTER `column_name`;
    >ALTER TABLE tb_name DROP COLUMN address;
    >ALTER TABLE tb_name CHANGE scoer score SMALLINT(4) NOT NULL;    //更改列名称或列字
    >ALTER TABLE name_old RENAME name_new;

    段类型(:这里字段类型与表字段类型不一致会修改表字段类型)
    5、增加删除主键

    >ALTER TABLE tb_name ADD primary key (id);
    >ALTER TABLE tb_name DROP primary key;

    三、数据增删查改

    为了便于理解以下操作的含义,模拟学校学生信息管理系统,首先创建测试表和插入测试数据

    CREATE TABLE `student` (
      `fid` int(5) unsigned zerofill NOT NULL DEFAULT '00000',
      `fname` varchar(64) NOT NULL,
      `age` int(11) NOT NULL,
      `address` varchar(128) NOT NULL,
      `contace` varchar(12) NOT NULL,
      PRIMARY KEY (`fid`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8
    insert  into `student`(`fid`,`fname`,`age`,`address`,`contace`) values (00001,'张三',11,'湖南株洲','135698332'),(00002,'李四',12,'浙江杭州','123978986'),(00003,'王五',11,'湖南长沙','469878966'),(00004,'朱六',13,'湖北武汉','987964663'),(00005,'张三',11,'北京','124534534'),(00006,'欧阳克',13,'新疆','534534534');
    CREATE TABLE `score` (
      `fid` int(5) unsigned zerofill NOT NULL,
      `fchinese` int(11) unsigned NOT NULL,
      `fmatch` int(11) unsigned NOT NULL,
      `english` int(11) unsigned NOT NULL,
      `history` int(11) unsigned NOT NULL,
      PRIMARY KEY (`fid`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8
    insert  into `score`(`fid`,`fchinese`,`fmatch`,`english`,`history`) values (00001,87,97,65,77),(00002,66,87,88,90),(00003,87,46,99,88),(00004,77,94,84,88),(00005,89,97,96,99);
    CREATE TABLE `infoext` (
      `fid` int(5) unsigned zerofill NOT NULL,
      `ffname` varchar(32) NOT NULL,
      `fmname` varchar(32) NOT NULL,
      `fhobby` varchar(64) NOT NULL,
      PRIMARY KEY (`fid`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8
    insert  into `infoext`(`fid`,`ffname`,`fmname`,`fhobby`) values (00001,'史蒂夫','斯密斯','吃饭'),(00002,'萧锋','阿朱','睡觉'),(00003,'杨过','小龙女','看书'),(00004,'韦小宝','双双','溜达'),(00005,'郭靖','黄蓉','练舞'),(00006,'欧阳锋','不祥','练武');


    1、插入数据

    >INSERT INTO tb_name(id,name,score)VALUES(NULL,'张三',140),(NULL,'张四',178),(NULL,'张五',134);    //插入多条数据直接在后边加上逗号,主键id是自增的列,可以不用写。
    >INSERT INTO tb_name(name,score) SELECT name,score FROM tb_name2;

    2、更新数据

    >UPDATE tb_name SET score=89,age=11 WHERE id=2;    //修改多列使用”,”隔开
    >UPDATE tablename SET columnName=NewValue [ WHERE condition ]

    3、删除数据

    >DELETE FROM tb_name WHERE id=3;
    >DELETE FROM tb_name;        //不带条件,则删除整张表数据

     

    4查询与条件控制
    (1).WHERE 语句:

    where的作用:在对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,where条件中不能包含聚组函数。

    >SELECT * FROM tb_name WHERE id=3;

    (2).HAVING 语句:

    having的作用:是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having 条件过滤出特定的组,也可以使用多个分组标准进行分组。

    >SELECT * FROM tb_name GROUP BY age HAVING count(*)>2  //按年龄分组,并筛选出同一年龄人数大于2的组数据

    (3).相关条件控制符:
      =><<>IN(1,2,3......)BETWEEN a AND bNOTLIMIT
      AND OR
      Like()用法中      

          %:匹配任意个字符        _:匹配一个字符(可以是汉字)
      IS NULL 空值检测

    >SELECT * FROM student WHERE fid >= 3 AND fid <= 5;
    >SELECT * FROM student WHERE fid IN (2, 4, 5);
    >SELECT * FROM student WHERE fid BETWEEN 2 AND 4;
    >SELECT * FROM student WHERE fid = 3 OR fid = 4;
    >SELECT * FROM student WHERE fname LIKE '%三'    //查找fname内容含有三的数据

     

    5.功能函数

    (a).DISTINCT:数据去重,返回指定字段内容不重复的记录

    >SELECT DISTINCT `age` FROM student;             //返回学生年龄分布

    (b).LIMIT:指定返回前几条或者中间某几行数据

    >SELECT * FROM TABLE LIMIT [OFFSET,] ROWS | ROWS OFFSET OFFSET
    LIMIT可以用于强制SELECT返回指定的记录数。接受一个或两个数字参数,参数必须是一个整数常量。如果给定两个参数,第一个参数指定返回记录行的偏移量,第二个参数指定返回记录行的最大数目。
    初始记录行偏移量是0(而不是1):为了与PostgreSQL兼容,MySQL也支持句法:LIMIT #OFFSET #

    > SELECT * FROM student LIMIT 5,10;   //检索记录行6-15 ,注意:10为偏移量
    > SELECT * FROM student LIMIT 95,-1;  //检索记录行 96-last.
    //如果只给定一个参数,它表示返回最大的记录行数目:
    > SELECT * FROM student LIMIT 5;     //检索前 5 个记录行,也就是说,LIMIT n等价于 LIMIT 0,n。

    如果你想得到最后几条数据可以多加个 ORDER BY id DESC

    (c).as 别名

    >SELECT fname AS "名字" FROM student;
    >SELECT AVG(fchinese) AS "语文平均分" FROM score;

     

    6GROUP BY分组查询

    所谓的分组就是将指定符合条件的数据划分到一个组,最终得到一个分组汇总表
      (1).条件使用Having;
      (2).排序使用ORDER BY :
           ORDER BY DESC|ASC    =>按数据的降序/升序排列  

    >SELECT COUNT(*) FROM student GROUP BY `age` HAVING COUNT(*) > 2;
    >SELECT fname,COUNT(age) AS "人数" FROM student GROUP BY fname;

     

    7联合查询用于把来自两个或多个表的行结合起来

    (1).使用JOIN

    JOIN 子句基于这些表之间的共同字段,把来自两个或多个表的行结合起来。

    INNER JOIN

    在表中存在至少一个匹配时返回行。

    >SELECT student.fname,score.fchinese,score.english,score.fmatch FROM student INNER JOIN score ON student.fid = score.fid;
    
    以上SQL等价于:
    >SELECT a.fname,a.age,b.fchinese,b.english,b.fmatch FROM student a INNER JOIN score b WHERE a.fid = b.fid;
    >SELECT a.fname,a.age,b.fchinese,b.english,b.fmatch FROM student a,score b WHERE a.fid = b.fid;

    LEFT JOIN

    从左表(table1)返回所有的行,即使右表(table2)中没有匹配。如果右表中没有匹配,则结果为 NULL。

    >SELECT student.fname,score.fchinese,score.english,score.fmatch FROM student LEFT JOIN score ON student.fid = score.fid;

    RIGHT JOIN

    从右表(table2)返回所有的行,即使左表(table1)中没有匹配。如果左表中没有匹配,则结果为 NULL。

    >SELECT student.fname,score.fchinese,score.english,score.fmatch FROM student RIGHT JOIN score ON student.fid = score.fid;

    (2)、使用UNION

    UNION

    UNION用于合并两个或多个SELECT语句的结果集,并消去表中任何重复行。UNION内部的SELECT 语句必须拥有相同数量的列,列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同.

    >SELECT * FROM student UNION SELECT * FROM score;
    >SELECT * FROM student UNION SELECT * FROM infoext; //报ERROR,列数量不一致

    UNION ALL

    ALL随UNION 一起使用时(UNION ALL),不消除重复行

    >SELECT * FROM student UNION ALL SELECT * FROM score;

     

    8MySQL的一些函数

    (1)、字符串链接——CONCAT()

    >SELECT CONCAT(fname, "==>", address) FROM student;

    (2)、数学函数:AVGSUMMAXMINCOUNT;
    (3)、文本处理函数:TRIMLOCATEUPPERLOWERSUBSTRING
    (4)、运算符:+-*
    (5)、时间函数:DATE()CURTIME()DAY()YEAR()NOW().....

    >UPDATE shop SET `fupdatetime` = NOW();    //更新shop表fupdatetime字段时间

    (6)、空值处理

    为了处理这种情况,MySQL提供了三大运算符:

      IS NULL: 当列的值是NULL,此运算符返回true

      IS NOT NULL: 当列的值不为NULL, 运算符返回true

      <=>: 比较操作符(不同于=运算符),当比较的的两个值为NULL时返回true

    关于NULL的条件比较运算是比较特殊的.你不能使用= NULL!= NULL在列中查找NULL,MySQL,NULL值与任何其它值的比较(即使是NULL)永远返回false, NULL = NULL 返回false.

    MySQL中处理NULL使用IS NULLIS NOT NULL运算符。

    >SELECT * FROM student WHERE fname != NULL;         //返回NULL数据集
    >SELECT * FROM student WHERE fname IS NOT NULL;     //返回想要的数据


    9MySQL的正则表达式:
    Mysql支持REGEXP的正则表达式:
    >SELECT * FROM tb_name WHERE name REGEXP '^[A-D]'   //找出以A-D 为开头的name

    模式

    描述

    ^

    匹配输入字符串的开始位置。例如’^sw’可匹配swxxs或sw24dsf等

    $

    匹配输入字符串的结束位置。例如‘duan$’可匹配swduan或sssssduan等

    .

    匹配除 " " 之外的任何单个字符。例如’swd.an’可匹配swduan或swddan等

    [...]

    字符集合。匹配所包含的任意一个字符。例如, '[a-z]' 可以匹配字符a-z,[0-9]可匹配0-9。

    [^...]

    非字符集合。匹配除[]中之外的的任意字符。例如, '[^abc]' 可以匹配 "def" 等。

    p1|p2|p3

    匹配 p1 或 p2 或 p3。例如,'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 则匹配 "zood" 或 "food"。

    *

    匹配前面的子表达式零次或多次。例如,sw* 能匹配 "sw" 以及 "swsw"。* 等价于{0,}。

    +

    匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zozo",但不能匹配 "z"。+ 等价于 {1,}。

    {n}

    n 是一个非负整数。匹配确定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o。

    {n,m}

    m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。

    注意,^有两个用法,一个是非,一个是文本的开始,用[]中表示非,否则是文本的开始。

    使用的时候需要外面加一层[],例如[[:digit:]]

    说明

    [:alnum:]

    任意字母和数字(同[a-zA-Z0-9])

    [:alpha:]

    任意字母(同[a-zA-Z])

    [:blank:]

    空格和制表(同[\t])

    [:cntrl:]

    ASCII控制字符(ASCII0到31和127)

    [:digit:]

    任意数字(同[0-9])

    [:graph:]

    和[[:print:]]相同,但不包含空格

    [:lower:]

    任意小写字母(同[a-z])

    [:print:]

    任意可打印字符

    [:punct:]

    即不在[[:alnum:]]又不在[[:cntrl:]]中的字符

    [:space:]

    包括空格在内的任意空白字符(同[\f\n\r\t\v])

    [:upper:]

    任意大写字母(同[A-Z])

    [:xdigit:]

    任意16进制数字(同[a-fA-F0-9])

    >SELECT * FROM student Where fname REGEXP 'swduan[[:digit:]]';    //可匹配swduan0-9
  • 相关阅读:
    软件工程 团队开发(2)
    软件工程 团队开发(1)
    大道至简阅读笔记01
    小工具集合用户模板和用户场景
    人月神话阅读笔记03
    人月神话阅读笔记02
    本周java学习
    本周学习总结
    本周java 学习进度报告
    《构建之法》读后感
  • 原文地址:https://www.cnblogs.com/DswCnblog/p/6240771.html
Copyright © 2011-2022 走看看