基本SQL语句

25 分钟阅读 903 字 + 3751 词
命令行使用MYSQL
安装:
bash
sudo apt update
sudo apt-get install mysql-server
如果出现密码错误
在最新的 Ubuntu 2204 版本上,安装 MySQL 时默认不会提示你设置 root 用户密码。这是因为 MySQL 在安装时默认使用 Unix socket 身份验证方式,这意味着只有系统的 root 用户或者通过 sudo 提权的用户才可以直接访问 MySQL 的 root 用户,而不需要密码。
解决方法
  1. 通过 sudo 提权访问 MySQL
    既然 MySQL 默认使用 Unix socket 身份验证方式,你可以通过 sudo 提权来访问 MySQL:
    bash
     sudo mysql -u root
    这将直接以 root 用户身份登陆 MySQL。
  2. 设置 MySQL root 用户密码
    要为 MySQL 的 root 用户设置一个密码,可以按照以下步骤进行:
    1. 使用 sudo 登陆 MySQL:
      bash
       sudo mysql -u root
    2. 在 MySQL Shell 中,运行以下命令来设置 root 用户密码(将 your_new_password 替换为你想要设置的密码):
      sql
       ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_new_password';
       FLUSH PRIVILEGES;
    3. 退出 MySQL:
      sql
       EXIT;
    4. 现在你可以使用 root 用户和设置的密码进行登录了:
      bash
       mysql -u root -p
  3. 创建新用户并赋予权限
    如果你不想以 root 用户身份使用 MySQL,可以创建一个新的 MySQL 用户并赋予其适当的权限。
    bash
     sudo mysql -u root
    然后在 MySQL Shell 中运行以下命令:
    sql
     CREATE USER 'newuser'@'localhost' IDENTIFIED BY 'user_password';
     GRANT ALL PRIVILEGES ON *.* TO 'newuser'@'localhost' WITH GRANT OPTION;
     FLUSH PRIVILEGES;
    现在你可以使用新创建的用户登录 MySQL:
    bash
     mysql -u newuser -p
总结
默认情况下,MySQL 在 Ubuntu 2204 上安装时使用 Unix socket 身份验证,这意味着你需要通过 sudo 提权来访问 MySQL。你可以通过 sudo mysql -u root 直接登录 MySQL,然后根据需要设置 root 用户密码或者创建新的 MySQL 用户。
SQL-Joins
mysql -u root -p 登录
SQL语句以;为结尾
sql
show databases; 展示所有的库

create database 库名; 创建库

use  库名; 使用库,使用任何操作table指令前先use

select database(); 展示当前的库

show tables; 展示当前库里的表

create table 表名(列名 类型 额外属性, ..., );  创建表

describe 表名; 查看表的具体属性信息

show create table 表名; 查看表的创建语句
mysql
insert into 表名 values(...,...,...,...); //插入新行,需要列出所有列

insert into 表名 (...,...,...,...)  values(...,...,...,...); //插入新行,只需部分列
sql
select * from 表名; 展示表的内容

#使用where子句对select按行筛选

select * from 表名 where 条件表达式; (等于: = ,不等于: <>)

#不能和Null值直接比较,需要使用is Null 或者 is not Null

#可以使用or 和 and组合条件

#展示部分列

select 列名,列名... from 表名;

select distinct 列名... from 表名; 可以按列去重

order by 列名 (desc), 列名 (asc);按序查表
#模糊匹配

like

#  % 任意字符串 - 任一字符串

where 列名 like '%y'
sql
聚集函数

count() max() min() avg()

分组聚集
select owner,count(*) from pet group by owner;
sql
多表配合 内连接 **inner join**

select * from pet inner join event on pet.name =event.name;
sql
update 更新数据

update 表名 set 列名 =新值 where 条件子句
sql
delete删除数据

delete from 表名 where 条件子句
sql
调整表的结构
alter table 表名 add 列名 类型;
alter table 表名  drop 列名;
alter table 表名  change 旧列名 新列名 类型;
sql
给表改名:
rename table 旧表名 to 新表名;

删除表
drop table 表名;
约束
满足实体完整性
主键(只能有一个),唯一键:不允许有两行在这一列取相同的值
在create table的时候在列名后面 加上 primary key
主键一般选取一个和业务无关的数据
业务上有实体完整性的要求,一般用唯一键 unique key
auto_increment 自增
mysql库
Mysql库安装
sudo apt install libmysqlclient-dev
会存在libmysqlclient.so和libmysqlclient.a两个库以及一些Mysql的头文件
Mysql库的数据结构
MYSQL -> 与服务端的连接
MYSQL_RES -> 服务端返回的结果 每一行的数组
MYSQL_ROW -> 每一行
MYSQL_FIELD -> 列
Mysql库的相关函数
c
MYSQL * mysql_init(MYSQL * mysql);//为MySQL连接分配资源,参数一般填NULL,数据结构MYSQL是操作资源的句柄

void mysql_close(MYSQL *mysql);
//关闭MYSQL连接

MYSQL *mysql_real_connect(MYSQL *mysql, const char * host, const char* user,const char* passwd,const char*db, unsigned int port, const char* unix_socket, unsigned long client_flag);
//mysql填mysql_init的返回值
//host 填 "localhost"
//root 填 "root"
//passwd 填 mysql用户密码
//db填 database的名字
//port 填0, unix_socket填 NULL,clientn_flag 填0

const  char* mysql_error(MYSQL *mysql);
//返回报错原因 
需要加上链接选项 -lmysqlclient
int mysql_query(MYSQL *mysql,const char *stmt_str);
//返回-1 为错误
MYSQL_RES * res = mysql_store_result(MYSQL *mysql);//在调用mysql_query和mysql_real_query之后再调用 
//MYSQL_RES是行的数组
MYSQL_ROW row = mysql_fetch_row(MYSQL_RES * result) 
mysql_num_rows(MYSQL_RES * result);//得到行数
mysql_num_fields(MYSQL_RES * result);//得到列数
注意事项:
读指令之后必须调用mysql_store_result
每个子线程启动之后先调用一次init和real_connect (放入临界区代码中)