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;

 

 

posted on 2021-08-11 16:08  Siwanper  阅读(44)  评论(0编辑  收藏  举报