mysql学习记录

关系型数据库:不是把所有的数据全部存储在一起,而是分类存储在一起。

常见的数据库

关系型:oracle大型收费,mysql小型免费。

sql语言(操作数据库)

structured query language 结构化查询语言

1.DDL 数据定义语言

创建数据库 创建表 创建视图 修改数据库 删除数据库 修改表 删除表

create----创建 alter---修改 drop--删除

2.DML数据操作语言

操作数据 插入数据(insert) 修改数据update 删除数据delete

3.DCL数据控制语言(很少用,一般在代码中写)

if-else while

4.DQL 数据查询语言

从表中查询数据select

一.sql语法:

1.1 SQL语句总是以关键字开始,如SELECT、INSERT、UPDATE、DELETE、DROP、CREATE。

1.2 SQL语句以分号结尾。

1.3 SQL不区分大小写,意味着update与UPDATE相同。

SELECT - 从数据库中提取数据

UPDATE - 更新数据库中的数据

DELETE - 从数据库中删除数据

INSERT INTO - 向数据库中插入新数据

CREATE DATABASE - 创建新数据库

ALTER DATABASE - 修改数据库

CREATE TABLE - 创建新表

ALTER TABLE - 变更(改变)数据库表

DROP TABLE - 删除表

CREATE INDEX - 创建索引(搜索键)

DROP INDEX - 删除索引

一.数据库

开启mysql服务(cmd: 以管理员身份运行):net start mysql

连接数据库:mysql -u root -p 或者 mysql -uroot -proot

数据库的创建

基础写法:create database +数据库名称;如:create database esl_factory;(分号必须要加)

正常写法: character set +编码 collate +校对规则;

显示创建的数据库列表: show databases; (分号必须要加)

切换数据库:use+数据库名称;

查询数据库的创建信息:show create database+数据库名称;

查询当前正在使用的数据库: select database();

删除数据库:drop database +数据库名称;

修改数据库:alter database +数据库名称+character set 'gbk' collate +'校对规则';(数据库名称不能改,只能改编码和校对规则);

二.表结构

创建表:

create table +表名称(

字段1 类型(长度) 约束,

字段2 类型(长度) 约束

);

注意:1.字段之间使用逗号,最后一个字段不能使用逗号

2.如果是字符串数据的类型,长度必须是指定的。

3.int类型的默认长度是11。

创建一张表结构:

create table employee(

id int,

name varchar(30),

birthday date,

entry_date date,

job varchar(50),

salary double,

resume text

);

一.数据库的数据类型:

1.字符串型(常用)

varchar长度是可变的,可节省空间。

char 长度是不可变的。长度不够时使用空格补全。

2.大数据类型(不常用)

BLOB (字节) TEXT (字符文本)

3.数例型(常用):

INT BIGINT FLOAT DOUBLE

3.逻辑型(不常用)

BIT(1或0),在JAVA中是true或false;

4.日期型(常用)

DATE --- 只包含日期(年月日)

TIME --- 只包含时间(时分秒)

DATETIME ---包含日期和时间 ,传入空值时,显示空

TIMESTAMP ---包含日期和时间,传入空值时,默认当前系统的时间;

二.表约束

约束的好处:保证数据的完整性。

主键约束:代表记录的唯一标识。

主键约束:primary key 通过该关键字声明某一列为主键。

PRIMARY KEY 约束唯一标识数据库表中的每条记录。

主键必须包含唯一的值。

主键列不能包含 NULL 值。

每个表都应该有一个主键,并且每个表只能有一个主键。

被引用(和外键一起来使用)

唯一约束(unique) 值就不能相同

每个表可以有多个 UNIQUE 约束,但是每个表只能有一个 PRIMARY KEY 约束。

非空约束(not null) 值也不能为空

索引约束:快速创建检索数据

default约束:默认值

DEFAULT 约束用于向列中插入默认值。如果没有规定其他的值,那么会将默认值添加到所有的新记录。

外键约束:一个表中的 FOREIGN KEY 指向另一个表中的 PRIMARY KEY。

check约束:

三.操作表

删除表:drop table +表名

查看标签:

