zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

Ubuntu 安装 mysql、sqlite3、postgresql

2023-09-11 14:13:58 时间

NAVICAT 官网:http://www.navicat.com.cn/products

NAVICAT16 PREMIUM NAVICAT16 :http://zzzzzz.me/post-73329.html

Xmanager :https://www.xshellcn.com/

1、Ubuntu 安装 mysql

ubuntu上安装MySQL非常简单只需要几条命令就可以完成。

  • 1. sudo apt-get install mysql-server 
  • 2. sudo apt-get isntall mysql-client
  • 3. sudo apt-get install libmysqlclient-dev

安装过程中会提示设置密码什么的,注意设置了不要忘了,

安装完成之后可以使用如下命令来检查是否安装成功:sudo netstat -tap | grep mysql

通过上述命令检查之后,如果看到有 mysql 的 socket 处于 listen 状态则表示安装成功。

登陆 mysql 数据库可以通过如下命令:mysql -u root -p

-u 表示选择登陆的用户名, -p 表示登陆的用户密码。默认没有 密码

  • show databases;    查看当前的数据库。
  • use mysql;        切换到 mysql 数据库
  • show tables;         显示当前数据库的表单

首先查看当前用户信息:

忘记密码时置空密码

1,配置文件 ( mysqld.cnf ) 添加 skip-grant-tables 重启 mysql 后免密登陆进入mysql

2,查看当前认证方式以及用户,默认是 caching_sha2_password 认证,
    select host, user, authentication_string, plugin from user;

3,如果 2 是默认认证方式,则修改为密码认证为 mysql_native_password
    修改方法:配置文件添加 default_authentication_plugin=mysql_native_password
    再次重启 mysqld,免密登陆

4,清空 root 密码 ( 要先清空,再修改,要不报错)
        update user set authentication_string='' where user='root';
        flush privileges;

5,退出 mysql, 删除添加的 skip-grant-tables 再次重启 mysql,即可以免密码登录
        mysql -u root -p

6. 登陆后即可修改密码了:
        alter user 'root'@'%' identified with mysql_native_password by 'root';
        flush privileges;

修改 root 密码

alter user 'root'@'localhost' identified with mysql_native_password by '123456';
# root 是用户名,123456 是密码
flush privileges;
quit; 

配置远程访问

在 MySQL8 中如何正确的配置远程访问用户,与 MySQL5.7 不同之处!

如果你只是想要把 root 用户允许远程访问,登录 mysql 后,直接执行以下命令,以下远程授权适用于MySQL8也适用于MySQL5.7。

mysql -uroot -p
mysql> use mysql;
mysql> update user set host = '%' where user ='root';
mysql> flush privileges;
mysql> exit

在MySQL5.7版本使用grant来进行用户授权

例:创建一个whsir用户,允许所有IP访问,密码是password:

mysql> GRANT ALL PRIVILEGES ON *.* TO 'whsir'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION;

但是从 MySQL8 版本开始,不能再使用 GRANT 创建用户,而是要先 CREATE USER,然后使用GRANT 授权。上面的例子在 MySQL8 中的写法:

mysql> CREATE USER 'whsir'@'%' IDENTIFIED BY 'password';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
mysql> FLUSH PRIVILEGES;

附:查看用户相关信息

mysql> use mysql;
mysql> select host,user,plugin from user;

总命令:

UPDATE mysql.user SET host='%' WHERE user='root';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%';
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'ThePassword';
FLUSH PRIVILEGES;

写一个简单的程序来访问该数据库,实现 show tables 功能:

#include <mysql/mysql.h>
#include <stdio.h>
#include <stdlib.h>
int main() 
{
    MYSQL *conn;
    MYSQL_RES *res;
    MYSQL_ROW row;
    char server[] = "localhost";
    char user[] = "root";
    char password[] = "mima";
    char database[] = "mysql";
    
    conn = mysql_init(NULL);
    
    if (!mysql_real_connect(conn, server,user, password, database, 0, NULL, 0)) 
    {
        fprintf(stderr, "%s\n", mysql_error(conn));
        exit(1);
    }
    
    if (mysql_query(conn, "show tables")) 
    {
        fprintf(stderr, "%s\n", mysql_error(conn));
        exit(1);
    }
    
    res = mysql_use_result(conn);
    
    printf("MySQL Tables in mysql database:\n");
    
    while ((row = mysql_fetch_row(res)) != NULL)
    {
        printf("%s \n", row[0]);
    }
    
    mysql_free_result(res);
    mysql_close(conn);
    
    printf("finish! \n");
    return 0;
}

