一、Mysql的安装
登陆到mysql的两种方式
(1)点击开始,找到安装的Mariadb文件夹,找到MySQL Client5.5,打开之后再黑窗口面板上填写自己的密码:root
(2) win+R,调出的窗口中输入cmd。先将路径切换到MariaDB数据库的bin目录下
cd 安装路径
3.可视化软件
如果有会话链接失败的,或者在黑窗口不能够登录成功的,是应为mysql的服务端没有开启。下面开启服务端的步骤
(1)第一种方式:
windows自带的服务——没有启动请打开他
2.退出mysql:
输入:exit或者quit;
1.什么是SQL?
英文全称:Structured Query Language
中文名称:结构化查询语言
其实就是定义了 操作所有关系型数据库的规则,每一个数据库了操作的方式可以能是不一样的,存在一定差异化,类比于地方的方言。
SQL通用用法
1)SQL 是可以单行运行、也可以多行运行的,且结束符号是封号(英文状态)
2)可以使用空格和缩进来增强SQL语句的可读性。
3)MySQL数据库中,是不区分大小写的,关键字一般建议使用大写。
4)数据库中设计3中注释
单行注释: --
需要注释的内容
`#` 需要注释的内容(在mysql特有)
多行注释:/* 需要注释的内容 */
(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等。
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;
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的数据