MySQL数据库基础

一、Mysql的安装

MySQL数据库基础_第1张图片

登陆到mysql的两种方式 

(1)点击开始,找到安装的Mariadb文件夹,找到MySQL Client5.5,打开之后再黑窗口面板上填写自己的密码:root

 (2)   win+R,调出的窗口中输入cmd。先将路径切换到MariaDB数据库的bin目录下

cd 安装路径

mysql -uroot -prootMySQL数据库基础_第2张图片

3.可视化软件

MySQL数据库基础_第3张图片

MySQL数据库基础_第4张图片

MySQL数据库基础_第5张图片 如果有会话链接失败的,或者在黑窗口不能够登录成功的,是应为mysql的服务端没有开启。下面开启服务端的步骤

(1)第一种方式:

windows自带的服务——没有启动请打开他

 (2)cmd以管理员权限打开 使用命令开关数据库MySQL数据库基础_第6张图片

2.退出mysql:

        输入:exit或者quit;

SQL介绍

1.什么是SQL?

           英文全称:Structured Query Language

           中文名称:结构化查询语言

           其实就是定义了 操作所有关系型数据库的规则,每一个数据库了操作的方式可以能是不一样的,存在一定差异化,类比于地方的方言。

  1. SQL通用用法

    ​ 1)SQL 是可以单行运行、也可以多行运行的,且结束符号是封号(英文状态)

    ​ 2)可以使用空格和缩进来增强SQL语句的可读性。

    ​ 3)MySQL数据库中,是不区分大小写的,关键字一般建议使用大写。​ 

          4)数据库中设计3中注释

    • 单行注释: -- 需要注释的内容

        	​  `#`   需要注释的内容(在mysql特有)
    • 多行注释:/* 需要注释的内容 */

======================SQL的分类======================

(1)DDL(Date Definition Language)数据定义语言

​ 是用来定义数据库对象:数据库、数据表、列等

​ 关键字:create、drop、alter等

​ (2)DML(Date Manipulation Language)数据操作语言

​ 是用来对数据库中的表中的数据进行:增删改。

​ 关键字:insert、delete、 update等

​ (3)DQL(Date Query Language)数据库查询语言

​ 是用来查询数据库中表的记录(即指数据)。

​ 关键字:select、 where等

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

​ 是用来定义数据库的访问权限和安全级别。

​ 关键字:Grant、 Revoke等。

====================SQL的分类====================

4.SQL语句的应用

        DDL:数据库定义语言 -- 数据库、数据表

1.操作数据库: CRUD

1. C:Create 创建
-- 创建数据库
	create database 数据库名称;
-- 创建数据库并判断是否存在
	create database if not exists 数据库名称;
-- 创建数据库的同时可以设置字符集
	create database  数据库名称 character set 字符集; 【uft8、gbk】

# 练习:创建一个名为db1的数据库
#      创建一个名为db2的数据库,并判断
#      创建一个名为db3的数据库,并判断的同时设置字符集为utf8
	create database db1;
	create database if not exists db2;
	create database if not exists db3 character set utf8;

MariaDB [(none)]> create database db1;
Query OK, 1 row affected (0.00 sec)

MariaDB [(none)]> create database if not exists db2;
Query OK, 1 row affected (0.00 sec)

MariaDB [(none)]> create database if not exists db3 character set utf8;
Query OK, 1 row affected (0.00 sec)


2.R:Retrieve 查询
	-- 查询数据库
	show databases;
	-- 查询某个数据库的字符集:查询某个数据库的创建语句就可以查询到字符集
	show create database 数据库名称;
	
MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| db1                |
| db2                |
| db3                |
| mysql              |
| performance_schema |
+--------------------+
6 rows in set (0.00 sec)

MariaDB [(none)]> show create database db1;
+----------+--------------------------------------------------------------+
| Database | Create Database                                              |
+----------+--------------------------------------------------------------+
| db1      | CREATE DATABASE `db1` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+--------------------------------------------------------------+
1 row in set (0.00 sec)

3.U: Update 修改
-- 修改数据库的字符集
	alter database 数据库名称 character set 字符集名称;

# 修改db3数据库的默认字符集为gbk
alter database db3 character set gbk;

MariaDB [(none)]> alter database db3 character set gbk;
Query OK, 1 row affected (0.00 sec)

MariaDB [(none)]> show create database db3;
+----------+-------------------------------------------------------------+
| Database | Create Database                                             |
+----------+-------------------------------------------------------------+
| db3      | CREATE DATABASE `db3` /*!40100 DEFAULT CHARACTER SET gbk */ |
+----------+-------------------------------------------------------------+
1 row in set (0.00 sec)