编译代码,并链接 mysql 的库,:g++ -Wall mysql_test.cpp -o mysql_test -lmsqlclient

然后运行编译好的代码:

可见结果和使用 SQL语句 show tables 是一样的。

2、Ubuntu 安装 sqlite3

ubuntu 下安装 sqlite3 直接在终端运行命令:#apt-get install sqlite3

查看版本信息:# sqlite3 -version

sqlite>.quit        退出 sqlite
sqlite>.exit        退出 sqlite
sqlite>.show        列出当前显示格式的配置
sqlite>.schema      显示数据库结构
sqlite>insert into "db_table" values(1, 'one', 11);
sqlite>insert into "db_table" values(1, 'two', 22);
sqlite>insert into "db_table" values(1, 'three', 33);
sqlite>.dump db_table    # 设置导出目标
sqlite>.mode column
sqlite>.separator ~~     # 自定义分隔符为 ~~ 
sqlite>.header on        # 显示标题栏
sqlite>.header off       # 不显示标题栏

创建、打开  数据库

创建一个新的数据库:sqlite3 文件名
创建一个test.db数据库文件,打开控制台窗口,命令如下:

创建一个数据库和打开一个已经存在的数据库命令是一模一样的,如果存在,则打开。

创建 表

create table table_name(field type1,fieldtype1,….);
table_name 是要创建数据表的名称,field x上是数据库表内字段名字,typex则是字段类型。
如:该语句创建一个记录学生信息的数据表

sql 的指令格式:所有 sql 指令都是以分号(;)结尾,两个减号(--)则表示注释

添加 数据

insert into table_name(列 field1,field2,….)values(值val1,val2,….);
val x为需要存入字段的值。
例如,往老师信息表添加数据:

很简单,创建了一个 Teachers 表并向添加了四条数据,设定了一些约束,其中有自动增加的主键、默认值等等。

修改 数据

UPDATE 表 SET 列 = ‘新值’ 【WHERE 条件语句】
UPDATE语句用来更新表中的某个列,如果不设定条件,则所有记录的这一列都被更新;如果设定了条件,则符合条件的这一列被更新,WHERE子句被用来设定条件,如下例:

删除 数据

DELETE FROM 表 【WHERE条件语句】
如果设定WHERE条件子句,则删除符合条件的数据记录;如果没有设定条件语句,则删除所有记录。

导入 数据:

.read 数据文件
打开记事本,并将下列SQL语句复制到记事本中,保存为test.sql
然后在命令行环境中输入 .read test.sql

BEGIN TRANSACTION;
CREATE TABLE Cars(Id integer PRIMARY KEY, Name text, Cost integer);
INSERT INTO Cars VALUES(1,'Audi',52642);
INSERT INTO Cars VALUES(2,'Mercedes',57127);
INSERT INTO Cars VALUES(3,'Skoda',9000);
INSERT INTO Cars VALUES(4,'Volvo',29000);
INSERT INTO Cars VALUES(5,'Bentley',350000);
INSERT INTO Cars VALUES(6,'Citroen',21000);
INSERT INTO Cars VALUES(7,'Hummer',41400);
INSERT INTO Cars VALUES(8,'Volkswagen',21600);
COMMIT;
BEGIN TRANSACTION;
CREATE TABLE Orders(Id integer PRIMARY KEY,
OrderPrice integer CHECK(OrderPrice>0),Customer text);
INSERT INTO Orders(OrderPrice, Customer) VALUES(1200, "Williamson");
INSERT INTO Orders(OrderPrice, Customer) VALUES(200, "Robertson");
INSERT INTO Orders(OrderPrice, Customer) VALUES(40, "Robertson");
INSERT INTO Orders(OrderPrice, Customer) VALUES(1640, "Smith");
INSERT INTO Orders(OrderPrice, Customer) VALUES(100, "Robertson");
INSERT INTO Orders(OrderPrice, Customer) VALUES(50, "Williamson");
INSERT INTO Orders(OrderPrice, Customer) VALUES(150, "Smith");
INSERT INTO Orders(OrderPrice, Customer) VALUES(250, "Smith");
INSERT INTO Orders(OrderPrice, Customer) VALUES(840, "Brown");
INSERT INTO Orders(OrderPrice, Customer) VALUES(440, "Black");
INSERT INTO Orders(OrderPrice, Customer) VALUES(20, "Brown");
COMMIT;

