zoukankan      html  css  js  c++  java
  • mysql

    条件关键字

    where可以被having代替
    having用于分组之后可以接聚合函数,弥补了where不能接聚合函数的缺陷,可以代替where
    on用于链接
    update user set host = '%' where user = 'root';
    增:
    create table 数据库名称 ; 创建数据库
    create 表名{
    字段名称 字段类型(长度) 约束,
     
     
    };
    create table students(
    id int not null primary key auto_increment,
    name char(10),
    age int,
    );
    char char(3)(长度固定 ,不可以变,没有存的空间空格补齐 )
    String varchar(3)(长度可以变)
    3代表的是可以存三个字符  
    date YYYY-MM-DD
    time hh:mm:ss
    datetime YYYY-MM-DD  hh:mm:ss 默认是null
    timestamp  YYYY-MM-DD  hh:mm:ss 默认是当前时间
     
    text 存文本
    blob 存放二进制
     
    约束:
    主键: primary key
    唯一约束: unique
    非空约束: not null
     
    增加字段;
    alter table 表名 add 字段名 数据类型 约束;
    alter table students add score int not null;
    修改字段大小和字段类型:
    alter table 表名 modify 字段名 varchar(20);
    alter table students modify name varchar(20);
    修改字段名称:
    alter table students change name student_name varchar(20);
    删除字段:
    alter table students drop score;
     
    修改表名:
    rename table students to studentssss;
    修改表的字符集:
    alter table students character set utf8;
     
     
    删除表;
    drop students;
     
     
     
     
     
     
     
     
     
     
     
    创建表
     
     
    创建数据库的指定字符集 create database name character set utf8 collate utf8_bin
    collate 校对字符集
    修改:
    修改数据库字符集 alter databae 数据库名称 character set 字符集
    删除:
    drop database 数据库名字; 删除数据库
     
     
    查:
     
    使用数据库:
    use 数据库名称;
     
    查看正在使用的数据库:
    select database();
     
    查看表:
    show tabLe;
     
    查看库的定义过程:
    show create database test;
    查看表的创建过程;
    show create table students;
    查看表结构:
    desc students;
     
     
     
    -------------------------------------------------------------------
     
     
    对表操作:
    增:
    insert into students(id,name,age) values(11,'mlj',111);
    简单写法:
    insert into students values(11,'mlj',111);
    批量插入:
    insert into students values
    (12,'mlj',111),
    (13,'mlj',111),
    (14,'mlj',111),
    (15,'mlj',111),
    (17,'mlj',111),
    (18,'mlj',111),
    (19,'mlj',111);
     
     
     
     
    删:
    delete from students where id=10;
    delete from students; 删除整个表的数据
    truncate students; 删除表后重新建表
    truncate ()也是个函数 保留 小数位
     
    delete和truncate drop
    区别:delete是一条一条的删除记录
    truncate是删除所有记录后重启启动创建表
    drop删除后表就啥都不存在了
     
    改:
    若果参数是字符串或者是日期要加单引号
    update students set id=1080 ,name='ssss' where id=19;
     
    查:select [distinct][*][字段,字段2] from 表名 [where 条件]
    distinct表示去除重复

    在表中,可能会包含重复值。这并不成问题,不过,有时您也许希望仅仅列出不同(distinct)的值。关键词 distinct用于返回唯一不同的值。

    表A:

    表B:

    1.作用于单列

    select distinct name from A

    执行后结果如下:

    2.作用于多列

    示例2.1

    select distinct name, id from A

    执行后结果如下:

    实际上是根据name和id两个字段来去重的,这种方式Access和SQL Server同时支持。

    示例2.2

    select distinct xing, ming from B

    返回如下结果:

    返回的结果为两行,这说明distinct并非是对xing和ming两列“字符串拼接”后再去重的,而是分别作用于了xing和ming列。

    3.COUNT统计

    select count(distinct name) from A;	  --表中name去重后的数目, SQL Server支持,而Access不支持

    count是不能统计多个字段的,下面的SQL在SQL Server和Access中都无法运行。

    select count(distinct name, id) from A;

    若想使用,请使用嵌套查询,如下:

    select count(*) from (select distinct xing, name from B) AS M;

    4.distinct必须放在开头

    select id, distinct name from A;   --会提示错误,因为distinct必须放在开头

    5.其他

    distinct语句中select显示的字段只能是distinct指定的字段,其他字段是不可能出现的。例如,假如表A有“备注”列,如果想获取distinc name,以及对应的“备注”字段,想直接通过distinct是不可能实现的。但可以通过其他方法实现关于SQL Server将一列的多行内容拼接成一行的问题讨论

    转自:http://www.cnblogs.com/rainman/archive/2013/05/03/3058451.html



    别名查询 

    as可以省略
    select p.name ,p.price from product as p;表别名
     
    --去掉重复的值
    select distinct pprice from product;
    ---select运算查询
    select * ,pprice*2 折后价 from product ;
     
    -----条件查询
    查询价格大于60的产品
    select* from product where pprice>60;

     as作为临时表

    用到的知识点  内连接
    SELECT student.*,temp.score FROM 
    student ,
    (SELECT student_id ,score FROM studentcourse WHERE score<60) as temp
    WHERE student.id = temp.student_id;

    关系运算符

     > >= < <= = != <>不等于
    逻辑运算 and or not

        between..and....



     模糊查询

    -:代表的是任意一个字符
    %:代表的是0个或多个字符

     过滤查询(distinct)

    去掉重复的值
    select * from product where pname like '%米%';
    select * from product where pname like '_米%';

     查询排序

    使用order by 子句排序查询结果。

    语法:select * from 表名 order by 列名1  asc|desc,列名2asc|desc),列名3asc|desc) 。。。。。;

    按照列名1,列名2,列名3 进行排序输出。

    asc是升序排列,desc是降序排列。默认是asc升序。

     

    按照第一列进行排序,如果第一列相同,按照第二列在进行排序。

     


     
    --in 在某个范围中获得值
    select * from product where pnum in (1,3,5);
     
    --排序查询:order by 关键字
    asc:ascend 升序 (默认的排序方式)
    desc:descend 降序
    select * from product order by pprice desc;价格降序
    select * from product where pname like '%米%' order by pprice asc;//包含米字并且升序排序
     
    --聚合查询:
    sum()
    avg()
    count()
    max()
    min()
    select sum(pprice) from product;查看所有商品价格的总和
    select count(*) from product;查看商品的个数
    select * from product where pprice > (select avg(pprice) from product);查询产品大于平均值的信息
     
     
    ----分组

     group by

    顺序

    先分组之后聚合函数再计算
    select pnum ,count(pnum)from product group by pnum; 按pnum分组,求出分组个数
    显示的列名跟聚合函数一致 ,pnum ,count(pnum) 不要出现其他列名
    having 可以接聚合函数 出现在分组之后
    select pnum ,avg(pprice)from product group by pnum having avg(pprice)> 60; 根据pnum分组 并且要求分组avg大于60
    where 他不可以接聚合函数 出现在分组之前
    group by在我之前的工作中不一定用到,可惜group by在一般的笔试测试的时候经常用到。所以今天刚开一个博客记录下group by用法,为避免以后再犯这个错误。

      聚合函数
    求和函数——SUM()

    计数函数——COUNT()

    最大/最小值函数—MAX()/MIN()

    均值函数——AVG()

    —————————————————————————————————————————

    GROUP BY 是分组查询, 一般 GROUP BY 是和 聚合函数配合使用,你可以想想

    你用了GROUP BY 按  ITEM.ITEMNUM 这个字段分组,那其他字段内容不同,变成一对多又改如何显示呢,比如下面所示

    A  B
    1  abc
    1  bcd
    1  asdfg

    select A,B from table group by A
    你说这样查出来是什么结果,

    A  B
       abc
    1  bcd
       asdfg

    右边3条如何变成一条,所以需要用到聚合函数,比如

    select A,count(B) 数量 from table group by A
    这样的结果就是
    A  数量
    1   3

    ——————————————————————————————————————

    Store_Information 表格

      store_name Sales Date 

      Los Angeles $1500 Jan-05-1999 

      San Diego $250 Jan-07-1999 

      Los Angeles $300 Jan-08-1999 

      Boston $700 Jan-08-1999 

      我们就打入
    SELECT store_name, SUM(Sales) FROM Store_Information GROUP BY store_name 

      结果: 

      store_name SUM(Sales)

      Los Angeles $1800

      San Diego $250

      Boston $700

    ————————————————————————————————————————

    group by 有一个原则,就是 select 后面的所有列中,没有使用聚合函数的列,必须出现在 group by 后面

    group by报错 

     any_value()
    sql_mode=STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION;




    多个列名分组

    where和分组没有关系

    select ... from ... where 条件1 ... group by ... having 条件2

    执行顺序:

    条件1 会先执行过滤

    进行分组

    条件2进行过滤

     

    开发中什么情况下使用分组?小技巧。

    当在需求中遇到每种,每个等字眼的时候就使用分组。




     
     
    create table product(
    pid int primary key auto_increment,
    pname varchar(20),
    pprice int,
    ptime timestamp,
    pnum int
     
    );
     
     
    insert into product values
    (null,'小米6',5000,null,3),
    (null,'辣条',1,null,32),
    (null,'啤酒',4,null,3),
    (null,'啤酒',5000,null,3);
     
     
    --------------------多表操作-----------------------------------
    ---外键操作------------
    给product中的这个cno
    添加一个外键约束 
     
    alter table product add foreign key(cno)  references  category(cid);
        pid int primary key auto_increment,//主键设置为外键
    一对多
    多对多(多建一张中间表,  将多对多的关系拆成一对多关系,中间至少要有两个外键,这两个外键分别指向原来的那张表)
    一对一
     
     
    --------------------多表操作-----------------------------------
     
     
     

    关于sql中constraint 前缀的用意(PK、UK、DF、CK、FK)



    constraint 约束

    --主键
    constraint PK_字段 primary key(字段),

    --唯一约束
    constraint UK_字段 unique key(字段),

    --默认约束
    constrint DF_字段 default('默认值') for 字段,

    --检查约束
    constraint CK_字段 check(约束。如:len(字段)>1),

    --主外键关系
    constraint FK_主表_从表 foreign(外键字段) references 主表(主表主键字段)
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
    ------------------------------------------------------------------------
     
    mysqld --initialize-insecure --user=mysql
    mysqld -install
    mysqld -remove
     
     
    mysqladmin -u root -p password 新密码
     
     
     
    1.登录常用参数
        -u 用户名
     
        -p 密码
     
        mysql -uroot -p
        mysql -uroot -proot
     
        -h 服务器名称
     
        mysql -hlocalhost -uroot -p
        mysql -h127.0.0.1 -uroot -p
     
        -P 端口号
     
        mysql -uroot -p -P3306     
     
        -D 打开指定数据库
     
        -V 输出版本信息并退出
        mysql -V
        mysql -uroot -p -Vte
     
    2.退出
    quit
    exit

    多表设计原则:


    扩展:

    sum



     limit

    语法select * from 表名 limit  offset, row_count;



    外键:

    restrict 限制 主从表有联系
    cascade 删除一个表的记录时,已知关联的表的记录也会被删除.
    set null  删除一个表的记录时,已知关联的表的记录的值被设置为null

    null查询 

    内连接

    两边都有才会查出来的
    左链接
    on条件必须加入

    两表联合查询及条件过滤

    解决了迪卡尔集问题

    子条件查询

    定义:用查询处理的结果作为查询的条件来继续查询
    个人理解 :找出分数不是最高分的记录


  • 相关阅读:
    别折腾自己
    在线工具集合
    搜索新技能
    saml login的流程
    给学网 好网站
    drush .. drupal console
    地铁健身操
    js扩展符号
    for in | for in 比较 解释 | 以后找知识点先从这里面搜索
    grep 查找字符串 在文件或者文件夹中
  • 原文地址:https://www.cnblogs.com/mljqqh/p/10493766.html
Copyright © 2011-2022 走看看