show tables -----查看当前数据库中所有的字段

desc + 表名 -----查询表的信息

sow create table +表名 -----查看表的创建的信息

四.操作表结构:

1.添加一个新字段

alter table +表名称 +add +字段名称 +数据类型(长度) 约束;

2.修改字段的数据类型,长度或者约束

alter table 表名称 modify 字段名称 数据类型(长度) 约束;

3.删除某一个字段

alter table 表名称 drop 字段名称;

4.修改字段的名称

alter table 表名称 change 旧字段 新字段 数据类型(长度) 约束;

5.修改表的名称

rename table 旧表名 to 新表名;

五.向表中添加数据

1.添加数据,使用insert关键字来添加数据

insert into 表 (字段1,字段2,字段3) values (值1,值2,值3)

或者 insert into 表 values (值1,值2,值3)

注意事项:插入的数据与字段数据的类型相同;数据的大小 应该在规定的范围内,数据中的列的位置和字段位置是相同的;字符串和日期类型的数据,必须要使用单引号括起来。

如:insert into user_info (username,job,entry_date,age) values ('chenxiaoyun','teacher','2019-10-11',20);

六.解决中文乱码问题

插入中文,会产生乱码问题;

修改MYSQL客户端的编码即可;

1.停止MYSQL服务器;

2.找到MYSQL安装路径,找到my.ini的配置文件;

3.修改客户端的编码,改成GBK;

client

port=3306

mysql

default-character-set=gbk

4.重启MYSQL服务;

七.修改数据的sql语句

update 表名称 set 字段1=值1,字段2=值2 where 条件;

如果没有where,默认选择所有记录,如果有where,修改符合条件的记录。

1.所有员工薪水修改为5000元: update user set salary=5000;

2.将姓名为'熊大'的员工修改为2000:update user set salary=2000 whre username='熊大';

3.将姓名为'熊二'的员工薪水改为4000,job改为'保洁':update user set salary=4000,job='保洁' where username='熊二';

4.将小明的薪水在原来基础上加300:update user set salary=salary+300 where username='小明';

八.删除数据的sql语句。

1.删除语句:delete from 表 where 条件;

例:delete from user where username="Allen";

2.删除所有的数据

2.1 delete from 表;

一行一行的数据;支持事务的操作。

start transaction;

delete from user where username="Allen";

rollback;

(Allen被删除后,回滚恢复)

2.2.truncate 表: 先把整个表删除,再创建一个与原来一样的空数据的表。

truncate user;

九.查询语句(重点)

1.select * from 表;(检索所有列)

2.select 字段1,字段2 from 表;(检索多列,逗号隔开)

select 字段1 from 表(检索单列)

3.distinct 去掉重复的关键字 select distinct name from user;

4.limit限制返回的数量

SELECT prod_name from products limit 5;

limit 3,4代表从第3行开始的4行,limit5代表从第0行开始的5行,0省略。

5.可以对查询的列进行运算;

查询语句可以使用as作关键字起别名(alias),as常被省略;列名和表名均可起别名。

练习

select * from stu;

select username,role from user;

select distinct english from user;

select username,math+10,english+10,chinese+10 from stu;

select username,(math+english+chinese) as t from stu;

select * from stu where username="chenchen";

select username,english from stu where english > 90;

select uername,(math+english+chinese) from stu where (math+english+chinese) > 150;

十.查询语句(where子句)

select 字段1,字段2 | * from 表 where 条件的过滤; WHERE 子句用于过滤记录。

WHERE 子句用于提取满足指定标准的记录。

where 子句后可以使用的运算符有: > < >= <= = <> (不等于) in(代表的范围),like,between,

like运算符-----模糊查询

与like一起使用的通配符(%表示一个或多个字符,代表单个字符)
select * from stu where username like '张
'; (_占位符,代表一个位置,结果可以是张飞,但不不能是张翼德);

select * from stu where username like '张%';(%占位符,可以代表多个位置,结果是张开始的,张飞,张三四);

select * from stu where username like '%张';(以张结尾的,李张);

select * from stu where username like '%张%';(username中有带张字的);

and ----与

or -----或

not ----非