查询 数据

select * from table_name;
select * from table_name limit 10;
select * from table_name order by field asc;    --升序
select * from table order by field desc;        --降序
select * from table_name where field in(‘val1’,’val2’,’val3’);
select * from table_name where fieldbetween val1 and val2;
select count(*) from table_name;
select distinct field from table_name;          --去重
SELECT 列 AS 别名,列 A S别名 FROM table_name   --列的别名

LIKE ( 模糊查询 )

LIKE 用通配符匹配字符串
下划线_ 匹配一个字符串
百分号% 匹配多个字符串
LIKE匹配字符串时不区分大小写

GROUP BY ( 分组 )

建立 索引

当说数据表存在大量记录,索引有助于加快查找数据表速度。
create index index_name on table_name(field);

示例:对学生表 stu_no字段,建立一个索引

命令:create index student_index on student_table(stu_no);

建立完成后,sqlite3 在对该字段查询时,会自动使用该索引。

删除表、删除索引

drop table table_name;   --删除表

drop index index_name;    删除索引

sqlite3 存储数据的类型

NULL: 标识一个NULL值
INTEGER: 整数类型
REAL: 浮点数
TEXT: 字符串
BLOB: 二进制数

sqlite3 存储数据的约束条件

Sqlite常用约束条件如下:

PRIMARY KEY -主键
1) 主键的值必须唯一,用于标识每一条记录,如学生的学号
2) 主键同时也是一个索引,通过主键查找记录速度较快
3) 主键如果是整数类型,该列的值可以自动增长

NOT NULL – 非空
约束列记录不能为空,否则报错

UNIQUE – 唯一:
除主键外,约束其它列的数据的值唯一

CHECK – 条件检查:
约束该列的值必须符合条件才可存入

DEFAULT – 默认值:
列数据中的值基本都是一样的,这样的字段列可设为默认值

CREATE TABLE Orders(Id integer PRIMARY KEY, OrderPrice integer CHECK(OrderPrice>0), Customer text);
CREATE TABLE Friends(Id integer PRIMARY KEY, Name text UNIQUE NOT NULL,Sex text CHECK(Sex IN ('M', 'F')));
CREATE TABLE IF NOT EXISTS Reservations(Id integer PRIMARY KEY, CustomerId integer, Day text);
INSERT INTO Reservations(CustomerId, Day) VALUES(1, '2009-22-11');
CREATE TABLE Books(Id integer PRIMARY KEY, Title text, Author text, Isbn text default 'not available');

插入 列

ALTER TABLE table-name

ADD COLUMN column-name column-type;

3、安装 postgresql 

官网:https://www.postgresql.org/

PostgreSQL中文社区:http://postgres.cn/index.php/home

中文文档:http://www.postgres.cn/v2/document

元命令:在 psql 中以 "反斜杠" 开头的内容都是 "  psql 元命令 ",也叫做 " 反斜杠命令 "。元命令由 psql 自身进行处理。元命令格式为:反斜杠后跟参数,

比如:\copy 命令 即为元命令,语法格式为:\command [options]

  • 元命令选项 之间可以有一个或者多个空格隔开,
  • 如果可选参数中包含了空格,可以用单引号将其引起来,
  • 如果是转义字符如: \n(换行),\t(制表符),\b(退格键),\r(回车),\f(换页),\digits(八进制)和\ xdigits(十六进制)都可以使用单引号引起来。

部分元命令以 SQL 标识符 ( 如表名,函数,序列等 ) 作为参数,这些参数需遵循 SQL 语法规则:

  • 不带引号的字母将被强制小写,
  • 双引号之间的字母不进行大小写转换,并允许在标识符中包含空格。
  • 在双引号中,成对的双引号会当成单引号使用。

