MySQL(概述,数据类型,DDL,DML,DCL,DQL)

1.概述

(1)概念

数据库就是数据存储的仓库,用于存储和管理数据。

(2)常见的数据库产品
  • Oracle:oracle公司 大型的关系型数据库 6.0 收费的
  • DB2:IBM公司 大型的关系型数据库 收费的
  • Mysql:mysql公司 中小型关系型数据库 免费的。后来被oracle收购,mysql6之后收费(社区版,旗舰版)
  • Sql Server:微软公司 中小型关系型数据库 收费的
  • Sqllite:安卓系统内置数据库 微型关系型数据库 免费的
  • NoSql系列数据库:not only sql 非关系型数据库 比如用 键值存储数据这种数据库 类似JSON
关系数据库:由行和列组成的这种二维表。
2.数据类型
(1)数值类型
类型 大小 范围(有符号) 范围(无符号) 用途
tinyint 1 字节 (-128,127) (0,255) 小整数值
int 4 字节 (- 2 31 2^{31} 231, 2 31 2^{31} 231-1) 2 32 2^{32} 232-1) 大整数值
bigint 8 字节 (- 2 63 2^{63} 263, 2 63 2^{63} 263-1) 2 64 2^{64} 264-1) 极大整数值
float 4 字节 (- 2 127 2^{127} 2127, 2 127 2^{127} 2127-1) 2 128 2^{128} 2128-1) 单精度浮点数值
double 8 字节 (- 2 1023 2^{1023} 21023, 2 1023 2^{1023} 21023-1) 2 1024 2^{1024} 21024-1) 双精度浮点数值
(2)日期和时间类型
类型 大小 范围 格式 用途
data 3 1000-01-01/9999-12-31 YYYY-MM-DD 日期值
time 3 ‘-838:59:59’/‘838:59:59’ HH:MM:ss 时间值或持续时间
year 1 1901/2155 YYYY 年份值
datatime 8 1000-01-01 00:00:00/9999-12-31 23:59:59 YYYY-MM-DD HH:MM:SS 日期和时间
timestamp 4 1970-01-01 00:00:00/2038 YYYYMMDD HHMMSS 时间戳
(3)字符串类型
类型 大小 用途
char 0-255字节 定长字符串
varchar 0-65535字节 变长字符串
text 0-65535字节 长文本数据
注意:char和varchar的区别
  • 1.定义一个char[10]和varchar[10],如果存进去的是‘abcd’,那么char所占的长度依然为10,除了字符‘abcd’外,后面跟六个空格,而varchar就立马把长度变为4了,取数据的时候,char类型的要用trim()去掉多余的空格,而varchar是不需要的,
  • 2.char的存储方式是,对英文字符(ASCII)占用1个字节,对一个汉字占用两个字节;而varchar的存储方式是,对每个英文字符占用2个字节,汉字也占用2个字节,两者的存储数据都非unicode的字符数据。
  • 3.varchar比char节省空间,在效率上比char会稍微差一些,即要想获得效率,就必须牺牲一定的空间,这也就是我们在数据库设计上常说的‘以空间换效率’。
    varchar虽然比char节省空间,但是如果一个varchar列经常被修改,而且每次被修改的数据的长度不同,这会引起‘行迁移’(Row Migration)现象,而这造成多余的I/O,是数据库设计和调整中要尽力避免的,在这种情况下用char代替varchar会更好一些。

3.SQL结构化查询语言

通过sql语言可以操作所有的关系型数据库,因为每种数据库之间sql语句存在差异,这种差异就被称为“方言”。

(1)DDL(Data Definition Language)用来定义数据库的库,表,列等。
create database 数据库名称;-- 创建数据库
drop database 数据库名称;--删除数据库
show database;-- 查询所有数据库的名称
create table 表名( -- 创建表
       列名 类型,
       列名 类型
);
drop table 表名;-- 删除表
alter table 表名 add (列名 类型);-- 添加列
alter table 表名 modify 列名 类型;-- 修改列的类型
alter table 表名 change 原列名 新列名 类型;-- 修改列名
alter table 表名 drop 列名;-- 删除列
show tables;-- 查询该数据库下所有表名称
desc 表名; -- 查询表结构
(2)DML(Data Manipulation Language)用来定义数据库记录(增、删、改)
insert into 表名(列名,列名) values (,);-- 向表中添加数据
insert into 表名 values(,);-- 当给表中所有列都需要添加数据时 可以省略列名
delete from 表名 where 条件;-- 根据条件删除列
update 表名 set 列名=where 条件;-- 根据条件修改列

案例演示

CREATE TABLE MyTest(
      id INT,
      username CHAR(3),
      sex CHAR(2),
      age INT
);
INSERT INTO MyTest VALUES(1,"张三","男",19);
INSERT INTO MyTest(id,username,sex) VALUES(2,"王老五","女");
INSERT INTO MyTest VALUES(3,"李四","男",28);
UPDATE MyTest SET age=20 WHERE age=19; 
DELETE FROM mytest WHERE age IS NULL; -- 不区分大小写
(3)DCL(Data Control Language)用来定义访问权限和安全级别;

