Mysql数据库基础

2019-03-18  本文已影响0人  E_1fe7

Mysql数据库基础

添加用户

root@host#   mysql -u root -p 
Enter password: ******
mysql> use mysql;
Database changed

mysql> INSERT INTO user (host, user, password, select_priv, insert_priv, updata_priv) 
VALUES('localhost', 'guest',  PASSWORD('guest123'), 'Y', 'Y', 'Y');

Query OK, 1 row affected (0.20 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 1 row affected (0.01 sec)

tip:在 MySQL5.7 中 user 表的 password 已换成了authentication_string。
tip:password() 加密函数已经在 8.0.11 中移除了,可以使用 MD5() 函数代替。
tip:在注意需要执行 FLUSH PRIVILEGES 语句。 这个命令执行后会重新载入授权表。

root@host# mysql -u root -p
Enter password:*******
mysql> use mysql;
Database changed

mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
    -> ON TUTORIALS.*
    -> TO 'zara'@'localhost'
    -> IDENTIFIED BY 'zara123';

连接

<?php
$dbhost = 'localhost:3306';  // mysql服务器主机地址
$dbuser = 'root';            // mysql用户名
$dbpass = '123456';          // mysql用户名密码
$conn = mysqli_connect($dbhost, $dbuser, $dbpass);
if(! $conn )
{
    die('Could not connect: ' . mysqli_error());
}
echo '数据库连接成功!';
mysqli_close($conn);
?>

数据类型

数值类型
类型 大小(字节) 用途
TINYINT 1 小整数值
SMALLINT 2 大整数值
MEDIUMINT 3 大整数值
INT 4 大整数值
BIGINT 8 极大整数值
FLOAT 4 单精度浮点数值
DOUBLE 8 双精度浮点数值

字符串类型
类型 大小(字节) 用途
CHAR 0-255字节 定长字符串
VARCHAR 0-65535 字节 变长字符串
TINYBLOB 0-255字节 不超过 255 个字符的二进制字符串
TINYTEXT 0-255字节 短文本字符
BLOB 0-65535字节 二进制形式的长文本数据
TEXT 0-65 535字节 长文本数据

tip:详情


基本语法



表内数据

MYSQL进阶

排序

  1. 描述
    通过SELECT获取的数据再使用ORDER BY将数据按照某一字段排序

  2. 语法
    SELECT field1,... FROM table_name ORDER BY field,... [ASC [DESC]];

    • 你可以设定多个字段来排序。
    • 使用 ASC 或 DESC 关键字来设置查询结果是按升序或降序排列。 默 认情况下,它是按升序排列。
    • 添加 WHERE...LIKE 子句来设置条件。

分组

  1. 描述
    GROUP BY 语句根据一个或多个对结果集进行分组。在分组的列上我们可以使用 COUNT, SUM, AVG,等函数。

  2. 语法
    SELECT column_name, function(column_name) FROM table_name WHERE column_name operator value GROUP BY column_name;

    • function(column_name)可以类比COUNT()。*
  3. 示例

mysql> SELECT name, COUNT(*) FROM   employee_tbl GROUP BY name;
+--------+----------+
| name   | COUNT(*) |
+--------+----------+
| 小丽 |        1 |
| 小明 |        3 |
| 小王 |        2 |
+--------+----------+
3 rows in set (0.01 sec)

tip:使用SELECT field_name FROM table_name GROUP BY field_name ;去重数据


连接的使用(重要)

  1. 描述(过于复杂,详情请见菜鸟教程
    通过JOIN来联合对表格进行删、改、查

    • INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录。
    • LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录。
    • RIGHT JOIN(右连接): 与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录。
  2. 示例
    SELECT a.id, a.author, b.title FROM table1 a INNER JOIN table2 b WHERE a.author = b.author;


NULL

  1. 描述
    在 MySQL 中,NULL 值与任何其它值的比较(即使是 NULL)永远返回 false,即 NULL = NULL 返回false 。
    因此使用一下三个方法来判断是否为NULL
    • IS NULL: 当列的值是 NULL,此运算符返回 true。
    • IS NOT NULL: 当列的值不为 NULL, 运算符返回 true。
    • <=>: 比较操作符(不同于=运算符),当比较的的两个值为 NULL 时返回 true。
      错误示例:

SELECT * FROM runoob_test_tbl WHERE runoob_count = NULL;
SELECT * FROM runoob_test_tbl WHERE runoob_count != NULL;
正确示例
SELECT * FROM runoob_test_tbl WHERE runoob_count IS NULL;
SELECT * FROM runoob_test_tbl WHERE runoob_count IS NOT NULL;


正则表达式(REGEXP )

  1. 描述
    通过正则表达式模糊查询,功能比LIKE更加丰富。详情

  2. 示例

    • 查找name字段中以‘gdl’开头的所有数据:
      SELECT name FROM table_name WHERE name REGEXP '^gdl';

    • 查找name字段中以‘gdl’结尾的所有数据:
      SELECT name FROM table_name WHERE name REGEXP 'gdl$';

    • 查找name字段中包含‘gdl’的所有数据:
      SELECT name FROM table_name WHERE name REGEXP 'gdl';


MYSQL高级

事务

多条语句全部执行,保证原子性,不然就回滚事务。

  1. 特点
  1. 语法

ALTER命令

对数据表结构进行操作(如修改表名、增加字段)

  1. 语法

-修改字段默认值
ALTER TABLE table_name ALTER field_name SET DEFAULT 1000;
ALTER TABLE table_name ALTER field_name SET DROP DEFAULT;

-修改引擎和表名
ALTER TABLE table_name ENGINE=MYISAM;
ALTER TABLE table_name RENAME TO new_table_name;


索引

索引是一张表,保存了主键与索引,可以高效查询实例数据。在使用INSERT、UPDATE、DELETE会更新索引表,因此更新速度变慢,同时占用磁盘。


复制表

CREATE TABLE targetTable LIKE sourceTable;
INSERT INTO targetTable SELECT * FROM sourceTable;


序列使用

使用AUTO_INCREMENT来定义
ALTER TABLE table_name AUTO_INCERMENT = 100;


重复数据的处理

表格中设置了PRIMARY KEY与UNIQUE是不会出现重复数据的。

  1. 语法

    • 统计重复数据
      SELECT COUNT(*) AS repetitions, last_name, first_name FROM table_name GROUP BY last_name, first_name HAVING repetitions>1;
    • 过滤重复信息
      SELECT DISTINCT last_name, first_name FROM table_name;
      SLECT last_name,first_name FROM table_name GROUP BY (last_name,first_name);
    • 删除重复信息
        CREATE TABLE tmp SELECT last_name, first_name, sex FROM person_tbl  GROUP BY (last_name, first_name, sex);
        DROP TABLE person_tbl;
        ALTER TABLE tmp RENAME TO person_tbl;
    

    ALTER IGNORE TABLE table_name ADD PRIMARY KEY (last_name, first_name);


导出/导入数据

  1. 基本方法

    • SELECT ... INTO OUTFILE
           SELECT * form table_name 
           INTO OUTFILE "temp/table.sql"
           FIELDS TERMINATED BY ',' OPTIONALLY BY ' " '
           LINES TERMINATED BY '\n';
    
    • LOAD DATA INFILE
            LOAD DATA INFILE "temp/table.sql" INTO TABLE table_name;
    

tips:在写出的时候会出现The MySQL server is running with the --secure-file-priv option so it cannot execute this statement的错误解决方法
出现这个错误是因为没有给数据库指定写出文件的路径或者写出的路径有问题。首先使用下面的命令 show variables like '%secure%'; 查看数据库的存储路径。如果查出的 secure_file_priv 是 null 的时候就证明在 my.ini 文件里面没有配置写出路径。这时候就可以在 mysql.ini 文件的 [mysqld] 代码下增加 secure_file_priv=E:/TEST 再重启 mysql 就可以了。

  1. 使用mydump
    • 导出SQL格式数据
      mysqldump -u root -p database_name > database.sql
      mysqldump -u root -p --all-databases > database_all.sql
      mysqldump -u root -p database_name table_name > table.sql

    • 导入sql格式数据
      mysqldump -u root -p database_name < database.sql
      mysqldump -u root -p database_name table_name < table.sql

    • 将指定主机的数据库拷贝到本地
      mysqldump -h gdl.com -P 3306 -u root -p database_name > database.sql


内置函数

上一篇下一篇

猜你喜欢

热点阅读