psql 提供了丰富的元命令,如查看数据库对象定义,数据库对象空间大小,导入导出等元命令,以便于DBA或者开发人员能够方便的管理和维护数据库。

双引号 通常用于 表名、列名

单引号 用于 值

安装

首先,安装PostgreSQL客户端。

sudo apt-get install postgresql-client

然后,安装 PostgreSQL 服务器。

第一步:安装。命令:sudo apt-get install postgresql -y

第二步:安装完成后,系统会自动创建一个空密码的 Linux 用户 postgres,
        cat /etc/passwd | grep post
        sudo passwd postgres      // 设置 postgres 用户的密码,也可以不设置。

第三步:连接数据库
        systemctl start postgresql  // 启动 postgresql 服务
        su - postgres               // 切换到 postgres 用户
        psql postgres               

第四步:查看帮助
        postgres=# help

如果在 root 用户下执行 psql 时,会报错。报错如下:可以看到我 Linux 中的 root 用户和 king 用户 在 psql 中角色都不存在

在 PostgreSQL 里没有区分用户和角色的概念,"CREATE USER" 为 "CREATE ROLE" 的别名,这两个命令几乎是完全相同的,唯一的区别是 "CREATE USER" 命令创建的用户默认带有 LOGIN属性,而 "CREATE ROLE" 命令创建的用户默认不带 LOGIN 属性。

现在在 postgresql 中创建一个名为 root 的角色( Postgresql 的超级用户是 postgres):

( ******* 注意:语句后面的分号  ; 不能省略 ********** )

在 postgresql 中创建一个名为 root 的角色即可(切换到 postgres 用户):
postgres@debian:~$ createuser root 
postgres@debian:~$ psql
psql (9.3.3)
Type "help" for help.

postgres=# \du

创建角色 king 并赋予其CREATEDB 的权限。 
postgres=# CREATE ROLE king CREATEDB ; 
postgres=# \du 

创建角色并赋予多个属性时属性之间要用空格:
postgres=# create role king CREATEDB  superuser Createrole Replication login;    
postgres=# \du  //要添加的属性一般要包括如下。

直接将postgres所有权限都给root后,仍报错
google后,由于create role时不为用户赋予login权限,赋予login权限即可
postgres=# alter user root login;  

正常情况下,安装完成后,PostgreSQL 服务器会自动在本机的 5432 端口开启。如果还想安装图形管理界面,可以运行下面命令。( pgadmin3 是一个设计,维护和管理 Postgres 数据库用的通用工具)

sudo apt-get install pgadmin3

连接不成功要注意的地方:注意服务器的防火墙规则、修改服务器连接监听 ( postgersql.conf 配置文件 )、修改连接认真方式 ( pg_hba.conf 配置文件 )。

添加 用户、添加 数据库

PostgreSQL 安装后,默认生成一个名为 postgres 的数据库 和 一个名为 postgres 的数据库用户。这里需要注意的是,同时还生成了一个名为 postgres 的 Linux 系统用户,并且属于 postgres 用户组(可以 su - postgres ,然后执行 groups 命令,可以看到 属于 postgres 组)。

下面,我们使用 postgres 用户,来生成其他用户和新数据库。好几种方法可以达到这个目的,

这里介绍两种。

  • 方法 1:进入psql 环境,使用 PostgreSQL 控制台,然后再连接数据库。
  • 方法 2:在系统 shell 下执行 psql 命令。

下面分别给出实例:

第一种方法,使用 PostgreSQL 控制台。

首先,新建一个Linux新用户,可以取你想要的名字,这里为dbuser。命令:sudo adduser dbuser
然后,切换到postgres用户。命令:sudo su - postgres
下一步,使用psql命令登录PostgreSQL控制台。命令:psql
这时相当于系统用户postgres以同名数据库用户的身份,登录数据库,这时不用输入密码(默认创建的 postgres 用户没有密码)
如果一切正常,系统提示符会变为"postgres=#",表示这时已经进入了数据库控制台。以下的命令都在控制台内完成。

第一件事:使用\password命令,为postgres用户设置一个密码。
          命令:\password postgres
第二件事:创建数据库用户dbuser(刚才创建的是Linux系统用户),并设置密码。
          命令:CREATE USER dbuser WITH PASSWORD 'password';
