zoukankan      html  css  js  c++  java
  • MySQL数据库基本指令(全)


    数据库基本类型

    CHAR 固定长度字符串 char(10) 存两位 占10位 查询有优势
    VARCHAR 可变长度字符串 varchar(10) 存两位 占两位 存储有优势

    枚举类型 只能取一个
    set类型 能取多个

    二进制类型 常用BLOB

    一、避免创建数据库及表出现中文乱码和查看编码方法

    #vim /etc/mysql/my.cnf 。(5.5以后系统)如下修改:
    [client]
    default-character-set=utf8
    [mysqld]
    default-storage-engine=INNODB
    character-set-server=utf8
    collation-server=utf8_general_ci

    1、创建数据库的时候:
    CREATE DATABASE `test`
    CHARACTER SET 'utf8'
    COLLATE 'utf8_general_ci';

    2、建表的时候 CREATE TABLE `database_user` (
    `ID` varchar(40) NOT NULL default '',
    `UserID` varchar(40) NOT NULL default '',
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

    代码练习数据:

    create table `t_student` (
    `id` double ,
    `stuName` varchar (60),
    `age` double ,
    `sex` varchar (30),
    `gradeName` varchar (60)
    );
    insert into `t_student` (`id`, `stuName`, `age`, `sex`, `gradeName`) values('1','张三','23','男','一年级');
    insert into `t_student` (`id`, `stuName`, `age`, `sex`, `gradeName`) values('2','张三丰','25','男','二年级');
    insert into `t_student` (`id`, `stuName`, `age`, `sex`, `gradeName`) values('3','李四','23','男','一年级');
    insert into `t_student` (`id`, `stuName`, `age`, `sex`, `gradeName`) values('4','王五','22','男','三年级');
    insert into `t_student` (`id`, `stuName`, `age`, `sex`, `gradeName`) values('5','珍妮','21','女','一年级');
    insert into `t_student` (`id`, `stuName`, `age`, `sex`, `gradeName`) values('6','李娜','26','女','二年级');
    insert into `t_student` (`id`, `stuName`, `age`, `sex`, `gradeName`) values('7','王峰','20','男','三年级');
    insert into `t_student` (`id`, `stuName`, `age`, `sex`, `gradeName`) values('8','梦娜','21','女','二年级');
    insert into `t_student` (`id`, `stuName`, `age`, `sex`, `gradeName`) values('9','小黑','22','男','一年级');
    insert into `t_student` (`id`, `stuName`, `age`, `sex`, `gradeName`) values('10','追风','25','男','二年级');
    insert into `t_student` (`id`, `stuName`, `age`, `sex`, `gradeName`) values('11','小小张三','21',NULL,'二年级');
    insert into `t_student` (`id`, `stuName`, `age`, `sex`, `gradeName`) values('12','小张三','23','男','二年级');
    insert into `t_student` (`id`, `stuName`, `age`, `sex`, `gradeName`) values('13','张三锋小','24',NULL,'二年级');

    查询

    单表查询
     in 语句
      SELECT * FROM t_student WHERE age in (21,23);

     not in 语句
      SELECT * FROM t_student WHERE age not in (21,23);

      between and
      SELECT * FROM t_student WHERE age BETWEEN 21 and 24;

      not between and
      SELECT * FROM t_student WHERE age not BETWEEN 21 and 24;

      like 模糊查询
      % 代表任意字符
      _ 代表单个字符
      SELECT * FROM t_student WHERE stuName LIKE '张%';
      SELECT * FROM t_student WHERE stuName LIKE '张_';
      SELECT * FROM t_student WHERE stuName LIKE '张__';(两个下划线代表两个字符)

      空值查询
      SELECT * FROM t_student WHERE sex IS NULL;
      SELECT * FROM t_student WHERE sex IS NOT NULL;

      带And的条件查询
      SELECT * FROM t_student WHERE gradeName='一年级' AND age=23;

      带or的条件查询
      SELECT * FROM t_student WHERE age=21 or age=23;

      distinct 去重复查询
      SELECT DISTINCT gradeName FROM t_student;

      对查询结果排序
      SELECT * from t_student ORDER BY age DESC;(降序)
      SELECT * from t_student ORDER BY age ASC;(升序)

      group by 分组查询
      group by 属性 [HAVING 条件表达式][WITH ROLLUP]
        1.单独使用没有意义
        SELECT * from t_student GROUP BY gradeName;
        1 张三 23 男 一年级
        4 王五 22 男 三年级
        2 张三丰 25 男 二年级

        2.与 GROUP_CONCAT()函数一起使用
        GROUP_CONCAT()会计算哪些行属于同一组,将属于同一组的列显示出来。
        要返回哪些列,由函数参数(就是字段名)决定。
        分组必须有个标准,就是根据group by指定的列进行分组。

        SELECT gradeName,GROUP_CONCAT(stuName) from t_student GROUP BY gradeName;
        1 一年级 张三,小黑,李四,珍妮
        7 三年级 王峰,王五
        6 二年级 李娜,梦娜,张三丰,追风,小小张三,小张三,张三锋小

       3.与聚合函数一起使用
        1 一年级 4
        4 三年级 2
        2 二年级 7

        4.与HAVING一起使用(限制输出的结果)
      SELECT
      id,
      gradeName,
      COUNT(stuName)
      FROM
      t_student
      GROUP BY
      gradeName
      HAVING
      COUNT(stuName) > 3;

      1 一年级 4
      2 二年级 7

      5.与 with rollup 一起使用(最后加入一个总和行)
      SELECT gradeName,COUNT(stuName) FROM t_student GROUP BY gradeName with ROLLUP

      1 一年级 4
      7 三年级 2
      6 二年级 7
      6 13

      SELECT id,gradeName,GROUP_CONCAT(stuName) FROM t_student GROUP BY gradeName with ROLLUP

      1 一年级 张三,小黑,李四,珍妮
      7 三年级 王峰,王五
      6 二年级 李娜,梦娜,张三丰,追风,小小张三,小张三,张三锋小
      6 张三,小黑,李四,珍妮,王峰,王五,李娜,梦娜,张三丰,追风,小小张三,小张三,张三锋小

      6. LIMIT 分页查询
      select 字段1,字段2 from 表名 limit 初始位置,每页大小;
      SELECT * from t_student LIMIT 0,5;
      SELECT * from t_student LIMIT 5,5;
      SELECT * from t_student LIMIT 10,5;
      1 张三 23 男 一年级
      2 张三丰 25 男 二年级
      3 李四 23 男 一年级
      4 王五 22 男 三年级
      5 珍妮 21 女 一年级

      6 李娜 26 女 二年级
      7 王峰 20 男 三年级
      8 梦娜 21 女 二年级
      9 小黑 22 男 一年级
      10 追风 25 男 二年级

      11 小小张三 21 二年级
      12 小张三 23 男 二年级
      13 张三锋小 24 二年级

      使用聚合函数查询

      create table `t_grade` (
      `id` int ,
      `stuName` varchar (60),
      `course` varchar (60),
      `score` int
      )ENGINE=InnoDB DEFAULT CHARSET=utf8;
    insert into `t_grade` (`id`, `stuName`, `course`, `score`) values('1','张三','语文','91');
    insert into `t_grade` (`id`, `stuName`, `course`, `score`) values('2','张三','数学','90');
    insert into `t_grade` (`id`, `stuName`, `course`, `score`) values('3','张三','英语','87');
    insert into `t_grade` (`id`, `stuName`, `course`, `score`) values('4','李四','语文','79');
    insert into `t_grade` (`id`, `stuName`, `course`, `score`) values('5','李四','数学','95');
    insert into `t_grade` (`id`, `stuName`, `course`, `score`) values('6','李四','英语','80');
    insert into `t_grade` (`id`, `stuName`, `course`, `score`) values('7','王五','语文','77');
    insert into `t_grade` (`id`, `stuName`, `course`, `score`) values('8','王五','数学','81');
    insert into `t_grade` (`id`, `stuName`, `course`, `score`) values('9','王五','英语','89');

    1、count()函数
    1)统计记录的条数
    SELECT COUNT(*) AS total FROM t_grade;
    2)与group by 函数一起使用。
    SELECT stuName,COUNT(*) FROM t_grade GROUP BY stuName;
    张三 3
    李四 3
    王五 3

    2、sum() 函数
    1)求和
    SELECT stuName,SUM(score) FROM t_grade WHERE stuName="张三";
    2)与group by 函数一起使用
    SELECT stuName,SUM(score) FROM t_grade GROUP BY stuName;
    张三 268
    李四 254
    王五 247

    3、avg() 函数
    1)求平均值
    SELECT stuName,AVG(score) FROM t_grade WHERE stuName="张三";
    2)与group by 函数一起使用
    SELECT stuName,AVG(score) FROM t_grade GROUP BY stuName;

    4、max()/min() 函数
    1)求最大值
    SELECT stuName,course,MAX(score) FROM t_grade WHERE stuName="张三";
    2)与group by 函数一起使用,此处不能加course 因为有stuName
    SELECT stuName,MAX(score) FROM t_grade GROUP BY stuName;

    连接查询:将两个或两个以上的表,按照某个条件连接起来,从中选择需要的数据。
    笛卡尔乘积
    SELECT * FROM t_book,t_booktype;

    1、内连接查询
    内连接查询是一种最常用的连接查询。内连接查询可以查询两个或两个以上的表。
    SELECT * from t_book,t_booktype WHERE t_book.bookTypeId=t_booktype.id;
    别名:
    SELECT tb.bookName,tb.author,tby.bookTypeName from t_book tb,t_booktype tby WHERE tb.bookTypeId=tby.id;
    2、外链接查询
    外链接可以查出某一张表的所有信息
    SELECT 属性名列表 from 表名1 left/right join 表名2 on 表名1.属性名1=表名2.属性名2
    2.1左连接查询
    可以查询出“表名1”的所有记录,而“表名2”中,只能查询出匹配的记录。不匹配的用null
    SELECT * FROM t_book LEFT JOIN t_booktype ON t_book.bookTypeId=t_booktype.id;
    别名:
    SELECT tb.bookName,tb.author,tby.bookTypeName FROM t_book tb LEFT JOIN t_booktype tby ON tb.bookTypeId=tby.id;
    2.2右连接查询
    可以查询出“表名2”的所有记录,而“表名1”中,只能查询出匹配的记录。
    SELECT * FROM t_book right JOIN t_booktype ON t_book.bookTypeId=t_booktype.id;
    SELECT tb.bookName,tb.author,tby.bookTypeName FROM t_book tb right JOIN t_booktype tby ON tb.bookTypeId=tby.id;
    3、多条件连接查询
    SELECT tb.bookName,tb.author,tby.bookTypeName from t_book tb,t_booktype tby WHERE tb.bookTypeId=tby.id and tb.price>70;

    子查询

    create table `t_pricelevel` (
    `id` int ,
    `priceLevel` int ,
    `price` float ,
    `description` varchar (300)
    );
    insert into `t_pricelevel` (`id`, `priceLevel`, `price`, `description`) values('1','1','80.00','价格贵的书');
    insert into `t_pricelevel` (`id`, `priceLevel`, `price`, `description`) values('2','2','60.00','价格适中的书');
    insert into `t_pricelevel` (`id`, `priceLevel`, `price`, `description`) values('3','3','40.00','价格便宜的书');

    1、带in关键字的查询
    一个查询语句的条件可能落在另一个SELECT 语句的查询结果中。
    select * from t_book where bookTypeId in (select id from t_booktype);
    select * from t_book where bookTypeId not in (select id from t_booktype);

    2、带比较运算符的查询(单一)
    子查询可以使用比较运算符,查询出来的结果要是能够进行比较判断的,不能是集合
    select * from t_book where price>=(select price from t_pricelevel where priceLevel=1);

    3、带Exists关键字的查询
    假如子查询查询到记录,则执行外层查询,否则,不执行外层查询。
    select * from t_book where exists(select * from t_booktype);
    select * from t_book where not exists(select * from t_booktype);

    4、带ANY关键字的子查询(集合)
    ANY关键字表示满足其中任一条件
    select * from t_book where price >=ANY(select price from t_pricelevel);

    5、带ALL关键字的查询
    ALL关键字表示满足所有条件
    select * from t_book where price >=ALL(select price from t_pricelevel);

    合并查询
    1、UNION
    数据库系统会将所有的查询结果合并到一起,然后去除掉相同的记录。
    select id from t_book union select id from t_booktype;
    2、UNION ALL
    数据库系统会将所有的查询结果合并到一起,不会除掉相同的记录。
    select id from t_book union all select id from t_booktyp;

    为表和字段取别名:
    1、为表取别名
    格式:表名 表的别名
    select * from t_book tb where tb.id=1;
    2、为字段取别名
    格式:属性名 [AS] 别名
    select tb.bookName bName from t_book tb where tb.id=1;
    select tb.bookName as bName from t_book tb where tb.id=1;

    插入、更新、删除数据

    1、插入数据
    给表的所有字段插入数据
    格式:INSERT INTO 表名 VALUES (V1,V2,V3,...,Vn);
    INSERT into t_book values (null,'数据库',23,风诺依曼,1);
    INSERT into t_book (id,bookName,price,author,bookTypeId) values (null,'数据库',23,风诺依曼,1);

    给表指定字段插入数据
    格式:INSERT INTO 表名(属性1,属性2,...,属性n) VALUES (V1,V2,...,Vn);
    INSERT into t_book (bookName,author)values ('数据库',风诺依曼);

    同时插入多条记录
    INSERT into t_book (id,bookName,price,author,bookTypeId)
    values (null,'数据库',23,风诺依曼,1),
        (null,'数据库2',23,风诺依曼,1)
        (null,'数据库3',23,风诺依曼,1);

    在SQL中如何向指定的某一行的某一列插入值:insert 不支持 where 用 update

    更新数据
    update t_book set bookName='JAVA编程思想',price=120 where id =1;
    update t_book set bookName='数据原来' where bookName like '%我爱我家%';

    删除数据
    delete from t_book where id = 5;

    索引

    索引的引入
    索引定义:索引由数据库表中一列或者多列组合而成,其作用是
    提高对表中数据的查询速度;类似于图书的目录,方便快速定位,寻
    找指定的内容。

    索引的优缺点
    优点:提高查询数据速度
    缺点:创建和维护索引的时间增加

    // 2016/1/6 复习至此处
    索引分类
    1.普通索引
    可以创建在任何数据类型中
    2.唯一性索引
    使用UNIQUE参数可以设置,在创建唯一性索引时,限制该索引的值必须
    是唯一的,主键默认是UNIQUE索引
    3.全文索引
    使用FULLTEXT参数设置,只能创建在CHAR,VARCHAR,TEXT类型
    的字段上。主要作用就是提高查询较大字符串类型的速度,Mysql
    默认引擎不支持全文索引
    4.单列索引
    在表中可以给单个字段创建索引
    5.多列索引
    表在多个字段上创建的索引
    6.空间索引
    使用SPATIAL参数可以设置空间索引,空间索引只能建立在空间
    数据类型上,这样可以提高系统获取空间数据的效率。MYSQL默认引擎不支持

    创建索引

    1.创建表的时候创建索引
    CREATE TABLE 表名(
    属性名数据类型[完整性约束条件],
    属性名数据类型[完整性约束条件],
    ....
    属性名数据类型
    [UNIQUE | FULLTEXT | SPATIAL ] INDEX| KEY
    [别名] (属性名1 [(长度)] [ASC | DESC])
    );
    CREATE TABLE t_user1 (
    id INT (11),
    userName VARCHAR (20),
    PASSWORD VARCHAR (20),
    INDEX (userName)
    );
    唯一性索引
    CREATE TABLE t_user2 (
    id INT (11),
    userName VARCHAR (20),
    PASSWORD VARCHAR (20),
    UNIQUE INDEX (userName)
    );
    取别名
    CREATE TABLE t_user2 (
    id INT,
    userName VARCHAR (20),
    PASSWORD VARCHAR (20),
    INDEX index_userName (userName)
    );
    多列索引
    CREATE TABLE t_user3 (
    id INT,
    userName VARCHAR (20),
    PASSWORD VARCHAR (20),
    INDEX index_userName_password (userName, PASSWORD)
    );


    2.在已存在的表上创建索引
    在t_user3上的userName创建索引
    create index index_userName on t_user3(userName); // 要有索引名
    在t_user3上的userName创建唯一索引
    create unique index index_userName on t_user3(userName);
    在t_user3创建多列索引
    create index index_userName_password on t_user3(userName,password);

    3.用 ALTER TABLE 语句创建索引
    alter table t_user3 add index index_userName(userName);
    alter table t_user3 add unique index index_userName(userName);
    alter table t_user3 add index index_userName_password(userName,password);

    删除索引
    drop index index_userName on t_user3;

    视图
    1,视图是一种虚拟的表,是从数据库中一个或者多个表中导出来的表。
    2,数据库中只存放了视图的定义,而并没有存放视图中的数据,这些数据存放在原来的表中。
    3,使用视图查询数据时,数据库系统会从原来的表中取出对应的数据。

    视图的作用
    1,使操作简便化;
    2,增加数据的安全性;
    3,提高表的逻辑独立性;

    1.创建视图
    CREATE [ ALGORITHM ={ UNDEFIEND | MERGE | TEMPTABLE }]
    VIEW 视图名[ ( 属性清单) ]
    AS SELECT 语句
    [ WITH [ CASCADED | LOCAL ] CHECK OPTION ];

    2.单表创建视图
    CREATE VIEW v1 AS SELECT * from t_book;

    CREATE VIEW v2 AS SELECT bookName,price from t_book;
    SELECT * FROM v1;//只能查视图中的数据,其他的查不到,保证了安全性

    CREATE VIEW v2(b,p) AS SELECT bookName,price from t_book; // 换掉视图栏位上的名字

    3.多表创建视图
    create view v4 as select tb.bookName,tby.bookTypeName from t_book tb ,t_booktype tby where tb.bookTypeId=tby.id;

    4.查看视图
    desc v2; // 查看视图的基本信息
    show TABLE STATUS like 'v2'; // 查看视图基本信息,与上面的不同
    show TABLE STATUS like 't_book';

    show CREATE VIEW v2; // 查看视图详细信息

    5.修改视图
    create or replace view 语句修改视图
    CREATE OR REPLACE [ ALGORITHM ={ UNDEFINED | MERGE | TEMPTABLE }]
    VIEW 视图名[( 属性清单)]
    AS SELECT 语句
    [ WITH [ CASCADED | LOCAL ] CHECK OPTION ];

    CREATE
    OR REPLACE VIEW v1 (bookName, price) AS SELECT
    bookName,
    price
    FROM
    t_book;

    ALTER 语句修改视图
    ALTER [ ALGORITHM ={ UNDEFINED | MERGE | TEMPTABLE }]
    VIEW 视图名[( 属性清单)]
    AS SELECT 语句
    [ WITH [ CASCADED | LOCAL ] CHECK OPTION ];

    ALTER VIEW v1 as SELECT * FROM t_book;

    6.更新视图
    更新视图是指通过视图来插入(INSERT)、更新(UPDATE)和删除(DELETE)表中的数据。因为视图是一个虚
    拟的表,其中没有数据。通过视图更新时,都是转换基本表来更新。更新视图时,只能更新权限范围内的数据。
    超出了范围,就不能更新。
    插入数据
    insert into v1 values(null,'java good',120,'fei',1);
    更新数据
    update v1 set bookName='java very good',price=200 where id=5;
    删除数据
    delete from v1 where id=5;

    7.删除视图
    删除视图是指删除数据库中已存在的视图。删除视图时,只能删除视图的定义,不会删除数据;
    DROP VIEW [ IF EXISTS ] 视图名列表[ RESTRICT | CASCADE ]
    drop view if exists v2;

    触发器
    触发器(TRIGGER)是由事件来触发某个操作。这些事件包括INSERT 语句、UPDATE 语句和DELETE 语句。
    当数据库系统执行这些事件时,就会激活触发器执行相应的操作。
    例子:在A表插入数据,触发B表插入数据

    1.创建与使用触发器

    创建只有一个执行语句的触发器
    CREATE TRIGGER trig_book AFTER INSERT
    ON t_book FOR EACH ROW

    CREATE TRIGGER trig_book AFTER INSERT
    ON t_book FOR EACH ROW
    UPDATE t_booktype SET bookNum=bookNum+1 WHERE new.bookTypeId=t_booktype.id;
    new 为过渡变量,代表插入后的新表

    创建有多个执行语句的触发器
    CREATE TRIGGER 触发器名BEFORE | AFTER 触发事件
    ON 表名FOR EACH ROW
    BEGIN
    执行语句列表
    END

    CREATE TRIGGER trig_book2 AFTER DELETE
    on t_book FOR EACH ROW
    BEGIN
    UPDATE t_booktype SET bookNum=bookNum-1 WHERE new.bookTypeId=t_booktype.id;
    INSERT INTO t_log VALUES (null,'在t_book表中删除了一条数据');
    DELETE FROM t_test WHERE old.bookTypeId=t_test.id;
    END

    // 下述语句在数据库中执行错误,且没有修改正确
    delimiter |
    CREATE TRIGGER trig_book2 AFTER DELETE
    on t_book FOR EACH ROW
    BEGIN
    UPDATE t_booktype SET bookNum=bookNum-1 WHERE old.bookTypeId=t_booktype.id;
    INSERT INTO t_log VALUES (null,NOW(),'在t_book表中删除了一条数据');
    DELETE FROM t_test WHERE old.bookTypeId=t_test.id;
    END
    |
    delimiter;

    3.查看触发器
    SHOW TRIGGERS 语句查看触发器信息 ==>所有触发器

    4.删除触发器
    DROP TRIGGER 触发器名;

  • 相关阅读:
    Sql server 备份还原后出现“受限制用户”问题
    jQuery的deferred对象详解
    SQLServer 自增主键创建, 指定自增主键列值插入数据,插入主键
    无法添加来自此网站的应用 扩展程序
    C#中dynamic的正确用法
    C#编程总结(十四)dynamic
    基于params,ref,out的参数问题详解
    SQLServer 数据库查看死锁、堵塞的SQL语句
    如何对web.config进行加密和解密
    自定义HttpModule的一些经验--配置篇
  • 原文地址:https://www.cnblogs.com/tf-Y/p/5126450.html
Copyright © 2011-2022 走看看