between ...... and 在......之间(值可以是数字,文本或日期)

SELECT * FROM Orders WHERE OrderDate BETWEEN #07/04/1996# AND #07/09/1996#;

IN指定条件范围 (功能与or相同)

select prod_name from where price in(1002,1003)查询价格是1002或者1003的商品名称。

select prod_name from products where id not in (1002,1003);

SQL 中,NULL 用于表示缺失的值。数据表中的 NULL 值表示该值所处的字段为空。使用IS NULL来查找空值

SELECT column_names FROM table_name WHERE column_name IS NULL;

SELECT column_names FROM table_name WHERE column_name IS NOT NULL;

练习:

select username,english from stu where english >= 60 and english <=90;

相当于select username,english from stu where english between 60 and 90;

select username,english from stu where english in (60,70,80);

MySQL 的 WHERE 子句的字符串比较是不区分大小写的。

你可以使用 BINARY 关键字来设定 WHERE 子句的字符串比较是区分大小写的。

SELECT * from runoob_tbl WHERE BINARY runoob_author='RUNOOB.COM';

select prod_name from products where prod_price IS MULL

十一.查询语句(order by对结果进行排序)

order by 字段 asc | desc; (asc 代表升序,desc代表降序); order by 放在select 语句末尾。

select username,math from stu order by math desc;(对数学成绩排序后输出);

select username,(math+english+chinese) as t from stu order by t desc;

select * from stu order by english desc,math desc; (按照英语降序排,英语相同的按照数学降序排);

select * from stu where username like '陈%';

十二.聚集函数(Aggregate function)基于一组数据进行计算,返回一个输出结果

聚集函数:excel表格:求数量,求和,平均值,最大值,最小值;

聚焦函数操作的都是某一列的数据。

1.求数量:count()

select count(*) from stu where (math+english+chinese) > 220;(统计总分大于220的人数有多少?)

select count(distinct sno) from sc; //从sc中求数量,去重sno相同的内容。

2.求某一列数据的和:sum(),sum只对数值类型起作用;

select sum(math),sum(chinese),sum(english) from stu;

select sum(math+chinese+english) from stu;

3.求平均分avg()

select avg(chinese) from stu;

4.max()---最大值;

5.min()---最小值;

十三.标量函数(Scalar function)针对每个输入参数,返回一个输出结果

1.UPPER()或者UCASE()----转换成大写字母

2.LOWER()或者LCASE()---转换成小写字母

select upper(sno) from student;

select upper(sno) from student;

3.MID(column_name,start,length); //column_name和start必填。start不从0开始,从1开始,length可选。

MID() 函数用于从文本字段中提取字符。

select mid(sname,1,2) from student;

4.LENGTH() 函数返回文本字段中值的长度。

5.ROUND() 函数用于把数值字段舍入为指定的小数位数。

SELECT ROUND(column_name,decimals) FROM table_name; //column_name必填,decimals必填(小数位)

6.SELECT NOW() FROM table_name; //NOW() 函数返回当前系统的日期和时间。

7.FORMAT() 函数用于对字段的显示进行格式化。

SELECT FORMAT(column_name,format) FROM table_name; //column_name必填,format必填,格式

SELECT FORMAT(100.3111,0);//取整,得出:100

8.DATA_FORMAT() //日期格式化

select DATE_FORMAT(NOW(),'%Y-%m-%d') from sc; //date_format用于日期格式化

9.SQRT() // 函数用于计算得出任何数值的平方根。

10.RAND 函数,用于产生 0 至 1 之间的随机数

11.CONCAT 函数用于将两个字符串连接为一个字符串;

select concat(column1,column2,column3) from student;

12.REPLACE()字符串替换函数

replace(original-string,search-string,replace-string) original-string: 被搜索的字符串。可为任意长度 。search-string: 要搜索并被 replace-string 替换的字符串。replace-string: 该字符串用于替换 search-string

select replace(title,'陈小芸','金瑜辉');

13.TRIM()函数去除字符串头尾空格,ltrim去掉左边空格,rtrim去掉右边空格。

select trim(tname) from student;

十四.查询语句(分组查询group by)使用关键字group by ** 根据字段进行分组。