第三件事:创建用户数据库,这里为exampledb,并指定所有者为dbuser。
          命令:CREATE DATABASE exampledb OWNER dbuser;
第四件事:将exampledb数据库的所有权限都赋予dbuser,否则dbuser只能登录控制台,没有任何数据库操作权限。
          命令:GRANT ALL PRIVILEGES ON DATABASE exampledb to dbuser;
最后,使用\q命令退出控制台(也可以直接按ctrl+D)。命令:\q

第二种方法,使用shell命令行。

添加新用户和新数据库,除了在PostgreSQL控制台内,还可以在shell命令行下完成。这是因为PostgreSQL提供了命令行程序createuser和createdb。
还是以新建用户dbuser和数据库exampledb为例。
首先,创建数据库用户dbuser,并指定其为超级用户。命令:sudo -u postgres createuser --superuser dbuser
然后,登录数据库控制台,设置dbuser用户的密码,完成后退出控制台。
sudo -u postgres psql
\password dbuser
\q
接着,在shell命令行下,创建数据库exampledb,并指定所有者为dbuser。命令:sudo -u postgres createdb -O dbuser exampledb

修改用户 postgres 的密码

sudo -u postgres psql
ALTER USER postgres WITH PASSWORD 'postgres'

登录 数据库

添加新用户和新数据库以后,就要以新用户的名义登录数据库,这时使用的是psql命令。
psql -U dbuser -d exampledb -h 127.0.0.1 -p 5432
上面命令的参数含义如下:-U指定用户,-d指定数据库,-h指定服务器,-p指定端口。
输入上面命令以后,系统会提示输入dbuser用户的密码。输入正确,就可以登录控制台了。
psql命令存在简写形式。如果当前Linux系统用户,同时也是PostgreSQL用户,则可以省略用户名(-U参数的部分)。
举例来说,我的Linux系统用户名为ruanyf,且PostgreSQL数据库存在同名用户,则我以ruanyf身份登录Linux系统后,可以直接使用下面的命令登录数据库,且不需要密码。
psql exampledb
此时,如果PostgreSQL内部还存在与当前系统用户同名的数据库,则连数据库名都可以省略。比如,假定存在一个叫做ruanyf的数据库,则直接键入psql就可以登录该数据库。
psql
另外,如果要恢复外部数据,可以使用下面的命令。
psql exampledb < exampledb.sql

控制台命令

 除了前面已经用到的\password命令(设置密码)和\q命令(退出)以外,控制台还提供一系列其他命令。

\h:查看SQL命令的解释,比如\h select。
\?:查看psql命令列表。
\l:列出所有数据库。
\c [database_name]:连接其他数据库。
\d:列出当前数据库的所有表格。
\d [table_name]:列出某一张表格的结构。
\du:列出所有用户。
\e:打开文本编辑器。
\conninfo:列出当前数据库和连接的信息。

常用命令

(1)列出所有的数据库
    mysql: show databases
    psql: \l或\list
(2)切换数据库
    mysql: use dbname
    psql: \c dbname
(3)列出当前数据库下的数据表
    mysql: show tables
    psql: \dt     或者 \d
(4)列出指定表的所有字段
    mysql: show columns from table name
    psql: \d tablename
(5)查看指定表的基本情况
    mysql: describe tablename
    psql: \dt tablename    或者 \d 表名
(6)退出登录
    mysql: quit 或者\q
    psql:\q

查看某个库中某个表的记录:select * from apps limit 1;
显示字符集:\encoding

配置postgresql

[root@rudder data]# mkdir -p /var/lib/pgsql/data      //创建pgsql的数据库目录  
[root@rudder pgsql]# cd /var/lib/pgsql  
[root@rudder pgsql]# chown postgres.postgres data     //改变目录的所属用户用组  
[root@rudder pgsql]# su  postgres                     //切换到postgres,不然初始化不了  
bash-3.2$ initdb -E UTF-8 -D /var/lib/pgsql/data --locale=en_US.UTF-8 -U postgres -W   //初始化数据库  
The files belonging to this database system will be owned by user "postgres".  
This user must also own the server process.  
  
The database cluster will be initialized with locale en_US.UTF-8.  
  
