編寫應用程序不方便; 數據冗餘不可避免; 應用程序依賴性; 不支持對文件的併發訪問; 數據間聯繫弱 難以按用戶視圖表示數據; 無階段性安全控制功能。
相互關聯的數據的集合; 較少的數據冗餘; 程序與數據相互獨立; 保證數據的安全、可靠; 最大限度地保證數據的正確性; 數據能夠併發使用並能同時保證一致性。
數據庫是數據的聚集,它以必定的組織形式存在於存儲介質上 DBMS是管理數據庫的系統軟件,它實現數據庫系統的各類功能。是數據庫系統的核心 DBA: 負責數據庫的規劃、設計、協調、維護和管理等工做 應用程序指以數據庫爲基礎的應用程序;
關係:關係就是二維表。並知足以下性質: 表中的行、列次序並不在重要 行row:表中的每一行,又稱爲一條記錄(record) 列column:表中的沒一列,稱爲屬性,字段 主鍵(Primary key):用於惟一肯定一個記錄的字段 域domain:屬性的取值範圍,如,性別只能是‘男’和‘女’兩個值 外鍵(Foreign key):用於表之間的一對多的關係 惟一鍵(Uniq key):能夠爲null,
mencached redis mogoDB
MySQL: MySQL, MariaDB, Percona Server PostgreSQL: 簡稱爲pgsql,EnterpriseDB Oracle: MSSQL: DB2:
ACID: A:原子性 C:一致性 I:隔離性 D:持久性 事務未撤銷,造成的數據爲:dirt data
一類是與數據類型、內容、性質有關的對象,好比關係模型中的域、屬性和關係等; 另外一類是與數據之間聯繫有關的對象,它從數據組織層表達數據記錄與字段的結構
數據提取:在數據集合中提取感興趣的內容。SELECT 數據更新:變動數據庫中的數據。INSERT、DELETE、UPDATE
是一組完整性規則的集合: 實體(行)完整性 Entity integrity 域(列)完整性 Domain Integrity 參考完整性 Referential Integrity
設計關係數據庫時,聽從不一樣的規範要求,設計出合理的關係型數據庫,這些不一樣的規範要求被稱爲不一樣範式,各類範式呈遞次規範,越高的範式數據庫冗餘越小
第一範式(1NF)、第二範式(2NF)、第三範式(3NF)、巴德斯科範式(BCNF)、第四範式(4NF)和第五範式(5NF,又稱完美範式)。知足最低要求的範式是第一範式(1NF)。在第一範式的基礎上進一步知足更多規範要求的稱爲第二範式(2NF),其他範式以次類推。通常說來,數據庫只需知足第三範式(3NF)便可 範式 1NF:無重複的列,每一列都是不可分割的基本數據項,同一列中不能有多個值,即實體中的某個屬性不能有多個值或者不能有重複的屬性。除去同類型的字段,就是無重複的列 說明:第一範式(1NF)是對關係模式的基本要求,不知足第一範式(1NF)的數據庫就不是關係數據庫; 2NF:屬性徹底依賴於主鍵,第二範式必須先知足第一範式,要求表中的每一個行必須能夠被惟一地區分。一般爲表加上一個列,以存儲各個實例的惟一標識PK,非PK的字段須要與整個PK有直接相關性; 3NF:屬性不依賴於其它非主屬性,知足第三範式必須先知足第二範式。第三範式要求一個數據庫表中不包含已在其它表中已包含的非主關鍵字信息,非PK的字段間不能有從屬關係; 爲了性能,某些數據庫不知足範式,增長了數據庫的冗餘.
1979年:TcX公司 Monty Widenius,Unireg 1996年:發佈MySQL1.0,Solaris版本,Linux版本 1999年:MySQL AB公司,瑞典 2003年:MySQL 5.0版本,提供視圖、存儲過程等功能 2008年:Sun 收購 2009年:Oracle收購sun 2009年:Monty成立MariaDB
]#systemctl start maridb ]#mysql MariaDB [(none)]>drop database test; #刪除數據庫test; MariaDB [(none)]>use mysql; MariaDB [mysql]> status MariaDB [mysql] create database testdb; Query ok,1 row affected (0.00 sec) MariaDB [mysql]> \! ls /var/lib/mysql MariaDB [mysql]>SELECT user,password,host FROM user; ]#mysql_secure_installation #設置mysql密碼 ]mysql -uroot -p #輸入密碼 MariaDB [mysql]> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | +--------------------+ MariaDB [mysql]> SELECT user,host,password FROM user; MariaDB [mysql]> SELECT * FROM user\G; MariaDB [mysql]>quit
能夠接受輸入重定向。能夠sourcemysql
]#mysql -uroot -proot < test.sql MariaDB [(none)]> source test.sql
能夠不用加「;」結束語句正則表達式
Note that all text commands must be first on line and end with ';' ? (\?) Synonym for `help'. clear (\c) Clear the current input statement. connect (\r) Reconnect to the server. Optional arguments are db and host. delimiter (\d) Set statement delimiter. edit (\e) Edit command with $EDITOR. ego (\G) Send command to mysql server, display result vertically. exit (\q) Exit mysql. Same as quit. go (\g) Send command to mysql server. help (\h) Display this help. nopager (\n) Disable pager, print to stdout. notee (\t) Don't write into outfile. pager (\P) Set PAGER [to_pager]. Print the query results via PAGER. print (\p) Print current command. prompt (\R) Change your mysql prompt. quit (\q) Quit mysql. rehash (\#) Rebuild completion hash. source (\.) Execute an SQL script file. Takes a file name as an argument. status (\s) Get status information FROM the server. system (\!) Execute a system shell command. tee (\T) Set outfile [to_outfile]. Append everything into given outfile. use (\u) Use another database. Takes database name as argument. charset (\C) Switch to another charset. Might be needed for processing binlog with multi-byte charsets. warnings (\W) Show warnings after every statement. nowarning (\w) Don't show warnings after every statement.
]vim /etc/profile.d/mysql.sh export MYSQL_PS1="(\u@\h) [\d]> " ]#. /etc/profile.d/mysql.sh
MariaDB [(none)]> prompt \u@[\D]---> PROMPT set to '\u@[\D]--->' root@[MON Jun 4 23:08:30 2018]---> ]mysql --prompt="(\u@\h) [\d]> "
]vim /etc/my.cnf.d/mysql-clients.cnf [mysql] prompt=(\\u@\\h) [\\d]>\\_
mysql客戶端可用選項: -A, --no-auto-rehash 禁止補全 -u, --user= 用戶名,默認爲root -h, --host= 服務器主機,默認爲localhost -p, --passowrd= 用戶密碼,建議使用-p,默認爲空密碼 -P, --port= 服務器端口 -S, --socket= 指定鏈接socket文件路徑 -D, --database= 指定默認數據庫 -C, --compress 啓用壓縮 -e "SQL" 執行SQL命令 -V, --version 顯示版本 -v --verbose 顯示詳細信息 --print-defaults 獲取程序默認使用的配置 ]#mysql -e "show databases;" +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | test | +--------------------+
在數據庫系統中,SQL語句不區分大小寫(建議用大寫) 但字符串常量區分大小寫 SQL語句可單行貨多行書寫,以「;」結尾 關鍵詞不能跨多行或簡寫 用空格和縮進來提升語句的可讀性 子句一般位於獨立行,便於編輯,提升可讀性 註釋: SQL標準: /註釋內容/多行註釋 -註釋內容 單行註釋,注意有空格 MYSQL註釋:#
數據庫、表、索引、視圖、用戶、存儲過程、函數、觸發器、事件調度器等 命名規則: 必須以字母開頭 可包括數字和三個特殊字符(#_$) 不要使用MYSQL的保留字 同一database(Schema)下的對象不能同名
建立數據庫:redis
CREATE DATABASE|SCHEMA [IF NOT EXTSTS] 'DB_NAME'; CHARACTER SET 'character set name' COLLATE 'collate name'
DROP DATABASE|SCHEMA [IF EXISTS] 'DB_NAME'; 查看支持全部字符集: SHOW CHLLATION SET; 查看支持全部排序規則: SHOW COLLATION; 獲取命令使用幫助: mysql>HELP KEYORO; 查看數據庫列表: mysql>SHOW DATABASES; 例如: MariaDB [(none)]>\! ls /var/lib/mysql aria_log.00000001 aria_log_control ibdata1 ib_logfile0 ib_logfile1 mysql mysql.sock performance_schema test MariaDB [(none)]> CRAETE DATABASE DB1; MariaDB [(none)]> \! cat /var/lib/mysql/DB1/db.opt default-character-set=latin1 default-collation=latin1_swedish_ci MariaDB [(none)]> SHOW CHARACTER SET; #排序規則 MariaDB [(none)]> DROP DATABASE DB1; #刪除數據庫DB1 MariaDB [(none)]> USE DB1 Database [DB1]> SHOW TABLES; Empty set (0.00 sec)
選擇正確的數據類型對於得到高性能相當重要,三大原則:sql
更小的一般更好,儘可能使用可正確存儲數據的最小數據類型 簡單就好,簡單數據類型的操做一般須要更少的CPU週期 儘可能避免NULL,包含爲NULL的列,對MySQL更難優化
查看全部的引擎:SHOW ENGINES 查看錶:SHOW TABLES [FROM db_name] 查看錶結構:DESC [db_name.]tb_name 刪除表:DROP TABLE [IF EXTSTS] tb_name 查看錶建立命令:SHOW CREATE TABLE 'tbl_name' 查看錶狀態:SHOW TABLE STATUS LIJE 'tbl_name' 查看庫中全部表狀態:SHOW TABLE STATUS FROM db_name 修改表:不建議修改,修改清備份 MariaDB [DB1]> create table student ( id tinyint unsigned not null primary key,name char(10) not null, phone char(11),sex char(1) ); MariaDB [DB1]> desc student; MariaDB [DB1]> show table status like 'student'\G; MariaDB [DB1]> create table emp ( id int unsigned auto_increment primary key, name varchar(30) not null, sex char(1) default 'm', addresss varchar(100) ) engine=innodb default charset=utf8; Query OK, 0 rows affected (0.01 sec) MariaDB [DB1]> show create table emp\G; MariaDB [DB1]> create table user SELECT user,host,password FROM mysql.user; MariaDB [DB1]> create table user2 SELECT user,host,password FROM mysql.user where 1 = 0; MariaDB [DB1]> create table user3 like mysql.user; MariaDB [DB1]> desc user2; set 多選 enum 二選一 primary key 主鍵綁定name,city; MariaDB [DB1]> create table t1 ( name char(30),city char(30), sex char(1),primary key(name,city));
DML (Data manipulation Language,數據庫操縱語音) 用來查詢或者變動 表的記錄。DML包含如下幾種指令。 SELECT:查詢表中的數據 INSERT:向表中插入新數據 UPDATE:更新表中的數據 DELETE:刪除表中的數據
MariaDB [DB1]> insert student values(1,'bai','10086','m'); MariaDB [DB1]> insert student(id,name) values(70,wang'); MariaDB [DB1]> insert student(id,name,sex) values(2,'wang','m'),(3,lin','f'); MariaDB [DB1]> insert student set id=4,name='zhao'; MariaDB[DB1]> insert emp(name.adresss) SELECT user,host FROM user;
MariaDB [DB1]> update emp set name='admin',addresss='beijing' where id=1; MariaDB [DB1]> update emp set name='admin',addresss='beijing' where name='root' LIMIT 2;
MariaDB [DB1]> truncate table emp; MariaDB [DB1]> delete FROM emp where id=4;
]# vim /etc/my.cnf/mysql-clients.cnf [mysql] safe-updates
DDL (Data Definition Languae,數據定義語言) 用來建立或者刪除存儲 數據用的數據庫以及數據庫中的表等對象。DDL包含如下幾種指令。 CREATE:建立數據庫和表等對象 DROP:刪除數據庫和表等對象 ALTER:修改數據庫和表等對象的結構
磁盤的數據排放形式來SELECTshell
syntax:數據庫
SELECT [ALL | DISTINCT | DISTINCTROW ] [HIGH_PRIORITY] [STRAIGHT_JOIN] [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT] [SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS] SELECT_expr [, SELECT_expr ...] [FROM table_references [WHERE where_condition] [GROUP BY {col_name | expr | position} [ASC | DESC], ... [WITH ROLLUP]] [HAVING where_condition] [ORDER BY {col_name | expr | position} [ASC | DESC], ...] [LIMIT {[offset,] row_count | row_count OFFSET offset}] [PROCEDURE procedure_name(argument_list)] [INTO OUTFILE 'file_name' [CHARACTER SET charset_name] export_options | INTO DUMPFILE 'file_name' | INTO var_name [, var_name]] [FOR UPDATE | LOCK IN SHARE MODE]]
#####單表操做vim
MariaDB [DB1]> SELECT 'hello world'; +-------------+ | hello world | +-------------+ | hello world | +-------------+ MariaDB [DB1]> SELECT '1+2',1+2 ; +-----+-----+ | 1+2 | 1+2 | +-----+-----+ | 1+2 | 3 | +-----+-----+
MariaDB [DB1]> SELECT * FROM user host='localhost'; MariaDB [DB1]> SELECT * FROM student where sex is null; MariaDB [DB1]> SELECT * FROM student where id >=2 and id <=5; MariaDB [DB1]> SELECT * FROM student where sex in ('f','m'); MariaDB [DB1]> SELECT * FROM student where sex in ('f','m') or sex is null; MariaDB [DB1]> SELECT id as 編號,name 姓名 FROM student where sex in ('f','m') or sex is null; #別名
%:任意長度的任意字符 _:任意單個字符 RLIKE:正則表達式,索引失效,不建議使用 REGEXP:匹配字符串可用正則表達式書寫模式,同上 邏輯操做符: NOT: != AND: OR XOR group order by 升序:ASC 降序:DESC MariaDB [DB1]> SELECT * FROM student order by score ; MariaDB [DB1]> SELECT * FROM student order by -score desc; MariaDB [DB1]> SELECT * FROM student order by score LIMIT 3;
FOR UPDATE LOCK INSHARE MODEcentos
LEFT OUTER JOIN ringt outer join full join 多表查詢 MariaDB [hellodb]> SELECT s.name as s_name,t.name as t_name FROM students as s INNER JOIN teachers as t on s.teacherid=t.tid; MariaDB [hellodb]> SELECT s.name as s_name,t.name as t_name FROM students as s LEFT OUTER JOIN teachers as t on s.teacherid=t.tid; MariaDB [hellodb]> SELECT s.name as s_name,t.name as t_name FROM students as s RIGHT OUTER JOIN teachers as t on s.teacherid=t.tid; MariaDB [hellodb]> SELECT st.name,sc.score FROM students as st INNER JOIN scores as sc on st.stuid=sc.stuid and score > (SELECT AVG(score) FROM scores); 子查詢 MariaDB [hellodb]> SELECT st.name,sc.score FROM students as st INNER JOIN scores as sc on st.stuid=sc.stuid and score > (SELECT AVG(score) FROM scores); view 相似shell中的別名 MariaDB [hellodb]> create view_oldstu as SELECT * FROM students where age >50; MariaDB [hellodb]> SELECT * FROM view_oldstu; MariaDB [hellodb]> drop view_oldstus;
查看函數列表: SHOW FUNCTIOIN STATUS; 查看函數定義: SHOW CREATE FUNCTION function_name 刪除UDF: DROP FUNCTION funtion_NAME 調用自定義函數語法: SELECT function_name(parameter_value,...) MariaDB [db1]> DELIMITER // -> CREATE FUNCTION deleteById(uid SMALLINT UNSIGNED) RETURNS VARCHAR(20) -> BEGIN -> DELETE FROM students WHERE stuid = uid; -> RETURN (SELECT COUNT(uid) FROM students); -> END// MariaDB [db1]> DELIMITER ; MariaDB [db1]> SELECT deleteById(10) MariaDB [db1]> SELECT * FROM mysql.proc
存儲過程把常用的SQL語句或業務邏輯封裝起來,預編譯保存在數據庫中,當須要時從數據庫中直接調用,省去了編譯的過程 提升了運行速度 同時下降網絡數據傳輸量 存儲過程與自定義函數的區別: 存儲過程實現的過程要複雜一些,而函數的針對性較強 存儲過程能夠有多個返回值,而自定義函數只有一個返回值 存儲過程通常獨立的來執行,而函數每每是做爲其餘SQL語句的一部分來使用 存儲過程和函數中可使用流程控制來控制語句的執行
以下: IF:用來進行條件判斷。根據是否知足條件,執行不一樣語句 CASE:用來進行條件判斷,可實現比IF語句更復雜的條件判斷 LOOP:重複執行特定的語句,實現一個簡單的循環 LEAVE:用於跳出循環控制 ITERATE:跳出本次循環,而後直接進入下一次循環 REPEAT:有條件控制的循環語句。當知足特定條件時,就會跳出循環語句 WHILE:有條件控制的循環語句
元數據數據庫:mysql 系統受權表:db,host,user columns_priv,tables_priv,procs_priv,prixies_priv 用戶帳號: USERNAME‘@’HOST’: @’HOST’: 主機名; IP地址或Network; 通配符: %, _: 172.16.%.% MariaDB [mysql]> create user li@'192.168.36.7' identified by 'centos'; MariaDB [mysql]> RENAME USER old_user_name TO new_user_name MariaDB [mysql]> DROP USER ''@'localhost'; #刪除空用戶 MariaDB [mysql]> DROP USER 'USERNAME'@'HOST
ariaDB [mysql]> SET PASSWORD FOR 'user'@'host' = PASSWORD(‘password'); MariaDB [mysql]> UPDATE mysql.user SET password=PASSWORD('password') WHERE clause; MariaDB [mysql]> FLUSH PRIVILEGES; ]# mysqladmin -u root –poldpass password 'newpass'
]#systemctl stop mariadb ]#vim /etc/my.cnf [mysqld] --skip-grant-tables ]#systemctl restart mariadb ]#mysql MariaDB [mysql]> update user set password=password('centos7') where user='root' ; ]sed -i 's/--skip-grant-tables//' /etc/my.cnf #刪除剛添加的那行 ]#systemctl restart mariadb ]#mysql -pcentos7
MariaDB[hellodb]> grant all on hellodb.* to hong@'192.168.1.%'; MariaDB[hellodb]> grant select,insert on hellodb.* to mage@'%' identified by 'centos'; MariaDB[hellodb]> show grants for mage@'%'; MariaDB[hellodb]> show grants for li@'192.1636.1.%'; MariaDB[hellodb]> REVOKE SELECT ON hellodb.* FROM 'mage'@'%; MariaDB[hellodb]> FLUSH PRIVILEGES;
注意:MariaDB服務進程啓動時會讀取mysql庫中全部受權表至內存 GRANT或REVOKE等執行權限操做會保存於系統表中,MariaDB的服務進 程一般會自動重讀受權表,使之生效 對於不可以或不能及時重讀受權表的命令,可手動讓MariaDB的服務進程 重讀受權表:MariaDB[hellodb]> FLUSH PRIVILEGES;