4. D: Delete 删除
-- 删除数据库
	drop database 数据库名称;
-- 判断数据库是否存在,存在则删除
	drop database if exists 数据库名称;
# 删除db3数据库
	drop database if exists db3;

MariaDB [(none)]> drop database if exists db3;
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| db1                |
| db2                |
| mysql              |
| performance_schema |
+--------------------+
5 rows in set (0.00 sec)

2.操作数据表 (CRUD) 

C:Create 创建
-- 创建数据库表
	# 创建表的标准语法:
	create table 表名称( 
        类名称1 数据类型1, 
        列名称2 数据类型2, 
        ...
        变量名称n 数据类型n
    );
# 注意使用: 最后一列的数据,是不需要添加逗号的
	数据类型:
		1.int 整数类型   id int(18)
		2.double 小数类型  sal double(10, 2) 数据的最大长度是10,小数点精确到后2位
		3.varchar 字符串类型 name varchar(10)    "zhangsan" / "张三"
		4.date 日期类型 只包含了年月日, yyyy-MM-dd
		  datetime 包含了年月日时分秒,yyyy-MM-dd HH:mm:ss
		  timestamp 叫时间戳,包含了年月日时分秒,yyyy-MM-dd HH:mm:ss
		 -- 特点在于,不给其赋值时,默认会填写当前系统所在的时间,完成自动赋值。
		
-- 创建数据表

create table user(
	id int(5),
    name varchar(32),
    score double(3, 2),
    birthday datetime,
    create_table_time timestamp
); 

MariaDB [(none)]> use db2;
Database changed
MariaDB [db2]> create table student(
    -> id int(5),
    ->     name varchar(32),
    ->     score double(3, 2),
    ->     birthday datetime,
    ->     create_table_time timestamp
    -> );
Query OK, 0 rows affected (0.01 sec)

# 练习: 创建一张名为user的数据表,包含字段:年龄、性别、名字、生日、工资、表创建的时间

R:Retrieve 查询
-- 查询表
show tables;
-- 查询表的结构
desc 数据表名称;
MariaDB [db2]> show tables;
+---------------+
| Tables_in_db2 |
+---------------+
| student       |
| user          |
+---------------+
2 rows in set (0.00 sec)

MariaDB [db2]> desc user;
+-------------------+-------------+------+-----+-------------------+-----------------------------+
| Field             | Type        | Null | Key | Default           | Extra                       |
+-------------------+-------------+------+-----+-------------------+-----------------------------+
| id                | int(5)      | YES  |     | NULL              |                             |
| name              | varchar(32) | YES  |     | NULL              |                             |
| score             | double(3,2) | YES  |     | NULL              |                             |
| birthday          | datetime    | YES  |     | NULL              |                             |
| create_table_time | timestamp   | NO   |     | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
+-------------------+-------------+------+-----+-------------------+-----------------------------+
5 rows in set (0.01 sec)

U: Update 修改
-- 修改表名称
alter table 旧的表名称 rename to 新的表名称; 
-- 修改表的字符集
alter table 表名称 character set 字符集;
-- 增加一列
alter table 表名称 add 列名称 数据类型;
-- 修改列的名称
alter table 表名称 change 列名称 新列名称 数据类型;
alter table 表名称 modify 列名称 新的数据类型;
-- 删除列
alter table 表名称 drop 列名称;

D: Delete 删除
-- 删除整张表
drop table 表名称;
drop table if exists 表名称;

MariaDB [db2]> drop table if exists user1;
Query OK, 0 rows affected (0.00 sec)

MariaDB [db2]> show tables;
+---------------+
| Tables_in_db2 |
+---------------+
| student       |
+---------------+
1 row in set (0.00 sec)

--补充:

--增加一列

alter table 表名称 add 新列名称 数据类型 first;

alter table 表名称 add 新列名称 数据类型 after 旧列名称; 

--查询表的详情(含有字符集、数据库引擎)

show create database db2;

show create table user;

        DML:数据操作语言

 1.向表中添加数据

语法结构:
insert into 表名称(列名称1, 列名称2,列名称3,... 列名称n)values(值1,值,值3...值n);
注意事项:
	1. 列名称和值要做到一一对应!
	2. 如果表名称后面不定义列名,则默认是给所有的列进行赋值
	insert into 表名称 values(值1,值,值3...值n);
	3. 除了数字类型,其他的类型需要使用引号(单双引号都是可以的)
