[root@host]# mysql -u root -p
#使用root账户直接使用密码password(没错,就是和-p之间无空格),直接登录到tutorial数据库
mysql -u root -ppassword tutorial;
mysql> exit
//创建用户
CREATE USER 'r&d'@'host' IDENTIFIED BY 'mysql';
//授权
grant all privileges on tutorial.* to 'r&d'@'localhost' identified by 'xyz';
mysql -u learnersql -p
sudo service mysql start
查看状态:
sudo service mysql status
停止服务:
sudo service mysql stop
CREATE DATABASE 数据库名;
USE 数据库名;
#增加某一列
ALTER TABLE CORPORATION ADD PROFITS FLOAT;
#删除某一列
ALTER TABLE Persons DROP COLUMN DateOfBirth;
#修改某一列的属性
ALTER TABLE person MODIFY gender ENUM('M','F');
#删除数据表
DROP TABLE table_name ;
#查看数据表中的列信息
DESC Tab_name
DROP DATABASE 数据库名称;
#查看数据库中的表信息
SHOW TABLES
#CREATE TABLE table_name (column_name column_type);
CREATE TABLE Student(
ID INT NOT NULL AUTO_INCREMENT,
NAME VARCHAR(20) NOT NULL,
AGE INT NOT NULL,
//GENDER CHAR(1) CHECK (GENDER IN ('M','F'))
GENDER ENUM('M','F')//设置约束
// PRIMARY KEY (ID)
CONSTRAINT pk_Student PRIMARY KEY(ID);//设置主键
);
CREATE TABLE favorite_food
( person_id SMALLINT UNSIGNED AUTO_INCREMENT,
food VARCHAR(20),
CONSTRAINT pk_favorite_food PRIMARY KEY (person_id,food),
CONSTRAINT fk_fav_food_person_id FOREIGN KEY (person_id)
REFERENCES person (person_id)
);
#增
INSERT INTO Person (NAME,AGE) VALUES ('Liu Xijun',32);
#删
DELETE FROM Person WHERE ID=1;
#改
UPDATE Person SET age=31 WHERE ID=2;
#查
SELECT * FROM Person limit 1;
存储过程
--- 创建存储过程
create procedure procedureName()
begin
end
--- 调用存储过程
call procedureName;
--- 删除存储过程
drop procedure if exists procedureName;
按条件查询:过滤
符号或函数 | 含义 |
---|---|
_ | 正好1个字符 |
% | 任意个,包括0个 |
RIGHT(string,3)=‘xyz’ | 判断string后三个字符是否为’xyz’ |
LEFT(string,3) LIKE ‘A_B’ | 开头的三个字母是否以A开头B结尾 |
col_name REGEXP '^[AB]' |
支持正则表达式,是否以AB开头 |
CONCAT(string1,string2) | 连接两个字符串 |
两个NULL值不相等
,表达式可以为NULL,但不能=NULL
。判断条件:IS NULL
,!=6 OR IS NULL
查询防止漏查。连接(Join)
left join、right join、inner join.
集合操作
A EXCEPT B
,取A中除去与B相交的部分。处理字符串数字或临时数据的生成转换和操作
SQL本身无相关指令,都是数据库服务器本身内建函数。
类型 | 描述 | oracle情况 |
---|---|---|
CHAR | 定长字符串,CHAR(30) | 最大2000字节 |
VARCHAR | 变长字符串 | 4000字节 |
TEXT/CLOB | 大长度的变长字符串 | 128TB的文档 |
VARCHAR:超出设置的长度将报错,服务器按需分配,不会因设置最大的字符串长度而浪费资源。
SELECT @@session.sql_mode
SET sql_mode='ansi'
‘It's cool!' ---> 'It''s cool'
quote(column_name)
SELECT CHAR(65,66)//A,B
SELECT CONCAT('A',CHAR(66),'c')//ABC
SELECT ASCII('A')//65
SELECT LENGTH('ABCD');//4
SELECT POSITION('R'IN'STRING');//3,从1开始计位,Oracle中使用instr()函数
#insert
select insert('this is fine.',5,0,' story');//this story is fine.
select insert('this is fine.',5,1,',story,');//this,story,is fine.
//四个参数:原始字符串,起始位置,替换长度,要插入的字符串
# replace,mysql和oracle都支持
select replace('good world!','good','hello');//hello world!
select substring('morning',2,3);//orn,string,pos,length
数值类型的常用操作
函数名 | 描述 | 支持 |
---|---|---|
Acos(x) | 反cos | |
Asin(x) | 反sin | |
Atan(x) | 反tan | |
Cos(x) | ||
Sin(x) | ||
Tan(x) | ||
Cot(x) | 正切的倒数 | |
Exp(x) | 自然数的x次方 | |
Ln(x) | 以自然数为底x的对数 | |
Sqrt(x) | 平方根 | |
MOD(4,2) | 2,求余数 | Mysql中可对小数取余 |
POW(2,4) | 16,x的y次方 | |
—精度控制— | —精度控制— | —精度控制— |
CEIL(1.2) | 2,向上取正 | |
FLOOR(1.2) | 1,向下取正 | |
ROUND(2.5) | 3,四舍五入 | |
ROUND(2,584,2) | 2.58,小数后保留2位小数 | |
TRUNCATE(2.1234,2) | 2.12,保留2位非四舍五入 | |
ROUND和TRUNCATE | 第2个参数可为负,小数点左侧截几位 | |
SIGN(x) | 正1零0负-1 | |
ABS(x) | 绝对值 |
日期类型数据操作
//Mysql查看时区设置
select @global.time_zone, @@session.time_zone;
类型 | 默认格式 |
---|---|
Date | YYYY-MM-DD |
Datetime | YYYY-MM-DD HH:MI:SS |
Timestamp | YYYY-MM-DD HH:MI:SS |
Time | HHH:MI:SS |
>>SELECT CAST('2019-09-12' AS DATE) date_field, CAST('108:17:57' AS TIME) time_field;//将字符串转换成对应的日期类型Date,Time;
//Mysql中cast函数对数据分隔符要求宽松,/,-等都OK
>>>SELECT CAST('123499' AS UNSIGNED INTEGER);//123499
//将字符串转换为数字
//str_to_date,根据个是字符串的返回,Date\Time类型
//cast函数不支持的字符串转换成日期函数
>>>SELECT STR_TO_DATE('September 17, 2018','%M %d,%Y');
//系统内建函数返回当前日期或时间的字符串
mysql> SELECT CURRENT_DATE() date,CURRENT_TIME() time,CURRENT_TIMESTAMP timestamp;
//date_add,为指定的日期增加一段时间(如年月日),并返回新的日期
>>>SELECT DATE_ADD(CURRENT_DATE(),INTERVAL 5 DAY);
//last_day取当月最后一天
>>>select last_day('2019-10-23')//2019-10-31
//dayname函数返回日期是星期几
>>>SELECT DAYNAME('2019-10-27');//Sunday
//extract从日期字符串中提取感兴趣的时间间隔类型
>>>SELECT EXTRACT(YEAR FROM '2019-10-28 14:26:54');//2019
//获取时间间隔
>>>select datediff('2019-01-21','2019-10-27');279
聚合和分组
//对查询结果进行分组,因分组还未创建不能使用where进行筛选
select person_id from favorite_food group by person_id having count(person_id)>3;
函数 | 描述 |
---|---|
MAX() | 返回集合中的最大值 |
MIN() | 返回集合中的最小值 |
AVG | 返回集合中的平均值 |
SUM | 返回集合中所有值的和 |
COUNT | 返回集合中值的个数 |
隐式分组:包含查询的所有行
显示分组:使用聚集函数时,显示使用GROUP BY 进行分组,在分组上使用聚集函数。
只计数某个列的不同值
select count(distinct(person_id)) from favorite_food;
select avg(person_id-1) from favorite_food;
//每年级每班有多少人,班下面还可以有小组
select grade,class,sum(student_num) from students group by grade,class
//同时算出每年级每班有多少人 及每年级总共有多少人
select grade,class,sum(student_num) from students group by grade,class with rollup;
小于值集中的所有值
select * from students
where student_num >
any(
select
student_num
from students
where student_num>14);
查询
子查询总结
连接join
结果MN行 = 第1表M行x第2表N行
。条件逻辑
CASE
WHEN C1 THEN E1
WHEN C2 THEN E2
[ELSE ED]
END
CASE V0
WHEN V1 THEN E1
WHEN V2 THEN E2
[ELSE ED]
END
只能判断V1
与V0
是否相等的条件,不如查找型强大灵活事务
SET AUTOCOMMIT=0
ALTER TABLE
指令将会将当前事务提交,并启动一个新事务。SHOW TABLE STATUS LIKE TABLE_NAME \G;
--- 创建事务
START TRANSACTION;
UPDATE TABLE_NAME (COL_NAME) VALUES (VALUE1) WHERE;
-- 创建保存点
SAVEPOINT POINT_NAME1;
DELETE FROM TABLE_NAME WHERE COND;
---创建保存点
SAVEPOINT POINT_NAME2;
--- 回滚
ROLLBACK TO SAVEPOINT POINT_NAME1;
--- 提交本次事务
COMMIT;
索引
SHOW INDEX FROM TABLE_NAME \G;
ALTER TABLE TABLE_NAME ADD INDEX INDEX_NAME (COL_NAME);
ALTER TABLE TABLE_NAME ADD UNIQUE INDEX_NAME (COL_NAME);
ALTER TABLE TABLE_NAME DROP INDEX INDEX_NAME;
--- 查询优化器如何处理SQL语句
EXPLAIN SELECT * FROM TABLE_NAME WHERE COOND1 \G;
约束
主键约束
标志一列或多列,并保证其值在表中的唯一性
外键约束
限制一列或多列的值必须包含在另一个表的外键中
唯一约束
限制一列或多列的值,保证其在表内的唯一性
检查约束
限制一列的可用值范围
--- 建表时指定
CONSTRAINT PK_NAME PRIMARY KEY (COL_NAME);
--- 为已存在的表设置主键
ALTER TABLE TABLE_NAME ADD CONSTRAINT PK_NAME PRIMARY KEY (COL_NAME);
--- 删除只需要把ADD改为DROP
--- 建表时指定
CONSTRAINT FK_NAME FOREIGN KEY (COL_NAME)
REFER ENCES PRIMARY_TABLE_NAME (COL_NAME);
--- 为已存在的表设置外键
ALTER TABLE TABLE_NAME ADD
CONSTRAINT FK_NAME FOREIGN KEY (COL_NAME)
REFERENCES PRIMARY_TABLE_NAME (COL_NAME);
--- ON UPDATE CASCADE 改变主表外键的值,使用此外键的子表的值也会改变
--- ON DELETE CASCADE 级联删除,删除主表中的外键行,使用此外键的子表中的相应数据也会被删除。
--- 删除外键
ALTER TABLE TABLE_NAME
DROP FOREIGN KEY FK_NAME
视图
CREATE VIEW VIEW_NAME (
COL_NAME1,
COL_NAME2,
COL_NAME3
)
AS
SELECT
COL_NAME1,
COL_NAME2,
COL_NAME3
FROM
TABLE_NAME;
CREATE TABLE TABLE_NAME
AS
SELECT * FROM VIEW_NAME;
CREATE OR REPLACE VIEW VIEW_NAME
(COL_NAME1,
COL_NAME2)
AS ...
元数据
information_schema
数据库来提供元数据。user_tables
,all_constraints
及dba_
来提供元数据的信息检索模式对象相关的信息
。--- SET设置变量
SET @QRY = 'SELECT * FROM TABLE_NAME';
--- 将sql语句提交给数据库引擎,解析安全见和优化
PREPARE MY_DYN_SQL FROM @QRY;
--- 执行sql语句
EXECUTE MY_DYN_SQL;
--- 关闭语句,释放执行中所使用的数据库资源
DEALLOCATE PREPARE MY_DYN_SQL;