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 小时前
基于python+django+vue的旅游网站系统
开发语言·vue.js·python·mysql·django·旅游·web3.py
SZ1701102311 小时前
麒麟银河桌面版,成功安装cuda12.6,mysql
mysql·cuda·银河麒麟
林太白2 小时前
❤Node09-用户信息token认证
数据库·后端·mysql·node.js
我爱娃哈哈2 小时前
MySQL 优化器:理解与探秘
数据库·mysql
DREAM依旧2 小时前
MySQL数据库概述与基础
mysql·database
尘浮生3 小时前
Java项目实战II基于Java+Spring Boot+MySQL的校园社团信息管理系统(源码+数据库+文档)
java·开发语言·数据库·spring boot·mysql·spring·maven
失心疯_20233 小时前
Mysql_使用简介
数据库·sql·mysql·关系型数据库·ddl·dml·mysql教程
小威要向诸佬学习呀3 小时前
MySQL中的LIMIT与ORDER BY关键字详解
数据库·mysql
用生命在耍帅ㅤ3 小时前
mysql时间戳格式化yyyy-mm-dd
sql·mysql
为暗香来4 小时前
MySQL学习(视图总结)
数据库·学习·mysql