# 举例
-- 创建表
create table person(id int(3),name varchar(32))charset=utf8;
-- 插入数据
方式一:
	INSERT INTO person(id,name)VALUES(100,'张三');
方式二:
	INSERT INTO person VALUES(200,'李四');
方式三:
	INSERT INTO person VALUES(300,'王五'),(400,'马六'),(500,'田七');

2.将表中数据删除

语法规则:
	delete from 表名称 [where 条件];
注意事项:
	1. 如果删除语句不添加任何的条件,则删除的是整张表的数据。
	2. 如果我们要删除表中的所有数据:
(1)delete from 表名称; 【占空间的,好比于删除了文件,该文件还是放在了回收站中(回滚)】
(2)truncate table 表名称; 【删除的数据是永久 shift+del 】 
注意以上的两个sql删除的都是表中的数据,并非删除的是表结构。
如果要删除表本身:drop table 表名称;
# 举例
DELETE FROM person WHERE id=100;
DELETE FROM person WHERE name='李四';
DELETE FROM person WHERE id=300 and name='李四';
TRUNCATE TABLE person;-- 删除的是表中的数据
DELETE FROM person;-- 删除的是表中的数据
DROP TABLE person; -- 删除的是整个表的结构

3.把表中数据修改 

语法结构:
	update 表名称 set 列名称1 = 值1,列名称2=值2,...,列名称n=值n [ where 条件];
注意事项:
	(1)如果更新操作不添加任何的条件,那么修改的是整张表中的数据。
# 举例
UPDATE person SET id=101,NAME='zahngsan' WHERE id=500
UPDATE person SET id=102,NAME='lisi' WHERE id=300 AND NAME='李四';
UPDATE person SET id=103,NAME='wangwu' ;-- 整张表的数据被更新

4.练习

1. 创建mydb1和mydb2数据库,字符集第一个utf8和第二个gbk
	CREATE DATABASE mydb1 CHARSET=UTF8;
        CREATE DATABASE mydb2 CHARSET=GBK;
2. 查询所有数据库检查是否创建成功
        show databases;
3. 分别查询两个数据库的字符集是否正确
        SHOW CREATE DATABASE mydb1;
        SHOW CREATE DATABASE mydb2;
4. 先使用mydb1再使用mydb2
        USE mydb1;
        USE mydb2;
5. 删除两个数据库
        DROP DATABASE mydb1;
        DROP DATABASE mydb2;
6. 创建数据库:mydb3 字符集utf8并使用
        CREATE DATABASE mydb3 CHARSET=UTF8;
        USE mydb3;
7. 创建员工表emp字段:名字 字符集utf8
        CREATE TABLE emp(
            NAME VARCHAR(32)
        )CHARSET=utf8;  
8. 添加表字段: 最后添加job,最前面添加id, job前面添加工资salary
        ALTER TABLE emp ADD job VARCHAR(32);
        ALTER TABLE emp ADD id INT(5) first;
        ALTER TABLE emp ADD salary INT(5) AFTER NAME;
9. 删除:job字段 
        ALTER TABLE emp DROP job;
10. 修改表名为:e 
        ALTER TABLE emp RENAME TO e;
11. 删除表:e 
        DROP TABLE e;
12. 删除数据库:mybd3
        DROP DATABASE mydb3;
13. 创建数据库mydb4 字符集utf8并使用
        CREATE DATABASE mydb4 CHARSET=UTF8;
        USE mydb4;
14. 创建汽车car表,字段有: id ,name, type(类型的意思字符串),生产日期(包含年月日)
        CREATE TABLE car(
            id INT(5),
            NAME VARCHAR(32),
            TYPE VARCHAR(32),
            DATA DATE
);
15. 插入以下数据:
	(1)五菱宏光 面包车,(2)保时捷911 跑车, (3)蔚来ES8 SUV,(4)小鹏p7 纯电轿车 
INSERT INTO car VALUES(1,'五菱宏光','面包车','2000-4-5'),(2,'保时捷911','跑车','2000-4-5'),(3,'蔚来ES8','SUV','2000-4-5'),(4,'小鹏p7','纯电轿车','2000-4-5');
16. 修改五菱宏光为:火车
        UPDATE car SET NAME='火车' WHERE id=1 AND NAME = '五菱宏光';
17. 给表添加字段:价格money
        ALTER TABLE car ADD money INT(5);
18. 修改id小于3的价格为10000
        UPDATE car SET money=10000 WHERE id<3;        
