zoukankan      html  css  js  c++  java
  • SQL入门单表操控&事务(使用mysql服务器)

    sql(Structured Query Language)

        结构化查询语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新、管理关系数据库系统。同时也是数据库脚本文件的扩展名。

     sql是弱类型的语言,插入的数据类型能转的自动转,转不了就会报错。

    sql分类:

        DDL:数据定义语言  (data definition language)

            create  drop    alter

        DCL:数据控制语言  (Data Control Language)

            grant   if

        DML:数据操纵语言  (data manipulation language)

            insert  update  delete

        DQL:数据查询语言  (data Query language)

            select

    cmd控制台下连接登录数据库:mysql -u用户 -p密码

    cmd控制台下开启和关闭mysql服务:net start mysql;  net stop mysql

    备份数据库的cmd命令:mysqldump -u root -p databaseName > c:/databaseName

    sql语句不区分大小写;

    sql语句以分号结束命令;

    sql对数据库进行操作:

    •     创建数据库:create database 数据库名称 character set 字符集 collate 字符集校对规则;

                                                            character set 字符集 collate字符集校对规则  可以省略,系统会使用默认设置。

    •     查看数据库服务器中的所有数据库:show databases;
    •     查看某个数据库的定义信息:show create database 数据库名称;
    •     查看数据库中与字符集相关参数:show variables like '%character%';
    •     修改数据库:alter database 数据库名称 character set 字符集 collate 校对规则;
    •     删除数据库:drop database 数据库名称;
    •     切换数据库: use 数据库名称;
    •     查看当前正在使用的数据库: select  database();

    sql对数据库表进行操作:

      创建表:

            语法:

                创建表:create table 表名称(

                    字段名称 字段类型(长度) 约束,

                    字段名称 字段类型。。。。。。。

                );

            约束:

                主键约束:primary key(主键约束默认就是唯一非空的)

                唯一约束:unique

                非空约束:not null

        自增:auto_increment

        默认值:defautl

            字段类型:

     

    char和varchar的区别:

      char代表是固定长度的字符或字符串。假设定义类型char(8),向这个字段存入字符串hello,那么数据库使用三个空格将其补全。

      varchar代表的是可变长度的字符串。假设定义类型varchar(8),向这个字段存入字符串hello,那么存入到数据库的就是hello。

    datetime和timestamp区别

      datetime就是既有日期又有时间的日期类型,如果没有向这个字段中存值,数据库使用null存入到数据库中。

      timestamp也是既有日期又有时间的日期类型,如果没有向这个字段中存值,数据库使用当前的系统时间存入到数据库中。


    查看表:

            查看某个数据库下的所有表:show tables;

            查看某个表的结构信息:desc 表名;


       删除表:

        语法:drop table 表名;


      修改表:

            添加列:alter table 表名 add 列名 类型(长度) 约束;

            修改列类型,长度和约束:alter table 表名 modify 列名 类型(长度) 约束;

       添加外键约束:alter table tableName add foreign key (field1) references tableName2(field2);

            删除列:alter table 表名 drop 列名;

            修改列名称:alter table 表名 change 旧列名 新列名 类型(长度) 约束;

            修改表名:rename table 旧表名 to 新表名;

            修改表的字符集:alter table 表名 character set 字符集;


     

    sql对数据库表的记录进行操作:

      

    create table user(
        id int primary key auto_increment,
        username varchar(20) unique,
        password varchar(20) not null,
        age int,
        birthday date
    )

    增:insert into 表名 (列名1,列名2...) values(值1,值2...);

      insert into 表名 values(值1,值2,值3...);

      注意:值的类型是字符串或者是日期类型,使用单引号引起来。

         如果插入的字段是自增,那么插入null占位符即可。

      直接向数据库中插入中文记录会出现错误!需要更改客户端部分的字符集为bgk。

      愿意:跟cmd应用窗口有关,它默认是系统的字符编码,需要将mysql客户端改为与之相同的字符编码,mysql客户端会自动转为utf-8插入服务端。

      解决方法:在mysql的安装路径中找到my.ini文件进行修改

           找到修改为gbk:

              [client]

              port=3306

              [mysql]

              default-character-set=gbk

        重新启动mysql服务器(命令行输入services.msc打开服务列表重启mysql服务)。


     

    删:delete from 表名 where 条件;

    注意:删除如果没有条件默认是删除表中的所有记录。

    删除表中的记录由两种做法:

    delete from 表名;

    删除所有记录,属于DML语句,一条记录一条记录删除。事务可以作用在DML语句上。

    truncate table 表名;

    删除所有记录,属于DDL语句,将表删除,然后重新创建一个结构一样的表,事务不能控制DDL。


     

      改:update 表名 set 列名=值,列名=值 where 条件;

        注意:如果没有条件语句,默认修改某一列的所有值。


      查:select [distinct] * | 列名 from 表名「条件」;        

    distinct:去重。

    查询所有信息select * from tableName;

    查询对应列的所有信息 select 列1,列2 from tableName;

    查询对应列的信息(去重)select distinct 列 from tableName;

    查看两列数据和 select 列0,列1+列2 from tableName;

    别名查询 select 列0 as 别名列0,列1 as 别名列0 from tableName;

      条件查询:

                 使用where子句:

                    >,<,>=,<=,<>,=        ( <>等同于!= )

                    like模糊查询

                    in:范围查询  ( 等同于or )

                    条件关联:and,or,not  ( between and 等同于and )between and 必须小值写前面

            查询d列值为m的数据:select * from tableName where d = m;

            查询d列值为m且c列值大于60的数据: select * from where d = c and c >60;

            like模糊查询:

                查询d列含有‘党’字符的数据:select * from tableName where d like '党%';

                    eg: like '党_';     必须是两个字,而且是以党字符开头;

                        like '党%';     必须是以党字开头,后面可以是任意个字符;

                        like '%党';

                        like '%党%';

            in范围查询:

            查询d列数据是1,2,3的数据: select * from tableName where d in (1,2,3);

            排序查询:

                    使用order by字段名称asc/desc;

                    order by 按顺序排列 order 秩序 by 通过 asc(Ascending升序) desc(Descending降序)

                将学生信息按语文成绩进行排序:

                select *from exam order by chinese;

                将学生信息按语文成绩倒序排序:

                select * from exam order by chinese desc;

                将学生信息先按语文成绩进行倒序排序,如果成绩相同再按照英语成绩升序排序:

                select * from exam order by chinese desc, english asc;

                查询姓党的学生信息,按照英语成绩降序排序

                select * from exam where name like '党%' order by english desc;

           聚合函数使用:

    SQL基本函数,聚合函数对一组值执行计算,并返回单个值。除了 COUNT 以外,聚合函数都会忽略空值。 聚合函数经常与 SELECT 语句的 GROUP BY 子句一起使用。

                    sum();

                    获取所有学生的英语成绩的总和:

                    select sum(english) from exam;

                    获取所有学生的英语成绩和数学成绩总和:

                    select sum(english),sum(math) from exam;

                    查询姓党的学生的英语成绩的总和:

                    select sum(english) from exam where name like '党%';

                    查询所有学生各科的总成绩:

                    一:select sum(english)+sum(chinese)+sum(math) from exam;

                    二:select sum(english+chinese+math) from exam;

                    以上两种写法的不同之处???

            一:按列统计;

            二:一行一行统计,如果碰见null,null+任何值都是null;(可以使用ifnull函数解决)

          null参与的数学运算都是null;

          聚合函数是有滤空功能(不算null);

          null参与的关系运算都是false;

            eg:select * from exam where english is null;(is not null)

                    ifnull函数

    IFNULL(expression_1,expression_2);

    如果expression_1不为NULL,则IFNULL函数返回expression_1; 否则返回expression_2的结果。

                    select sum(ifnull(english,0)+chinese+math) from exam;

                    count();

         count(字段名);

         count(*)查询共有多少条记录。

                    获得学生的总和:

                    select count(*) from exam;

                    获得姓党的学生的个数:

                    select count(*) from exam where name like '党%';

                    max();

                    获得数学成绩的最高分:

                    select max(math) from exam;

                    min();

                    获得语文成绩的最小值:

                    select min(chinese) from exam;

                    avg();

                    获得语文成绩的平均值:

                    select avg(chiense) from exam;

             分组查询:

                    使用group by

                    group组

            建表:

            create table orderitem(

                id int primary key auto_increment,

                product varchar(20),

                price double

            );

                按商品名称统计,每类商品所购买的个数:

                select product,count(*) from orderitem group by product;

                  释义:count(*) 是通过group by product来分组后统计的.(sql语句需要紧邻)

                按商品名称统计,每类商品所花费的总金额:

                select product, sum(price) from orderitem group by product;

                按商品名称统计每类商品花费的总金额在5000元以上的商品

                select product,sum(price) from orderitem group by product having sum(price) > 5000;

                  注意:where的子句后面不能跟着聚合函数。如果现在使用带有聚合函数的条件过滤(分组后条件过滤)需要使用一个关键字having

          having 和 where 的区别?

            where:原始表中数据进行过滤;

            having:分组后的结果过滤。

            having必须和group by 连用。

            having中是可以使用聚合函数,where中不能使用。

          一旦使用了分组或者聚合函数,select 后面字段只能取分组中字段,或者把它放到聚合函数中。

               按商品名称统计每类商品花费总金额在5000以上的商品,并且按总金额升序排序

                  select product,sum(price) from orderitem group by product having sum(price) > 5000 order by sum(price) asc;

    总结:S(select)… F(from)…W(where)…G(group by)…H(having)…O(order by);

    ER模型图:

      (Entity 实体  Relational关系)

      设计业务系统的表结构的时候画的分析图。

    实体:矩形;  属性:椭圆;  关系:菱形;

    事务:

    事务:业务,一般一个业务是由多个步骤构成,这个步骤要么全部成功,要么全部失败,原子性。

    开启一个事务: start transaction;

    提交事务:commit;

    回滚事务:rollback;

    mysql客户端一个sql语句默认为一个事务。

    如果事务中的所有sql语句没有全部执行成功那么不会序列化到本地数据库中。
  • 相关阅读:
    《算法导论》第二章笔记
    Python实现websocket之Django Channel实时推送与聊天
    zabbix设置钉钉报警
    ESXi安装报错,No network adapters were detected...
    supervisor指南
    Flask入门到放弃(五)—— 蓝图
    Flask入门到放弃(四)—— 数据库
    Flask入门很轻松(三)—— 模板
    Flask入门很轻松 (二)
    Flask入门很轻松 (一)
  • 原文地址:https://www.cnblogs.com/laodang/p/8964638.html
Copyright © 2011-2022 走看看