常见数据库
常见数据库
- Oracle
所属公司为Oracle,运行稳定,可移植性高,功能齐全,性能超群!适用于大型企业领域,但是价格昂贵。 - DB2
所属公司为IBM,速度快、可靠性好,适于海量数据,恢复性极强。适用于大中型企业领域,但是价格昂贵。 - SQL Server
所属公司为微软,全面,效率高,界面友好,操作容易,但是不跨平台。适用于中小型企业领域。 - MySql
所属公司为Oracle,开源,体积小,速度快。适用于中小型企业领域。
sql语言
SQL语言包含六个部分:
- DDL 数据定义语言
动词包括CREATE,DROP
,常用于创建,删除数据库表,为表加入索引等。 - DML 数据操作语言
也称动作查询语言,包括INSERT,UPDATE,DELETE
- DQL 数据查询语言
常用关键字SELECT,WHERE,HAVING,ORDER BY,GROUP BY
- DCL 数据控制语言
他的语句通过GRANT,REVOKE,获取许可,确定每个用户对数据库对象的访问 - TPL 事务处理语言
他的语句能够保证被DML影响的表的所有行能及时的更新,TPL语句包括BEGIN TRANSACTION,COMMIT和ROLLBACK。 - CCL 指针控制语句
用于对一个或者多个表单独控制,目前不明白。
数据库相关操作
配置文件
my.cnf
是MySql的配置文件
命令行操作
- 登陆:
mysql -uroot -p
- 版本号:
mysql -version
- 登陆的同时打开指定数据库:
mysql -uroot -p -D db_name
- 退出:
exit/quit
- 取消当前命令的执行:
c
常用命令
- SELECT USER():得到登陆的用户
- SELECT VERSION():得到当前数据库的版本号
- SELECT NOW():得到当前系统时间
- SELECT DATABASE():得到当前数据库
数据库相关操作
- 创建数据库
CREATE DATABASE db_name
,检查是否存在,如果不存在则创建数据库CREATE DATABASE [IF NOT EXISTS] db_name
- 查看所有的数据库
SHOW DATABASES; - 查看数据库中所有的表
SHOW TABLES; - 打开指定的数据库
USE db_name; - 删除指定的数据库
DROP DATABASE db_name;,如果存在 指定数据库则删除 DROP DATABASE [IF EXISTS] db_name;
表相关操作
-
查看所有的表
SHOW TABLES; -
创建一个表
CREATE TABLE N(
ID INT,
NAME VARCHAR(20),
PRIMARY KEY(ID)
); -
将查到的复制到新的表中
CREATE TABLE M SELECT * FROM M; -
创建一个临时的表,这个表将在连接mysql时存在,当断开连接时,mysql将自动删除这个表,也可以手动删除。
CREATE TEMPORARY TABLE L (ID,INT); -
删除一个存在的表
DROP TABLE IF EXISTS M; -
更改存在表的名称。
ALTER TABLE N RENAME M;
RENMAE TABLE N TO M; -
查看表结构
DESC N; -
查看表的创建语句
SHOW CREATE TABLE N;
更改表结构
- 添加字段
ALTER TABLE N ADD age VARCHAR(2); - 删除字段
ALTER TABLE N DROP AGE; - 更改字段属性
ALTER TABLE N CHANGE AGE a INT; - 增加数据
INSERT INTO N VALUES(...);
INSERT INTO SELECT * FROM N; - 删除数据
DELETE FROM N WHERE ID = 1; - 更改数据
UPDATE N SET NAME = "adsfasdf" WHERE ID = 2; - 数据查找
SELECT * FROM N WHERE ID = 1; - 数据排序
SELECT * FROM N ORDER BY NMAE,ID DESC;
键
- 添加主键
ALTER TABLE N ADD PRIMARY KEY(ID); - 删除主键
ALTER TABLE N DROP PRIMARY KEY; - 添加外键
ALTER TABLE N ADD FOREIGN KEY (ID) REFERENCES N(ID); - 删除外键
ALTER TABLE m DROP FOREIGN KEYfk_id
; - 修改外键
ALTER TABLE m DROP FOREIGN KEYfk_id
, ADD CONSTRAINT fk_id2 FOREIGN KEY (id) REFERENCES n(id); # 删除之后从新建 - 添加唯一键
ALTER TABLE n ADD UNIQUE (name);
ALTER TABLE n ADD UNIQUE u_name (name); - 添加索引
ALTER TABLE n ADD INDEX (age);
ALTER TABLE n ADD INDEX i_age (age); - 删除索引或唯一键
DROP INDEX u_name ON n;
DROP INDEX i_age ON n;
视图
- 创建视图
CREATE VIEW v AS SELECT id, name FROM n;
CREATE VIEW v(id, name) AS SELECT id, name FROM n; - 查看视图
SELECT * FROM v; - 删除视图
DROP VIEW IF EXISTS v;
连接
- 内连接
隐式内连接:
select first_name, last_name, order_date, order_amount
from customers, orders
where customers.customer_id = orders.customer_id
显示内连接:
select first_name, last_name, order_date, order_amount
from customers c
inner join orders o
on c.customer_id = o.customer_id
- 左外联接
select first_name, last_name, order_date, order_amount
from customers c
left join orders o
on c.customer_id = o.customer_id
- 右外连接
select first_name, last_name, order_date, order_amount
from customers c
right join orders o
on c.customer_id = o.customer_id
SQL函数
# 聚合函数
SELECT count(id) AS total FROM n; # 总数
SELECT sum(age) AS all_age FROM n; # 总和
SELECT avg(age) AS all_age FROM n; # 平均值
SELECT max(age) AS all_age FROM n; # 最大值
SELECT min(age) AS all_age FROM n; # 最小值
# 数学函数
SELECT abs(-5); # 绝对值
SELECT bin(15), oct(15), hex(15); # 二进制,八进制,十六进制
SELECT pi(); # 圆周率3.141593
SELECT ceil(5.5); # 大于x的最小整数值6
SELECT floor(5.5); # 小于x的最大整数值5
SELECT greatest(3,1,4,1,5,9,2,6); # 返回集合中最大的值9
SELECT least(3,1,4,1,5,9,2,6); # 返回集合中最小的值1
SELECT mod(5,3); # 余数2
SELECT rand(); # 返回0到1内的随机值,每次不一样
SELECT rand(5); # 提供一个参数(种子)使RAND()随机数生成器生成一个指定的值。
SELECT round(1415.1415); # 四舍五入1415
SELECT round(1415.1415, 3); # 四舍五入三位数1415.142
SELECT round(1415.1415, -1); # 四舍五入整数位数1420
SELECT truncate(1415.1415, 3); # 截短为3位小数1415.141
SELECT truncate(1415.1415, -1); # 截短为-1位小数1410
SELECT sign(-5); # 符号的值负数-1
SELECT sign(5); # 符号的值正数1
SELECT sqrt(9); # 平方根3
SELECT sqrt(9); # 平方根3
# 字符串函数
SELECT concat('a', 'p', 'p', 'le'); # 连接字符串-apple
SELECT concat_ws(',', 'a', 'p', 'p', 'le'); # 连接用','分割字符串-a,p,p,le
SELECT insert('chinese', 3, 2, 'IN'); # 将字符串'chinese'从3位置开始的2个字符替换为'IN'-chINese
SELECT left('chinese', 4); # 返回字符串'chinese'左边的4个字符-chin
SELECT right('chinese', 3); # 返回字符串'chinese'右边的3个字符-ese
SELECT substring('chinese', 3); # 返回字符串'chinese'第三个字符之后的子字符串-inese
SELECT substring('chinese', -3); # 返回字符串'chinese'倒数第三个字符之后的子字符串-ese
SELECT substring('chinese', 3, 2); # 返回字符串'chinese'第三个字符之后的两个字符-in
SELECT trim(' chinese '); # 切割字符串' chinese '两边的空字符-'chinese'
SELECT ltrim(' chinese '); # 切割字符串' chinese '两边的空字符-'chinese '
SELECT rtrim(' chinese '); # 切割字符串' chinese '两边的空字符-' chinese'
SELECT repeat('boy', 3); # 重复字符'boy'三次-'boyboyboy'
SELECT reverse('chinese'); # 反向排序-'esenihc'
SELECT length('chinese'); # 返回字符串的长度-7
SELECT upper('chINese'), lower('chINese'); # 大写小写 CHINESE chinese
SELECT ucase('chINese'), lcase('chINese'); # 大写小写 CHINESE chinese
SELECT position('i' IN 'chinese'); # 返回'i'在'chinese'的第一个位置-3
SELECT position('e' IN 'chinese'); # 返回'i'在'chinese'的第一个位置-5
SELECT strcmp('abc', 'abd'); # 比较字符串,第一个参数小于第二个返回负数- -1
SELECT strcmp('abc', 'abb'); # 比较字符串,第一个参数大于第二个返回正数- 1
# 时间函数
SELECT current_date, current_time, now(); # 2018-01-13 12:33:43 2018-01-13 12:33:43
SELECT hour(current_time), minute(current_time), second(current_time); # 12 31 34
SELECT year(current_date), month(current_date), week(current_date); # 2018 1 1
SELECT quarter(current_date); # 1
SELECT monthname(current_date), dayname(current_date); # January Saturday
SELECT dayofweek(current_date), dayofmonth(current_date), dayofyear(current_date); # 7 13 13
# 控制流函数
SELECT if(3>2, 't', 'f'), if(3<2, 't', 'f'); # t f
SELECT ifnull(NULL, 't'), ifnull(2, 't'); # t 2
SELECT isnull(1), isnull(1/0); # 0 1 是null返回1,不是null返回0
SELECT nullif('a', 'a'), nullif('a', 'b'); # null a 参数相同或成立返回null,不同或不成立则返回第一个参数
SELECT CASE 2
WHEN 1 THEN 'first'
WHEN 2 THEN 'second'
WHEN 3 THEN 'third'
ELSE 'other'
END ; # second
# 系统信息函数
SELECT database(); # 当前数据库名-test
SELECT connection_id(); # 当前用户id-306
SELECT user(); # 当前用户-root@localhost
SELECT version(); # 当前mysql版本
SELECT found_rows(); # 返回上次查询的检索行数
用户相关
# 增加用户
CREATE USER 'test'@'localhost' IDENTIFIED BY 'test';
INSERT INTO mysql.user(Host, User, Password) VALUES ('localhost', 'test', Password('test')); # 在用户表中插入用户信息,直接操作User表不推荐
# 删除用户
DROP USER 'test'@'localhost';
DELETE FROM mysql.user WHERE User='test' AND Host='localhost';
FLUSH PRIVILEGES ;
# 更改用户密码
SET PASSWORD FOR 'test'@'localhost' = PASSWORD('test');
UPDATE mysql.user SET Password=Password('t') WHERE User='test' AND Host='localhost';
FLUSH PRIVILEGES ;
# 用户授权
GRANT ALL PRIVILEGES ON *.* TO test@localhost IDENTIFIED BY 'test';
# 授予用'test'密码登陆成功的test@localhost用户操作所有数据库的所有表的所有的权限
FLUSH PRIVILEGES ; # 刷新系统权限表,使授予权限生效
# 撤销用户授权
REVOKE DELETE ON *.* FROM 'test'@'localhost'; # 取消该用户的删除权限
存储过程
# 创建存储过程
DELIMITER // # 无参数
CREATE PROCEDURE getDates()
BEGIN
SELECT * FROM test ;
END //
CREATE PROCEDURE getDates_2(IN id INT) # in参数
BEGIN
SELECT * FROM test WHERE a = id;
END //
CREATE PROCEDURE getDates_3(OUT sum INT) # out参数
BEGIN
SET sum = (SELECT count(*) FROM test);
END //
CREATE PROCEDURE getDates_4(INOUT i INT) # inout参数
BEGIN
SET i = i + 1;
END //
DELIMITER ;
# 删除存储过程
DROP PROCEDURE IF EXISTS getDates;
# 修改存储过程的特性
ALTER PROCEDURE getDates MODIFIES SQL DATA ;
# 修改存储过程语句(删除再重建)略
# 查看存储过程
SHOW PROCEDURE STATUS LIKE 'getDates'; # 状态
SHOW CREATE PROCEDURE getDates_3; # 语句
# 调用存储过程
CALL getDates();
CALL getDates_2(1);
CALL getDates_3(@s);
SELECT @s;
SET @i = 1;
CALL getDates_4(@i);
SELECT @i; # @i = 2
数据库备份和还原
# 数据库备份
mysqldump -u root -p db_name > file.sql
mysqldump -u root -p db_name table_name > file.sql
# 数据库还原
mysql -u root -p < C:file.sql