19. 修改:蔚来es8 为纯电SUV
        UPDATE car SET type='纯电SUV' WHERE NAME='蔚来es8';
20. 修改保时捷911价格为20000
        UPDATE car SET money='20000' WHERE NAME='保时捷911';
21. 删除:id等于4的数据
        DELETE FROM car WHERE id = 4;
22. 修改:所有车的价格为888
        UPDATE car SET money=888;
23. 修改表名为:cars        
        ALTER TABLE car RENAME TO cars;
24. 删除:money字段
        ALTER TABLE cars DROP money;
25. 删除所有数据 
        DELETE FROM cars;
26. 删除表
        DROP TABLE cars;
27. 删除数据库
        DROP DATABASE mydb4;    

         DQL:数据查询语言

应用数据

-- 只需要将以下的数据复制到可视化窗口,选中运行即可。或者粘贴到黑窗口回车运行!

# 创建表
CREATE TABLE student(
     id int, -- 编号
     name varchar(20), -- 姓名
     age int, -- 年龄
     sex varchar(5), -- 性别
     address varchar(100), -- 地址
     chinese int, -- 语文
     math int, -- 数学
     english int -- 英语
);
# 插入数据
INSERT INTO student(
    id, name, age, sex, address, chinese, math, english
)VALUES
(1,'唐僧',55,'女','大唐',88,66,78),
(2,'孙悟空',45,'男','水帘洞',90,98,87),
(3,'猪八戒',39,'男','高老庄',66,56,77),
(4,'沙和尚',40,'男','流沙河',64,76,65),
(5,'牛魔王',45,'男','翠云山',60,86,58),
(6,'铁扇公主',38,'女','火焰山',61,81,71),
(7,'红孩儿',12,'男','火云洞',55,99,65),
(8,'如来佛',99,'男','西天',99,99,99),
(9,'观世音',98,'女','西天',98,98,98),
(10,'白骨精',28,'女','妖界',59,56,NULL);

一、基础查询 

	1.语法结构:
		select 列名1,列名2,列名3,..,列名n from 表名称
	# 举例:
		select id,name,age,sex from student;
	2.注意事项:
		(1)select命令可以读取一行或者多行数据
		(2)如果要查询表中所有的列,则可以使用 * 代替
			SELECT * FROM student;
		(3)还可以添加条件进行查询,添加条件之后,返回的是所有符合条件的内容
		    SELECT * FROM student WHERE id<=5;
	
	3.(*)对于查询到的数据结果,如果有重复数据体现,在某些情况下需要对其去重操作。则:
		使用关键字: distinct
		select distinct sex from student; -- 查表结果中的性别数据
	
	4.(*)当null参与运算时,得到的结果还是null。对null就行处理时,
		使用关键字:ifnull
	SELECT id,NAME,ifnull(chinese,0)+ifnull(math,0)+ifnull(english,0) FROM student;
	注意: ifnull(表达式1,表达式2)。
		  第一个表达式判断如果是null,则可以使用表达式2的值代替表达式1的值。
		  
	5.(*)可以给列起别名,使用到的关键字 AS,这个AS是可以省略掉的,但一定要打至少一个的空格 
SELECT ifnull(chinese,0)+ifnull(math,0)+ifnull(english,0) AS '总分' FROM student;
SELECT id '序号', NAME '名字' FROM student;

二,条件查询

	1.where 字句后面是查询条件
	2.运算符:
		(1)比较运算符
			>、 <、 >=、 <=、 !=和<>(表示不等于)、 =
			between...and...
			in(集合)
			like: 模糊查询
				# mysql的占位符:
			        _: 单个任意的字符
                      %: 多个任意的字符
            is null
		(2)逻辑运算符
			and: 表示与的关系   或者可以使用: &&
			or:  表示或的关系   或者可以使用: ||
			not: 表示非的关系   或者可以使用: !
语法结构:
	select 
		字段列表
	from
		表名称
	where
		条件列表
	group by
    	分组字段
    having
    	分组之后的条件
    order by
    	排序
    limit
    	分页限定

DQL查询练习1