fixing permissions on existing directory /var/lib/pgsql/data ... ok  
creating directory /var/lib/pgsql/data/global ... ok  
creating directory /var/lib/pgsql/data/pg_xlog ... ok  
creating directory /var/lib/pgsql/data/pg_xlog/archive_status ... ok  
creating directory /var/lib/pgsql/data/pg_clog ... ok  
creating directory /var/lib/pgsql/data/pg_subtrans ... ok  
creating directory /var/lib/pgsql/data/pg_twophase ... ok  
creating directory /var/lib/pgsql/data/pg_multixact/members ... ok  
creating directory /var/lib/pgsql/data/pg_multixact/offsets ... ok  
creating directory /var/lib/pgsql/data/base ... ok  
creating directory /var/lib/pgsql/data/base/1 ... ok  
creating directory /var/lib/pgsql/data/pg_tblspc ... ok  
selecting default max_connections ... 100  
selecting default shared_buffers ... 1000  
creating configuration files ... ok  
creating template1 database in /var/lib/pgsql/data/base/1 ... ok  
initializing pg_authid ... ok  
Enter new superuser password:     //超级管理员密码  
Enter it again:                   //确认密码  
initdb: removing contents of data directory "/var/lib/pgsql/data"  

这样就初始化就好了。
修改/var/lib/pgsql/data/postgresql.conf

listen_addresses = '*'     //监听所有ip的连接,默认是本机  
port = 5432             //这个不开也行,默认就是5432端口

pgsql是命令行的管理工具,但是开发时肯定要用pgadmin远程连接。所以权限是要放大,listen_addresses = '*' 全部放开,当然也可以,设置局域网的IP段。
修改/var/lib/pgsql/data/pg_hba.conf

# TYPE  DATABASE    USER        CIDR-ADDRESS          METHOD  
# "local" is for Unix domain socket connections only  
 local   all         all                               trust  
# IPv4 local connections:  
 host    all         all         127.0.0.1/32          md5  
 host    all         all         0.0.0.0/0             md5   //这一行我加的,所有IP和用户,密码对都可以连接  
# IPv6 local connections:  
 host    all         all         ::1/128               md5 

启动并查看

[root@rudder data]# /etc/init.d/postgresql start   //启动  
Initializing database: [  OK  ]  
Starting postgresql service: [  OK  ]  
  
[root@rudder data]# netstat -tpnl |grep 5432       //查看  
tcp        0      0 127.0.0.1:5432              0.0.0.0:*                   LISTEN      27806/postmaster

用postgres用户登录,并改密码

[root@rudder data]# su postgres  //切换用户  
bash-3.2$ psql -U postgres    //连接pgsql server  
Welcome to psql 8.1.23, the PostgreSQL interactive terminal.  
  
Type:  \copyright for distribution terms  
       \h for help with SQL commands  
       \? for help with psql commands  
       \g or terminate with semicolon to execute query  
       \q to quit  
  
postgres=# Alter USER postgres WITH PASSWORD '***密码**';  //添加密码  
ALTER ROLE        //出现这个才算成功,第一次操作没成功,pgadmin连不上  
postgres-# \q     //退出 

数据库操作

 基本的数据库操作,就是使用一般的SQL语言。

# 创建新表 
    CREATE TABLE user_tbl(name VARCHAR(20), signup_date DATE);
# 插入数据 
    INSERT INTO user_tbl(name, signup_date) VALUES('张三', '2013-12-22');
# 选择记录 
    SELECT * FROM user_tbl;
# 更新数据 
    UPDATE user_tbl set name = '李四' WHERE name = '张三';
# 删除记录 
    DELETE FROM user_tbl WHERE name = '李四' ;
# 添加栏位 
    ALTER TABLE user_tbl ADD email VARCHAR(40);
# 更新结构 
    ALTER TABLE user_tbl ALTER COLUMN signup_date SET NOT NULL;
# 更名栏位 
    ALTER TABLE user_tbl RENAME COLUMN signup_date TO signup;
# 删除栏位 
    ALTER TABLE user_tbl DROP COLUMN email;
# 表格更名 
    ALTER TABLE user_tbl RENAME TO backup_tbl;
# 删除表格 
    DROP TABLE IF EXISTS backup_tbl;