zoukankan      html  css  js  c++  java
  • Mysql基础

    一、数据库

    数据库:存储、维护和管理数据的集合

    数据库管理系统:指一种操作和管理数据库的大型软件,用于建立、使用和维护数据库,对数据库进行统一管理和控制,以保证数据库的安全性和完整性。用户通过数据库管理系统访问数据库中的数据。

    二、SQL

    SQL:structure query language,结构化查询语句。主要有以下分类:

    1、DDL

    DDL:Data Definition Language,数据库定义语言,用来定义数据库、表、列

    使用关键字:create , alter, drop

    1.1、操作数据库

    创建:create database testdb character set utf8;

    删除:drop database testdb;

    修改:alter database testdb character set gbk;

    查询:show databases;

    查看当前选中的数据库:show database();

    选择数据:use testdb;

    1.2、操作表

    创建:create table tb_user(

      id int,

      name varchar(50)

    );

    数据类型:

    int 整型

    double 浮点型,double(4,2),最多4位,2位小数

    char 固定长度字符串

    varchar 可变长度字符串

    text:字符串类型

    blob:字节类型,二进制文件

    date:日志类型,yyyy-MM-dd

    time:时间类型 hh:mm:ss

    timestamp: 时间戳类型

    datetime:完整日期时间  yyyy-MM-dd hh:mm:ss

    删除:drop table tb_user;

    修改:

    alter table tb_user add phone varchar(20);#添加字段

    alter table tb_user modify name varchar(100);#修改字段长度

    alter table tb_user drop phone;

    查看表的字段信息:DESC tb_user;

    2、DML

    DML:Data Manipulation Language, 数据库操作语言,用来操作数据库表中的记录。

    2.1 插入 insert

    #插入字符串和日期,需要使用引号。

    insert into tb_user(id, name) values(1, '张三');

    2.2 修改 update

    update tb_user set name = '王武';

    2.3 删除 delete

    #删除指定条件数据

    delete from tb_user where name = '王武';

    #删除所有数据, 表结构还在。

    delete from tb_user;

    #truncate 删除 是显出表,再创建一个同样表结构的新表

    truncate table tb_user;

    3、DQL

    DQL:Data Query Language, 数据库查询语言。 

    语法:

    SELECT selection_list /*要查询的列名称*/

      FROM table_list /*要查询的表名称*/

      WHERE condition /*行条件*/

      GROUP BY grouping_columns /*对结果分组*/

      HAVING condition /*分组后的行条件*/

      ORDER BY sorting_columns /*对结果分组*/

      LIMIT offset_start, row_count /*结果限定*/

    查询条件:

    •  =、!=、<、<=、>、>=
    •  BETWEEN…AND;
    •  IN(set)
    •  IS NULL  
    •  AND
    •  OR
    •  NOT

    模糊查询:

    通配符

    •  _ 任意字母
    •    % 任意0~n 个字母

    字段控制查询:

    1、去重    select distinct name from tb_user;

    2、IFNULL : 任何数据和NULL相加还是NULL,IFNULL(count,0),如果count字段为NULL,自动转化为0;

    排序

    #ASC 升序 , DESC 降序

    select * from tb_user order by age asc; 

    函数

    count():指定列不为NULL的行数

    max() :最大值

    min() :最小值

    sum():和

    avg():平均值

    分组

    select age ,count(*)  from tb_user group by age;

    HAVING语句

    having 对分组过后的数据进行过滤,并且可以使用聚合函数

    select age ,count(*)  from tb_user group by age having sum(money) > 1000;

    三、数据完整性

    为了让用户输入的数据是正确的。

    1、实体完整性

    • 1、主键约束:  primary key 数据唯一且不为空
    • 2、唯一约束: unique ,数据不重复
    • 3、自动增长列:auto_increment

    2、域完整

    • 非空约束 (not null)
    • 默认值约束 (default)

    create table tb_user(

      id int primary  key auto_increment,

      name varchar(50) not null,

          phone varchar(20) unique,

      sex varchar(10) default 'male'

    );

    3、引用完整性

    外键约束

    create table tb_card(

      id int,

      number int,

      uid int, #外键,关联到tb_user的主键

          constraint fk_card_user foreign key(uid) reference tb_user(id)

    );

    四、多表查询 

    分类:

    合并结果集:UNION(去重), UNION ALL

    连接查询:

      内连接:INNER JOIN ON

      外连接:OUTER JOIN ON

        左外连接:LEFT OUTER JOIN ON

        右外连接:RIGHT OUTER JOIN ON

    子查询:嵌套查询,一个查询语句中包含另一个完整的select语句

      子查询出现的位置:

      where后:作为条件

      from后:作为表

      子查询结果集的形式:

        单行单列(用于条件)

        单行多列(用于条件)

        多行单列(用于条件)

        多行多列(用于表)

    CREATE TABLE tb_class(
    	cid int PRIMARY KEY auto_increment,
    	name varchar(20)
    );
    INSERT INTO tb_class(name) VALUES('一班');
    INSERT INTO tb_class(name) VALUES('二班');
    INSERT INTO tb_class(name) VALUES('三班');
    INSERT INTO tb_class(name) VALUES('四班');
    INSERT INTO tb_class(name) VALUES('五班');
    INSERT INTO tb_class(name) VALUES('六班');
    

      

    CREATE TABLE tb_student(
        sid int PRIMARY KEY auto_increment,
        sname varchar(50),
        age int,
        gender varchar(20),
        score float(5,2),
        cid int);
    
    INSERT INTO tb_student(sname, age, gender, score, cid) VALUES('lisi', 16, 'female', 86.5, 2);
    INSERT INTO tb_student(sname, age, gender, score, cid) VALUES('wangwu', 15, 'female', 75.5, 3);
    INSERT INTO tb_student(sname, age, gender, score, cid) VALUES('lijing', 14, 'male', 65.5, 4);
    INSERT INTO tb_student(sname, age, gender, score, cid) VALUES('zhangrong', 13, 'male', 65.5, 5);
    INSERT INTO tb_student(sname, age, gender, score, cid) VALUES('zuoyi', 15, 'female', 95.5, 6);
    INSERT INTO tb_student(sname, age, gender, score, cid) VALUES('shiyi', 14, 'male', 35.5, 2);
    INSERT INTO tb_student(sname, age, gender, score, cid) VALUES('liuhai', 14, 'female', 45.5, 2);
    INSERT INTO tb_student(sname, age, gender, score, cid) VALUES('guomimg', 14, 'female', 45.5, 3);
    INSERT INTO tb_student(sname, age, gender, score, cid) VALUES('dasan', 13, 'male', 25.5, 4);
    INSERT INTO tb_student(sname, age, gender, score, cid) VALUES('lvyi', 13, 'male', 65.5, 5);
    INSERT INTO tb_student(sname, age, gender, score, cid) VALUES('qianwen', 15, 'female', 55.5, 6);
    INSERT INTO tb_student(sname, age, gender, score, cid) VALUES('haoli', 16, 'male', 45.5, 1);

    1、合并结果集

    将两个select语句的查询结果合并到一起,被合并的两个结果列数和列类型必须相同。

    SELECT s.sid, s.sname FROM tb_student s UNION SELECT c.cid, c.name FROM tb_class c; 

    2、内连接

    SELECT s.sid, s.sname, c.cid, c.name FROM tb_student s, tb_class c WHERE s.cid = c.cid;

    SQL标准内连接:

    SELECT s.sid, s.sname, c.cid, c.name FROM tb_student s INNER JOIN tb_class c ON s.cid = c.cid;

     查询结果必须满足查询条件。

    3、外连接

    3.1 、左连接

    以左表为主,查询右表,满足条件的显示出来,不满足的显示为NULL

    SELECT s.sid, s.sname, c.cid, c.name FROM tb_student s LEFT JOIN tb_class c ON s.cid = c.cid;

    3.2、右连接

    以右表为主,查询左表,满足条件的显示出来,不满足的显示为NULL 

    SELECT s.sid, s.sname, c.cid, c.name FROM tb_student s RIGHT JOIN tb_class c ON s.cid = c.cid;

    4、子查询

    子查询结果集的形式

    4.1、 单行单列

    例如:分数比‘lijing’高的同学

    lijing的分数

    SELECT score FROM tb_student WHERE sname = 'lijing';

      单行单列

    SELECT * FROM tb_student WHERE score > (SELECT score FROM tb_student WHERE sname = 'lijing');

    4.2、多行单列

    分数高于二班所有人的学生

    二班的id

    SELECT cid FROM tb_class WHERE name = '二班';

    二班学生的分数
    SELECT score FROM tb_student WHERE cid = (SELECT cid FROM tb_class WHERE name = '二班');

    多行单列

    高于二班所有人的学生
    SELECT * FROM tb_student WHERE score > ALL(SELECT score FROM tb_student WHERE cid = (SELECT cid FROM tb_class WHERE name = '二班'));

    4.3、单行多列

    分数和班次与lijing相同的学生

    lijing的分数和班次

    SELECT score, cid FROM tb_student WHERE sname = 'lijing';

    单行多列

     分数和班次与lijing相同

    SELECT * FROM tb_student WHERE (score, cid) IN(SELECT score, cid FROM tb_student WHERE sname = 'lijing');

    4.4、多行多列

    查询lijing的年龄,性别,分数,部门

    SELECT s.age, s.gender, s.score, c.name FROM tb_student s, tb_class c WHERE sname = 'lijing' AND s.cid = c.cid;

    上面这样查也能查询出来,但是 tb_class 是一张完整的表,里面字段是用不到的,所以我们可以使用子查询,找到我们所需要的字段,部门名称和部门ID

    SELECT s.age, s.gender, s.score, c.name FROM tb_student s, (SELECT cid, name FROM tb_class) c WHERE sname = 'lijing' AND s.cid = c.cid;

     

  • 相关阅读:
    Qt 错误汇集贴
    转:Qt编写串口通信程序全程图文讲解
    转:QT 的点点滴滴 错误总结
    转:Qt项目中遇到的一些小问题汇总
    转:AM335X 启动流程
    基于Xilinx Zynq的计算处理平台
    基于英伟达Jetson TX1的GPU处理平台
    基于6U VPX的 SRIO 接口, 和PCIe 接口的msata 固态存储卡
    国芯网 邀请国产芯片原厂入驻商城
    295-Xilinx Kintex-7 X7K325T的半高PCIe x4双路万兆光纤收发卡
  • 原文地址:https://www.cnblogs.com/king-peng/p/15071452.html
Copyright © 2011-2022 走看看