MySQL数据库权限问题:root拥有所有权限(可以干任何事情),我们可以分配权限账户。

-- 数据库中所有分配的账户信息都在mysql数据库中的user表中存储
-- 修改密码
 UPDATE USER SET PASSWORD=PASSWORD('123456') WHERE USER='root';

分配权限账户

-- 语法
 GRANT 权限 ON 数据库名.某张表名 TO '用户名'@'localhost' IDENTIFIED BY '123456';
(4)DQL(Data Query Language)用来查询记录(数据)。

语法

select 要查询的列 from 表名 where 条件 

条件:where字句

=!=<>(不等于)<<=>>=
BETWEENAND 在什么范围之间
IN(set)
IS NULL 为空
IS NOT NULL不为空
AND 并且
OR  或者
NOT

案例演示

CREATE TABLE emp(
	empno		INT,
	ename		VARCHAR(50),
	job		VARCHAR(50),
	mgr		INT,
	hiredate	DATE,
	sal		DECIMAL(7,2),
	comm		DECIMAL(7,2),
	deptno		INT
) ;
INSERT INTO emp VALUES(7369,'SMITH','CLERK',7902,'1980-12-17',800,NULL,20);
INSERT INTO emp VALUES(7499,'ALLEN','SALESMAN',7698,'1981-02-20',1600,300,30);
INSERT INTO emp VALUES(7521,'WARD','SALESMAN',7698,'1981-02-22',1250,500,30);
INSERT INTO emp VALUES(7566,'JONES','MANAGER',7839,'1981-04-02',2975,NULL,20);
INSERT INTO emp VALUES(7654,'MARTIN','SALESMAN',7698,'1981-09-28',1250,1400,30);
INSERT INTO emp VALUES(7698,'BLAKE','MANAGER',7839,'1981-05-01',2850,NULL,30);
INSERT INTO emp VALUES(7782,'CLARK','MANAGER',7839,'1981-06-09',2450,NULL,10);
INSERT INTO emp VALUES(7788,'SCOTT','ANALYST',7566,'1987-04-19',3000,NULL,20);
INSERT INTO emp VALUES(7839,'KING','PRESIDENT',NULL,'1981-11-17',5000,NULL,10);
-- 查询奖金不为null所有人的信息
SELECT *FROM emp WHERE comm IS NOT NULL;
-- 查询工资在2000到3000之间的员工编号和姓名
SELECT empno AS 编号,ename AS 姓名 FROM emp WHERE sal BETWEEN 2000 AND 3000;-- as可以给字段起个别名
-- 查询部门编号是10或20的员工
SELECT *FROM emp WHERE deptno IN(10,20);-- 用or也可以
-- 字段也可以进行计算 查询员工的年薪,编号,姓名
SELECT empno,ename,sal*12 FROM emp;
字段计算
  • 如果某个字段的值是null,我们进行运算时需要将null当做0来处理,就可以使用 ifnull(字段名,0)来处理。
  • distinct 可以对查询结果进行去重
-- 字段也可以进行计算 查询员工的年薪,编号,姓名
SELECT empno,ename,sal*12 FROM emp;
-- 查询员工的年薪(包含奖金)
SELECT empno,ename,sal*12+comm FROM emp;-- 我们发现null值参与运算时的结果还是 null
-- 如果奖金是null值 我们想要当0来处理 ifnull()
SELECT empno,ename,sal*12+IFNULL(comm,0) FROM emp;
-- 去重
SELECT DISTINCT deptno FROM emp ;
模糊查询like

模糊查询使用的通配符

  • _匹配单个任意字符
  • %匹配多个任意字符
    案例演示
-- 查询姓名中包含A的人
SELECT *FROM emp WHERE ename LIKE '%A%';
-- 查询姓名是A开头的人
SELECT *FROM emp WHERE ename LIKE 'A%';-- 啥结尾就是 '%字符'
-- 查询第二个字符是M并且工作名是5个字符组成的
SELECT *FROM emp WHERE ename LIKE '_M%'AND job LIKE '_____';
排序
  • order by 字段名 asc 升序
  • order by 字段名 desc 降序
    案例演示
-- 查询所有员工信息 工资按升序排列
SELECT *FROM emp ORDER BY sal ASC;
-- 查询所有员工信息 工资按降序排列
SELECT *FROM emp ORDER BY sal DESC;
-- 工资按升序排列 奖金按降序排列
SELECT *FROM emp ORDER BY sal ASC,comm DESC;
聚合函数
  • count():计数
  • max()和min():最大值,最小值
  • avg():平均值
  • sum():求和

注意:
count(*)是对所有的列进行计算。
count(列名)null值是不参与计算的。

案例演示

-- 查询有奖金的人的总数
SELECT COUNT(comm) FROM emp;-- 3
SELECT COUNT(*) FROM emp;-- 9
-- 查询工资最高
SELECT MAX(sal) FROM emp;
-- 工资的平均值
SELECT AVG(sal) FROM emp;
-- 工资的总和
SELECT SUM(sal) FROM emp;

你可能感兴趣的:(数据库,mysql)