select * from orders group by product; 按照商品归类查询

select product,sum(price) from orders group by product having sum(price) > 100; 查询总共有几类商品,并且每类商品总价大于100的商品

select product,sum(price) from orders where price > 40 group by product having sum(price) > 100; 查询购买了几类商品,并且商品的价格大于40,每类总价大于100的商品

注意:使用where的条件,如果有分组,where的条件是分组之前的条件;

新的关键字,having关键字(子句)进行分组的条件过滤;

在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与 Aggregate 函数一起使用。

HAVING子句已添加到SQL中,因为WHERE关键字不能用于聚合函数。

//where后面不能使用聚合函数,having可以使用聚合函数。

十四.单表约束

1.主键约束(非空,唯一,作为一条记录的标识被引用),声明主键用primary key,主键可以用auto_increment自增长,自增长只能使用int和bigint类型。开发中,主键基本上是必须要设置的。

2.唯一约束,使用关键字unique;

3.非空约束not null;

create table person(

id int primary key auto_increment,

username varchar(30) unique,

email varchar(30) not null

);

外键约束

目的是保证表结构中的数据完整性。

create table emp(

id int primary key auto_increment,

name varchar(30),

salary double,

dno int,

foreign key(dno) references esl_factory(id);

);

十五.一对多表结构设计

表结构设计常用方式:一对一,一对多,多对多;

一对一(很少用),两张表主键一致;

一对多(最常用)

两张表,主表(一方),从表(多方)

比如下部门表和员工表中,一个部门下有多个员工,每个员工只属于一个部门。那么部门是一方,员工是多方。

建表原则:在多方表中添加字段,把该字段作为外键,指向一方表的主键。

多对多(较常用)

场景:用户与角色,一个用户有多个角色,一个角色被多个用户所拥有。

建表原则:多对多拆分成2个一对多场景,创建一张中间表,存储数据关系。

十六.多表查询之内链接

笛卡尔积

内连接:

1.普通内链接:......inner join ......on 条件

select * from dept inner join emp on did=dno;

2.隐式内链接

语法:select ...... from 表1,表2 where 表1.字段1=表2.字段2;

语句:select * from dept,emp where dept.did=emp.dno;

别名:select * from dept d,emp e where d.did=e.dno;

指定字段:select d.dname,e.ename,e.sal from dept d,emp e where did=e.dno;

十七.多表查询之外链接

左外链接:使用关键字select * from 表1 left outer join 表2 on 条件;

outer关键字可以省略不写;

select * from dept left outer join emp on dept.did=emp.dno;

右外链接:select * from 表1 right outer join 表2 on 条件;

select * from dept right outer join emp on dept.did=emp.dno;

内连接查询的是2张表交集数据,主外键关联的数据。

左外连接查询的是左表中所有的数据和2张表主外键关联的数据。

右外连接查询的是右表中所有的数据和2张表主外键关联的数据。

十八.子查询:把查询语句的结果作为另一条查询语句的条件。

select username,english from stu where english > (select avg(english) from stu);

相关推荐
哈基米喜欢哈哈哈1 小时前
Uber的MySQL实践(一)——学习笔记
数据库·笔记·后端·mysql
哥哥还在IT中2 小时前
MVCC 实现之探析
数据库·mysql·tidb
野蛮人6号4 小时前
MySQL笔记
数据库·笔记·mysql
苹果醋35 小时前
Deep Dive React 4 How does React State actually work
java·运维·spring boot·mysql·nginx
Ai财富密码5 小时前
【Python爬虫】正则表达式入门及在数据提取中的高效应用
数据库·mysql·php
tq10867 小时前
MySQL definer does not exist 问题分析
mysql
叁沐9 小时前
MySQL 25 MySQL是怎么保证高可用的?
mysql
惊骇世俗王某人15 小时前
MySQL数据库索引及底层数据结构
数据结构·数据库·mysql
神仙别闹1 天前
基于Python+Vue+Mysql实现(物联网)智能大棚
vue.js·物联网·mysql
花途Jasmine1 天前
MySQL中的DDL(一)
数据库·mysql