--1.查询年龄小于等于28的
SELECT * FROM student where age<=28;
--2.查询年龄大于90的
SELECT * FROM student WHERE age>90;
--3.查询年龄不等于45
SELECT * FROM student WHERE age!=45;
SELECT * FROM student WHERE age<>45;
--4.查询年龄大于20岁,小于等于50的
SELECT * FROM student WHERE age>20 && age<=50;
SELECT * FROM student WHERE age>20 AND age<=50;
SELECT * FROM student WHERE age between 20 and 50;
--5.查询年龄是 12岁,45岁,98岁的
SELECT * FROM student WHERE age=12 || age=45 || age=98;
SELECT * FROM student WHERE age=12 or age=45 or age=98;
SELECT * FROM student WHERE age IN(12,45,98);
--6.查询英语成绩是 null
SELECT * FROM student WHERE english IS NULL;
-- 7.查询英语成绩不是null 
SELECT * FROM student WHERE english IS not NULL;
-- 8.查询姓名中是4字的人
SELECT * FROM student WHERE name LIKE "____";
-- 9.查询姓名中包含'八'字的人
SELECT * FROM student WHERE name LIKE "%八%";
-- 10.查询姓名中第二个字是'八'的人
SELECT * FROM student WHERE name LIKE "_八%";
-- 11.查询姓名是以'红'开头的人
SELECT * FROM student WHERE name LIKE "红%";
-- 12.查询姓名中以 "佛" 结尾的人
SELECT * FROM student WHERE name LIKE "%佛";

三、排序查询

	1. 语法:
        select  
            字段列表 
        from 
            表名称 
        order by 
            排序字段1 排序方式1,排序字段2 排序方式2.. ;
		# 例子
		
		SELECT * FROM student ORDER BY math ASC ;-- asc 表示升序排序
		SELECT * FROM student ORDER BY math DESC ;-- desc 表示降序排序	
	注意:
		如果有多个排序的条件同时存在,则当前边的条件值相同时,才会依据第二个条件进行判断,如果当第二个条件还是相同时,就会以第三个条件作为判断升降序,依次类推下去。
		
		SELECT  * FROM student ORDER BY math DESC, english ASC ; 

四、聚合函数 

	含义:
		将一列数据作为一个整体进行纵向的计算。
	1.count(): 计算个数	
	注意:计算整体个数的时候,(1)一般是会选择非空的列(主键);(2)count(*)
	2.max(): 求最大值
	3.min(): 求最小值
	4.sum(): 求和
	5.avg(): 求平均数
		
    注意: 聚合函数的计算中,是排出null值的,如果在某场景null有使用到,使用ifnull函数处理。
		# 举例
			SELECT avg(english)FROM student; -- 77.55
			SELECT avg(ifnull(english,0))FROM student;-- 69.8

五、分组查询

1. 语法:
        select  
            分组的字段、 聚合函数
        from 
            表名称 
        group by 
            分组字段;	
	-- 按性别分组,求各组的数学平均分,语文的最高分,英语的最低分 
    select sex,avg(math),max(chinese),min(english) from student group by sex;
    
    -- 按性别分组,求各组的数学平均分,数学分数低于65分的不参与分组
    SELECT sex,AVG(math),COUNT(id)FROM student WHERE math>65 GROUP BY sex;
	
	-- 按性别分组,求各组的数学平均分,数学分数低于65分的不参与分组, 分组之后,人数要求大于4个
SELECT sex,AVG(math),COUNT(id)FROM student WHERE math>65 GROUP BY sex HAVING COUNT(id)>4;
    
WHERE 和 HAVING之间的区别:
	1. 位置不同: where是在分组之前,如果条件不满足,则不参与分组
				having是在分组之后,如果不满足条件,则不会被查询出来
	2. where后面条件不可以使用聚合函数,而having后面的条件是可以使用聚合函数的。

六、分页查询

1.语法结构:
		 select  
            字段列表
         from 
            表名称
		 limit 
		 	开始的索引,每页显示的条数
    
	-- 查询第一页数据,每页显示3条
    SELECT * FROM student LIMIT 0,3;

    -- 查询第二页数据,每页显示3条
    SELECT * FROM student LIMIT 3,3;

    -- 查询第三页数据,每页显示3条
    SELECT * FROM student LIMIT 6,3;

    -- 查询第四页数据,每页显示3条
    SELECT * FROM student LIMIT 9,3;

	通用公式:
		开始的索引 = (当前页码 - 1)* 每页显示的条数

DQL数据库练习:

-- 1.查询所有数据,使用年龄降序排序


-- 2.查询所有数据,在数学成绩降序排序的基础上,如果数学相同再以年龄升序排序


-- 3.按性别进行分组,查询下男生和女生各有多少人和英语成绩的平均分


-- 4.查询年龄大于等于40岁的人,按性别分组,统计每组的人数


-- 5.查询年龄大于30岁的人,按性别分组,统计每组的人数,并只显示性别人数大于4的数据

你可能感兴趣的:(数据库,c语言,mysql,sql)